Ver Mensaje Individual
  #6 (permalink)  
Antiguo 12/09/2009, 08:21
samu22
 
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