2011-10-01 10 views
6

Tengo un problema con las rutas de Codeigniter. Me gustaría que todos los usuarios registrados en mi sitio obtengan su propio "directorio", por ejemplo: www.example.com/username1, www.example.com/username2. Este "directorio" debe asignarse al controlador "polica", el método "ogled", el parámetro "username1".Rutas en Codeigniter - Automáticamente

Si esto me gusta, cada controlador se asigna a esta ruta: "polica/ogled/parameter". No está bien:

$route["(:any)"] = "polica/ogled/$1"; 

Esto funciona, pero siempre he introducido manualmente información en routes.php:

$route["username1"] = "polica/ogled/username1"; 

¿Cómo hago para que esto va a ser automatizado?

UPDATE: Por ejemplo, he controlador con nombre ads. Por ejemplo, si va al www.example.com/ads/ , habrá anuncios listados. Si va a www.example.com/username1, hay anuncios listados por el usuario username1. También hay controlador user, profile, latest, ...

Mi actual routes.php:

$route['oglasi'] = 'oglasi'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

He resuelto problema con este código:

$route['oglasi/(:any)'] = 'oglasi/$1'; 
$route['(:any)'] = "polica/ogled/$1" 
$route['default_controller'] = 'domov'; 
$route['404_override'] = ''; 

Saludos, Mario

+0

Brilliant! Acabo de hacer esto con el controlador predeterminado y funciona allí también. –

Respuesta

23

El El problema con su ruta es que al usar: cualquiera con el que coincida, en realidad ... CUALQUIER ruta, por lo que está bastante atrapado allí. que cree que puede tener dos soluciones:

1) Puede selectivamente modificar el trazado de toda su controlador de sitios de forma individual, como:

$route['aboutus'] = "aboutus"; 
$route['where-we-are'] = "whereweare"; 
//And do this for all your site's controllers 
//Finally: 
$route['(:any)'] = "polica/ogled/$1"; 

Todas estas rutas debe venir antes ANY, ya que se leen en el orden en que se presentan, y si coloca el: cualquiera al principio, se saltará todo el resto.

Edición después de comentario:

Lo que quiero decir es, si usted va a contrastar cualquier segmento, esto significa que no se puede usar cualquier controlador en absoluto (que es, por defecto, la primera URI segmento), ya que el enrutador siempre lo redirigirá utilizando su ley definida. Para permitir que CI ejecute otros controladores (sean lo que sean, acabo de utilizar algunas páginas web comunes, pero puede ser literalmente todo), debe permitirlas excluyéndolas del reencaminamiento. Y puede lograr esto colocándolos antes de su regla ANY, de modo que cada vez que CI pasa a través de sus reglas de enrutamiento, primero analiza el que "escapó", y SÓLO si no coinciden con nada que encuentre en la URL, se transmite. a la: CUALQUIER regla.

Sé que esto es una verbosidad de código, sin embargo, seguramente serán menos de 6K como usted dijo. Como no conozco la estructura real de sus URL y de su aplicación web, es la única solución que se me viene a la mente.Si usted proporciona información adicional, por ejemplo, cómo se forma de las direcciones URL regulares de su aplicación, entonces puedo actualizar mi respuesta

/final de edición

Esto no es tanto una solución practico, ya que requerirá una gran cantidad de código, pero si quieres un diseño como ese es la única forma en que se me ocurre. Además, considere que puede usar expresiones regulares como el índice $ route, pero no creo que pueda funcionar aquí, ya que es poco probable que sus nombres de usuario coincidan de esta manera, pero solo quería señalar la posibilidad.

O

2) Puede cambiar su patrón de diseño ligeramente, y asignar otra ruta para los nombres de usuario, algo a lo largo de la línea de

$route['user/(:any)'] = "polica/ogled/$1"; 

Esto generará bastante bonitas (y semánticos) URL no obstante, y evitará todas las molestias de escapar de las otras rutas.

+0

Gracias por su respuesta. No puedo usar su segunda solución porque mi cliente quiere tener un nombre de usuario después del nombre de dominio.No entiendo tu primera solución. ¿Puedes explicarme mi caso? Mi objetivo es resolver este problema con menos código. Ahora, tengo en mi archivo 'routes.php' alrededor de 6000 filas - No me gusta esto:/ – Puzo

+0

@Puzo Actualicé mi respuesta con alguna explicación de la primera solución. Y sí, 6000 rutas son definitivamente demasiado. –

+0

Actualicé mi primera publicación: pregunta. ¿Necesita más información? ¿Que tipo? – Puzo

1

Hace poco tuve problemas con este mismo problema. Creé algo que funcionó para mí de esta manera:

Defina un controlador "redirigir" con un método remap. Esto le permitirá recopilar las solicitudes enviadas al controlador con cualquier cadena de variable en una función. Por lo tanto, si se realiza una solicitud a http://yoursite/jeff/ o http://yoursite/jamie, no se aplicará a esos métodos, sino que se activará la función de reasignación http://yoursite/. (incluso si esos métodos/nombres no existen e incluso si tiene una función de índice, la reemplaza). En el método _Remap puede definir un interruptor condicional que luego funciona con el resto de su código redirigiendo al usuario de la manera que desee.

A continuación, debe definir este controlador de re-directa como la que viene por defecto y configurar las rutas de este modo:

$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

Ésta es al principio un poco de un problema, ya que esto básicamente forzar todo lo que se re -dirigido a este controlador pase lo que pase y finalmente a través de este interruptor _remap.

Pero lo que podría hacer es definir las reglas/rutas que no desea cumplir con esta condición sobre esas instrucciones de ruta.

es decir

$route['myroute'] = "myroute"; 
$route['(.*)'] = "redirect/index/$1"; 
$route['default_controller'] = "redirect"; 

he encontrado que esto produce un buen sistema en el que puedo tener tantos usuarios como se definen variables de donde soy capaz de redirigir fácilmente sobre la base de lo que representan a través de un controlador.

+0

Hmm ... Entonces, si lo entiendo correctamente, debo definir todos mis controladores en el archivo 'routes.php' y luego, en la parte inferior, definir la regla de redirección. Afecta esto en el rendimiento de la página? – Puzo

+0

@Puzo Al leer su comentario, eso es más o menos lo que traté de decir en mi respuesta. –

+0

@Chamilyan ¿Cómo puedo reemplazar # con/in url con enrutamiento? – Bugfixer

1

Otra forma sería declarar una matriz con sus controladores INTENAL y redirigir todo lo demás para el controlador de usuario de este tipo en su archivo routes.php de CodeIgniter:

$controllers=array('admin', 'user', 'blog', 'api'); 
if(array_search($this->uri->segment(1), $controllers)){ 
    $route['.*'] = "polica/ogled/$1"; 
}