Foros del Web » Programando para Internet » PHP » CodeIgniter »

Optimizar url en CoideIgniter

Estas en el tema de Optimizar url en CoideIgniter en el foro de CodeIgniter en Foros del Web. Hola buenas de nuevo, Me gustaría modificar las urls de codeigniter para hacer lo siguiente: Tengo un controlador "noticias", este controlador tiene una acción llamada ...
  #1 (permalink)  
Antiguo 05/07/2011, 01:55
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 5 meses
Puntos: 165
Optimizar url en CoideIgniter

Hola buenas de nuevo,

Me gustaría modificar las urls de codeigniter para hacer lo siguiente:

Tengo un controlador "noticias", este controlador tiene una acción llamada "detalle", al cual se le pasa el identificador de la noticia, pues bien, si este método se llama "detalle", la URL se quedaría:

misite.com/noticias/detalle/1 ( en el caso de ser la noticia 1) , y a mi me gustaría que quedara así:

misite.com/noticias/titulo-de-la-noticia

Imagino que en mi base de datos no se puede repetir ningún título, también se que tendré que usar url_title() para generar los links.

Un saludo y gracias!
  #2 (permalink)  
Antiguo 05/07/2011, 06:09
Avatar de 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 miktrv Ver Mensaje
misite.com/noticias/detalle/1 ( en el caso de ser la noticia 1) , y a mi me gustaría que quedara así:

misite.com/noticias/titulo-de-la-noticia

Imagino que en mi base de datos no se puede repetir ningún título, también se que tendré que usar url_title() para generar los links.

Un saludo y gracias!
Con lo del titulo ya te estas respondiendo, también vas a tener que usar routes para "quitar/ocultar" el metodo.

Saludos.
__________________
Drupal Argentina
  #3 (permalink)  
Antiguo 05/07/2011, 06:14
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Optimizar url en CoideIgniter

Hoola MIKTRV

Cita:
misite.com/noticias/titulo-de-la-noticia
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

Cita:
Imagino que en mi base de datos no se puede repetir ningún título,
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:


Cita:
CREATE TABLE IF NOT EXISTS `blog` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`post_title` varchar(100) NOT NULL,
`post_uri` varchar(100) NOT NULL,
`post_content` text NOT NULL,
`post_image` varchar(200) NOT NULL,
`post_keywords` varchar(200) NOT NULL,
`post_description` text NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `titulo` (`post_title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
Podes verlo funcionar aca
__________________
Salu2!

Última edición por Italico76; 05/07/2011 a las 06:25
  #4 (permalink)  
Antiguo 05/07/2011, 09:50
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Optimizar url en CoideIgniter

Cita:
$route['noticias/(.*)'] = 'noticias/detalle/$1';
Eso routea de noticias/detalle/algo a noticias/algo
__________________
Salu2!
  #5 (permalink)  
Antiguo 06/07/2011, 05:00
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 5 meses
Puntos: 165
Respuesta: Optimizar url en CoideIgniter

Muchas gracias por tu esfuerzo Italico76, probaré todo lo que me has comentado, pinta muy bien.

te debo una!

Un saludo!! :D
  #6 (permalink)  
Antiguo 06/07/2011, 05:35
Avatar de 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
  #7 (permalink)  
Antiguo 06/07/2011, 05:39
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 5 meses
Puntos: 165
Respuesta: Optimizar url en CoideIgniter

Yo uso HMVC

Un saludo!
  #8 (permalink)  
Antiguo 06/07/2011, 10:11
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Optimizar url en CoideIgniter

Cita:
Iniciado por NUCKLEAR Ver Mensaje
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.
BIEN Nucklear.......! ahora seria mucho pedir que me orienten (vos y/o miktrv) un poco de como seria con HMVC ?

Estube leyendo... [y ya lo instalé] pero no logro captar cual deberia ser mi "modulo" y si este seria el "widget" donde muestro el listado de posts........y en tal caso como se relaciona con las otras vistas.....o el template que tengo para todo el sitio.

Necesito mas ayuda amigos! y gracias desde yA!
__________________
Salu2!
  #9 (permalink)  
Antiguo 06/07/2011, 10:50
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 5 meses
Puntos: 165
Respuesta: Optimizar url en CoideIgniter

Hola buenas,

el tema de las vistas funciona igual, tu tan solo debes de crear dentro de tu módulo el directorio vistas y colocarlas aí, ten en cuenta que pueden estar directamente en el directorio views de la app.

Un saludo!
  #10 (permalink)  
Antiguo 06/07/2011, 11:14
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Optimizar url en CoideIgniter

Bueno, supongamos que creo el modulo Blog con su controller y su modelo ...

Como lo utilizo desde la app ? O sea que controller lo llama o desde donde se llama y como se lo llama (invoca) ?

Luego el modulo si llama a la vista cargando el template solo conocera los datos que maneja, entonces como relleno las otras variables del template ?

Gracias totales
__________________
Salu2!
  #11 (permalink)  
Antiguo 06/07/2011, 11:29
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 5 meses
Puntos: 165
Respuesta: Optimizar url en CoideIgniter

Lo llamarias asi:

www.tuapp.com/modulo/controller/action

Un saludo!
  #12 (permalink)  
Antiguo 06/07/2011, 11:43
Avatar de Italico76  
Fecha de Ingreso: abril-2007
Mensajes: 3.303
Antigüedad: 17 años, 8 meses
Puntos: 292
Respuesta: Optimizar url en CoideIgniter

Cita:
Iniciado por miktrv Ver Mensaje
Lo llamarias asi:

www.tuapp.com/modulo/controller/action

Un saludo!

GENIAL... muchas gracias miktrv vi que funciona......pero...

Cita:
Luego el modulo Blog si llama a la vista cargando el template solo conocera los datos que maneja, entonces como relleno las otras variables del template ?
__________________
Salu2!
  #13 (permalink)  
Antiguo 06/07/2011, 11:48
 
Fecha de Ingreso: julio-2008
Ubicación: Barcelona
Mensajes: 2.100
Antigüedad: 16 años, 5 meses
Puntos: 165
Respuesta: Optimizar url en CoideIgniter

No entiendo esa parte... no entiendo tu pregunta, especifica que son datos y que variables quieres decir.

Un saludo!!

Etiquetas: frameworks-y-php-orientado-a-objetos
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 11:23.