Foros del Web » Programando para Internet » PHP »

url amigables

Estas en el tema de url amigables en el foro de PHP en Foros del Web. Estimados quiero implementar url amigables en mi sitio. Esta es la url del link : midominio.com/ficha/detalle.php?id_alojamiento=1 y asi quiero que aparesca en el navegador y ...
  #1 (permalink)  
Antiguo 08/09/2009, 13:53
Avatar de jakuam  
Fecha de Ingreso: abril-2007
Mensajes: 354
Antigüedad: 17 años
Puntos: 0
url amigables

Estimados quiero implementar url amigables en mi sitio.
Esta es la url del link :

midominio.com/ficha/detalle.php?id_alojamiento=1

y asi quiero que aparesca en el navegador y los buscadores

www.midominio.com/hotel_grande.html o www.midominio.com/hotel_grande/ ..
me parece que hora esta mas claro..

donde hotel_grande es el nombre del mismo .. tambien puede ser el titulo.

no se si tengo que pasar el nombre por url o puedo hacerlo con .htaccess..

......
tambien estuve mirando y se puede hacer tambien al reves ?.. osea ..

poner un link o elnace .. mediante script .. del tipo www.midominio.com/hotel_grande.html y que lo enterprete mediante .htacces como midominio.com/ficha/detalle.php?id_alojamiento=1 .. verdad? ..

como debo hacerlo?..
__________________
Jakuam
Reserva Hoteles Online
Turismo San Rafael Mendoza
  #2 (permalink)  
Antiguo 08/09/2009, 15:40
Avatar de Pedro_valencia  
Fecha de Ingreso: diciembre-2007
Ubicación: Valencia
Mensajes: 82
Antigüedad: 16 años, 3 meses
Puntos: 6
Respuesta: url amigables

Lo primero en htaccess quedaría así:

www.midominio.com/hotel_grande/1/

o

www.midominio.com/1/hotel_grande/

o

www.midominio.com/1/hotel_grande.html

Etc..., pero creo que en todos los casos debería llevar el id de alojamiento en la url.

Código:
ReWriteRule ^([a-z0-9_-]+)/([0-9]+)/$ ficha/detalle.php?id_alojamiento=$2
__________________
Si te ha servido mi post, ¡dame Karma, es gratis!

- ¿Qué es el éxito? Lo diferente.
  #3 (permalink)  
Antiguo 09/09/2009, 07:35
Avatar de jakuam  
Fecha de Ingreso: abril-2007
Mensajes: 354
Antigüedad: 17 años
Puntos: 0
Respuesta: url amigables

y el SEGUNDO CASO??

poner un link o elnace .. mediante script .. del tipo www.midominio.com/hotel_grande.html y que lo enterprete mediante .htacces como midominio.com/ficha/detalle.php?id_alojamiento=1 ..

se puede?
__________________
Jakuam
Reserva Hoteles Online
Turismo San Rafael Mendoza
  #4 (permalink)  
Antiguo 12/09/2009, 06:22
Avatar de jakuam  
Fecha de Ingreso: abril-2007
Mensajes: 354
Antigüedad: 17 años
Puntos: 0
Respuesta: url amigables

che amigos alguien que me de una mano??
plz
__________________
Jakuam
Reserva Hoteles Online
Turismo San Rafael Mendoza
  #5 (permalink)  
Antiguo 12/09/2009, 07:20
Avatar de kike00  
Fecha de Ingreso: febrero-2005
Ubicación: El Salvador
Mensajes: 180
Antigüedad: 19 años, 2 meses
Puntos: 7
Respuesta: url amigables

Que hay acerca de usar el buscador del foro? :P
http://www.forosdelweb.com/f18/ayuda...gables-713203/
  #6 (permalink)  
Antiguo 12/09/2009, 08:21
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años
Puntos: 16
Respuesta: url amigables

hola que tal, esto lo utilizo para administrar url amigables desde php, lo que hago guardar todas las condiciones en una variable, la cual despues desgloso y las utilizo como parametros

.htacces
Cita:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php?params=$1 [QSA,L]
</IfModule>
el index es un archivo de intercambio que llama a la clase conector, la cual incluye las librerias necesarias para la visualizacion del site. En mi caso llamo a una clase desde el primer parametro (controlador) y el segundo es la funcion, si no se especifica funcion retorna la funcion index() del mismo. los parametros se pasan despues de la funcion. Por ejemplo misitio.com/hoteles/listar llamaria a la clase hoteles->listar(); en el caso de hacer misitio.com/hoteles/ver/id/1 llamaria a la clase hoteles->ver($id), igualmente te voy a dejar un ejemplo de un controlador

index.php
Código php:
Ver original
  1. <?php              
  2.  require 'librerias/conector.php';
  3.  conector::iniciar();
  4.  
  5.    
  6. ?>

librerias/conector.php
Código php:
Ver original
  1. <?php      
  2.  
  3.     class conector{
  4.        
  5.             function iniciar(){
  6.                 // definimos el directorio donde guardaremos los controladores
  7.                 if(!defined('CONTROLADOR_DIR')){
  8.                     define('CONTROLADOR_DIR','controladores');
  9.                 }
  10.                
  11.                 require 'librerias/config.php';
  12.                 require 'librerias/router.php'; // archivo que parse las url
  13.              
  14.                
  15.                
  16.  
  17.                     $_GET = getVariables($_GET['params']);
  18.                
  19.                
  20.                
  21.                 if(!empty($_GET[0])){
  22.                    
  23.                     $nombre = utf8_decode($_GET[0]);
  24.                 }else{
  25.                     // si no se especifica nombre del controlador se llamara a una clase por defecto, asegurarse de que esta clase este disponible siempre
  26.                     $nombre = 'def';
  27.                 }  
  28.                    
  29.  
  30.  
  31.             if(!empty($_GET[$_GET[0]])){
  32.                     $accion = $_GET[$_GET[0]];
  33.                 }else{
  34.                     // meto por defecto
  35.                     $accion = 'index';
  36.                 }
  37.    
  38.                 // definidos el nombre y la accion le asignamos ubicacion y nombre del controlador
  39.                 // el nombre de controlador (nombreControlador) lleva el nombre de la clase + el string Controlador
  40.                 // para su mejor identificacion
  41.                 $archivoControlador = CONTROLADOR_DIR.DS.$nombre.'Controlador.php';
  42.                
  43.                
  44.                 if(file_exists($archivoControlador)){
  45.                     require $archivoControlador;
  46.                 }else{      
  47.                     trigger_error ($archivoControlador . ' no existe', E_USER_NOTICE);
  48.                     return false;
  49.                 }
  50.  
  51.                 if (is_callable(array($nombre, $accion)) == false){
  52.                     trigger_error ($nombre . '->' . $accion . '` no existe', E_USER_NOTICE);
  53.                     return false;
  54.                 }
  55.                
  56.                
  57.                 $controlador = new $nombre();
  58.                 $controlador->$accion($_GET);
  59.                
  60.              
  61.             }
  62.     }
  63. ?>

por otro lado utilizo un ayudante para devolver las url comprobadas y limpias de caracteres que no quiera que se utilicen

librerias/router.php
Código php:
Ver original
  1. function getVariables($url)
  2. {
  3.     //quitamos la barra del final
  4.     $url = preg_replace('/\/$/', '', $url);
  5.  
  6.     //separamos las partes de la url y las contamos
  7.     $partes = explode('/', $url);
  8.     $cantPartes = count($partes);
  9.  
  10.     //si la cantidad de partes no es par retornamos false, al ser impar una variable se quedaria sin valor y esto no es posible
  11.    
  12.     if($cantPartes == 1){
  13.         return  $partes;
  14.     }
  15.     if($cantPartes % 2 != 0)
  16.         return false;
  17.    
  18.     $variables = array();
  19.    
  20.     //nombre del controlador
  21.     $variables[0] = limpiar($partes[0]);
  22.    
  23.     for($c = 0; $c < $cantPartes; $c = $c + 2)
  24.     {
  25.         //Acumulamos los pares de valores(para nosotros variables) en el arreglo
  26.         $nombre = limpiar($partes[$c]);
  27.         $valor = limpiar($partes[$c + 1]);
  28.         $variables[$nombre] = $valor;
  29.     }
  30.  
  31.     return $variables;
  32.    
  33. }
  34.  
  35. function limpiar($valor)
  36. {
  37.     //permitimos solo letras(a-Z), numeros y guiones
  38.     return preg_replace('/[^a-zA-Z0-9-_]/', '', $valor);
  39. }

controladores/defaultControlador.php
Código php:
Ver original
  1. <?php
  2.     class def{
  3.         function index(){
  4.             echo 'hola, no ha seleccionado ningun controlador asi que esta corriendo uno por defecto';
  5.         }
  6.     }
  7. ?>

si yo pusiera esto en mi navegador misitio.com me saldria hola, no ha seleccionado ningun controlador asi que esta corriendo uno por defecto

ahora al que te interesa a vos

controladores/hotel_grandeControlador.php
Código php:
Ver original
  1. <?php
  2.     class hotel_grande{
  3.         function index(){
  4.             $this->detalle();
  5.         }
  6.         function detalle(){
  7.             if(!isset($_GET['id']){
  8.                 // si no se especifica misitio.com/hotel_grande/id/nº
  9.                 $sql = 'busqueda de hotel por defecto';
  10.                 // haces las comparaciones que tienes que hacer y muestras el resultado
  11.                 echo $resultado;
  12.             }else{
  13.                 $slq = 'busqueda de hoteles que cumplan la condicion';
  14.                 echo $resultados;
  15.             }
  16.         }
  17.     }
  18. ?>

de esta manera si ingresas a misitio.com/hotel_grande listara las opciones de detalles, donde no esta especificada la variable id al igual que hacer misitio.com/hotel_grande/detalle, pero si ingresas a misitio.com/hotel_grande/detalle/id/1 cambiaran las cosas
  #7 (permalink)  
Antiguo 12/09/2009, 09:52
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 10 meses
Puntos: 1517
Respuesta: url amigables

@samu22 tengo una duda con tu codigo (que por cierto me gusto), en esta linea

Código PHP:
Ver original
  1. $archivoControlador = CONTROLADOR_DIR.DS.$nombre.'Controlador.php';
No veo que hayas definido una variable llamada DS de ¿donde sale esa variable?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #8 (permalink)  
Antiguo 12/09/2009, 10:33
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años
Puntos: 16
Respuesta: url amigables

Cita:
Iniciado por abimaelrc Ver Mensaje
@samu22 tengo una duda con tu codigo (que por cierto me gusto), en esta linea

Código PHP:
Ver original
  1. $archivoControlador = CONTROLADOR_DIR.DS.$nombre.'Controlador.php';
No veo que hayas definido una variable llamada DS de ¿donde sale esa variable?
huy perdon, borre la definicion sin darme cuenta porque en el mismo archivo tengo las definiciones de los modelos y las vistas, y no queria mezclar todo el codigo para el fin que se iba a utilizar.

la constante DS == /. (directorty separator).

entonces en la clase conector quedaria de la siguiente forma

Código php:
Ver original
  1. <?php      
  2.  
  3.     class conector{
  4.        
  5.             function iniciar(){
  6.                 // definimos el directorio donde guardaremos los controladores
  7.                 if(!defined('CONTROLADOR_DIR')){
  8.                     define('CONTROLADOR_DIR','controladores');
  9.                 }
  10.                 if(!defined('DS')){
  11.                     define('DS','/');
  12.                 }
  13.                 require 'librerias/config.php';
  14.                 require 'librerias/router.php'; // archivo que parse las url
  15.              
  16.                
  17.                
  18.  
  19.                     $_GET = getVariables($_GET['params']);
  20.                
  21.                
  22.                
  23.                 if(!empty($_GET[0])){
  24.                    
  25.                     $nombre = utf8_decode($_GET[0]);
  26.                 }else{
  27.                     // si no se especifica nombre del controlador se llamara a una clase por defecto, asegurarse de que esta clase este disponible siempre
  28.                     $nombre = 'def';
  29.                 }  
  30.                    
  31.  
  32.  
  33.             if(!empty($_GET[$_GET[0]])){
  34.                     $accion = $_GET[$_GET[0]];
  35.                 }else{
  36.                     // meto por defecto
  37.                     $accion = 'index';
  38.                 }
  39.    
  40.                 // definidos el nombre y la accion le asignamos ubicacion y nombre del controlador
  41.                 // el nombre de controlador (nombreControlador) lleva el nombre de la clase + el string Controlador
  42.                 // para su mejor identificacion
  43.                 $archivoControlador = CONTROLADOR_DIR.DS.$nombre.'Controlador.php';
  44.                
  45.                
  46.                 if(file_exists($archivoControlador)){
  47.                     require $archivoControlador;
  48.                 }else{      
  49.                     trigger_error ($archivoControlador . ' no existe', E_USER_NOTICE);
  50.                     return false;
  51.                 }
  52.  
  53.                 if (is_callable(array($nombre, $accion)) == false){
  54.                     trigger_error ($nombre . '->' . $accion . '` no existe', E_USER_NOTICE);
  55.                     return false;
  56.                 }
  57.                
  58.                
  59.                 $controlador = new $nombre();
  60.                 $controlador->$accion($_GET);
  61.                
  62.              
  63.             }
  64.     }
  65. ?>

@abimaelrc gracias por la observacion!
  #9 (permalink)  
Antiguo 15/09/2009, 06:51
Avatar de jakuam  
Fecha de Ingreso: abril-2007
Mensajes: 354
Antigüedad: 17 años
Puntos: 0
estimados he probado 2 formas sencillas de hacerlo para probar el mod_rewrite y no me funciona.. los tecnicos del host me dice que esta activo.. tambien probe con phpinfo() y no lo veo..
estas son las que probe

ReWriteRule /ficha/(.+)/ /detalles.php?alojar_id2=$1

y la dada por pedro_valencia
ReWriteRule ^([a-z0-9_-]+)/([0-9]+)/$ ficha/detalle.php?alojar_id=$2

y no pasa nada .. coloque el .htacces en el root y en la carpeta ficha/ y nada ..
el link que utilizo para y la la pagina es

http://www.midominio.com/ficha/detalles.php?alojar_id=1 ..

por favor ayuda

lo solucione mediante una funcion url_amigables y esta linea

ReWriteRule ^(.+)-([0-9]+).html ficha/detalles.php?alojar_id=$2

ahora el prblema es que la pagina no se ve del todo bien en cuanto a clases (css) y fotos.. descripciones del hotel ok nombre todo bien .. a que se puede deber .. esto en servidor local de mi maquina..
__________________
Jakuam
Reserva Hoteles Online
Turismo San Rafael Mendoza

Última edición por GatorV; 15/09/2009 a las 09:35
  #10 (permalink)  
Antiguo 15/09/2009, 12:06
 
Fecha de Ingreso: abril-2008
Mensajes: 453
Antigüedad: 16 años
Puntos: 16
Respuesta: url amigables

Cita:
Iniciado por jakuam Ver Mensaje
estimados he probado 2 formas sencillas de hacerlo para probar el mod_rewrite y no me funciona.. los tecnicos del host me dice que esta activo.. tambien probe con phpinfo() y no lo veo..
estas son las que probe

ReWriteRule /ficha/(.+)/ /detalles.php?alojar_id2=$1

y la dada por pedro_valencia
ReWriteRule ^([a-z0-9_-]+)/([0-9]+)/$ ficha/detalle.php?alojar_id=$2

y no pasa nada .. coloque el .htacces en el root y en la carpeta ficha/ y nada ..
el link que utilizo para y la la pagina es

http://www.midominio.com/ficha/detalles.php?alojar_id=1 ..

por favor ayuda

lo solucione mediante una funcion url_amigables y esta linea

ReWriteRule ^(.+)-([0-9]+).html ficha/detalles.php?alojar_id=$2

ahora el prblema es que la pagina no se ve del todo bien en cuanto a clases (css) y fotos.. descripciones del hotel ok nombre todo bien .. a que se puede deber .. esto en servidor local de mi maquina..
que te esta tomando como si estuvieras en la direccion que aparece en la barra de navegacion, cuando realmente estas en midominio.com/ficha/detalles.php
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 00:19.