Ver Mensaje Individual
  #6 (permalink)  
Antiguo 06/07/2011, 05:35
Avatar de NUCKLEAR
NUCKLEAR
Moderador radioactivo
 
Fecha de Ingreso: octubre-2005
Ubicación: Cordoba-Argentina
Mensajes: 5.688
Antigüedad: 19 años, 1 mes
Puntos: 890
Respuesta: Optimizar url en CoideIgniter

Cita:
Iniciado por Italico76 Ver Mensaje
Hoola MIKTRV



Para pasar de noticias/detalle/1 a noticias/detalle/titulo-de-la-noticia todo lo que necesitas es pedir por el ultimo segmento de la URL ('titulo-de-la-noticia) en vez de pedir por el ID

Para que eliminar el /detalle/ o sea... ocultar el nombre de la accion (funcion)......eso lo haces mediante .htaccess



No lo imagines! utiliza un clave UNIQUE en tu DB y si el titulo se repite... al hacer el insert de la noticia al final agregale algo.. por ejemplo.. la fecha: titulo-de-la-noticia-2011-04-09

Aca lo que yo he hecho.....

Blog controller (tu 'noticias') llamado blog.php (en tu caso deberia ser noticias.php y cambiarle el nombre a la clase)

Código PHP:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/* Controller */
class blog extends CI_Controller {    

    private 
$data=array();
  
    function 
__construct()
    {        
        
parent::__construct();                        
                            
        
$this->load->library('Blog_lib');                            
        
$this->data['post_list'] = $this->blog_lib->get_last_entries(3);    
        
        
$this->output->cache(2);
    }
    
    public function 
index(){        
    }

    function 
post($uri){
       
$post_ay $this->blog_lib->get_entry_by_uri ($uri);          
                    
        
$this->data['content'] = $this->strings->format_post($post_ay);
                     
       
$this->load->view('vista'$this->data);    
    }
    
     
}

en /libraries uso esta biblioteca (Blog_lib.php) en vez de un modelo:

Código PHP:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/* Library  */
class Blog_lib {
   private 
$CI

   public function 
__construct(){
     
$this->CI =& get_instance();     
   }
   
   function 
get_last_entries($n=10)
    {                
      
$query $this->CI->db
            
->select('post_uri,post_title, post_content,post_image')
            ->
get('blog'$n);  
      return 
$query->result();        
    }
    
    function 
get_entry_by_uri ($uri){
        
      
$query $this->CI->db
            
->select('post_title, post_content,post_image,post_uri')
            ->
where('post_uri',$uri)->get('blog'1);
        
      
$post  $query->result(); 
              
     
      if ((
$post[0]->post_uri==$post[0]->post_content) AND (strpos($post[0]->post_content,'.html',0) !== false) ){
      
        
$post[0]->post_content file_get_contents(base_url()."application/rentabilizaweb/controllers/posts/{$uri}");
                
      }
     
      return 
$post;              
    }
    
    function 
get_entry_by_id ($id){
        
      
$query $this->CI->db
            
->select('post_title, post_content,post_image,post_uri')
            ->
where('id',$id)->get('blog'1);
        
      return 
$query->result(); 
    }  

// end class
(podras ver que el sistema carga tambien noticias guardadas como archivos con extension .html en controllers/posts)

En mi caso....formateo los posts... insertandoles una imagen......y lo hago asi:

en /libraries/ se llama Strings.php
Código PHP:
<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class 
Strings {   

  
// devuelve el primer parrafo
  
public function one_p($string) { 
    
$article explode("\n"$string); 
    
$parrafo $article[0]; 
    return( 
$parrafo );  
  } 
  
  public function 
format_post($post_ay){ 
    
    
$CI =& get_instance();     
  
    if (
strlen($post_ay[0]->post_image)>0){
      
$img img('application/rentabilizaweb/views/images/post_icons/'.$post_ay[0]->post_image).br(2);
    }else{
      
$img='';
    }      
  
    return 
heading($post_ay[0]->post_title,2).$img.$CI->typography->auto_typography($post_ay[0]->post_content);
  }

  
// end class
La tabla se llama ' blog' y es asi:




Podes verlo funcionar aca
Con Hmvc te hubieras ahorrado todo eso.
Con file_get_content corres el riesgo de que el server no lo tenga activo(no todos permiten esta funcion). Estas mezclando cosas de la vista en el controller, logica o modelos en una libreria! Se podria usar /hacer pero en otros contextos, no para mostrar post, mezclas los helpers que podrian ser utiles en toda la aplicacion.

Saludos.
__________________
Drupal Argentina