Duda Con Urls Dinámicas Para Directorio

Hola a todos, quiero hacer un directorio con Yii y me surgen algunas dudas en cuanto a la forma de construir la estructura.

Se trata de un sitio de bailes, con lo cual podríamos tener una búsqueda por tipo (academias,locales,tiendas, conciertos, congresos, fiestas, bailarines…),otra por estilo (salsa, tango, bachata, sevillanas…) y luego ya las de provincia y población. Pongo unos ejemplos:

dominio.com/academias -> muestra listado de academias en españa

dominio.com/academias/salsa -> muestra listado de academias de salsa en españa

dominio.com/academias/valencia -> muestra academias en valencia

dominio.com/locales/salsa/valencia/sagunto -> muestra locales de salsa en sagunto

La duda que tengo es como montar esa estructura. Los tipos no son muchos y pueden estar cada uno en una tabla diferente, con lo que tendrían un controlador propio para cada uno. El problema me viene con las combinaciones. Por ejemplo si tengo una tabla de academias y un controlador con el mismo nombre:

dominio.com/academias/ -> muestra listado de academias llamando a la función index por defecto.

dominio.com/academias/salsa/ -> ¿Como hago para hacer esto? no habrá ninguna función que se llame salsa. Con lo cual tendría que poner en el urlManager una regla del tipo dominio.com/academias/<estilo:[a-zA-Z0-9-]+> y que redireccionara a la función academias/estilo por ejemplo.

Pero hacer eso por cada controlador y por cada combinación…es una locura.

No sé si me he explicado bien, aclaro lo que haga falta.

Gracias, un saludo.

No sé si me quedó claro, pero si entendí bien, yo haría algo así en el urlManager:




array(

  '<controller:(academias|locales|otro)>/<estilo:\w+>' => '<controller>/filtrar', //Redirige a la acción "filtrar" pasando el valor que hay en GET['estilo']

  '<controller:(academias|locales|otro)>' => '<controller>/index', // Si no, pasa al index

)



Saludos

El problema es que también se puede dar el caso que sea dominio.com/academias/valencia, con lo que "valencia" no sería un estilo y sin embargo entraría en la primera regla que propones.

De momento he puesto una regla en el urlmanager para que una url admita 4 variables opcionales y que la primera sea academias, locales y tiendas:


'urlManager'=>array(

			'urlFormat'=>'path',

			'rules'=>array(

				'buscador/<var1:academias|locales|tiendas>?(/<var2:[a-zA-Z0-9-]+>)?(/<var3:[a-zA-Z0-9-]+>)?(/<var4:[a-zA-Z0-9-]+>)?'=>'buscador/index',			

				'<controller:\w+>/<id:\d+>'=>'<controller>/view',

				'<controller:\w+>/<action:\w+>/<id:\d+>'=>'<controller>/<action>',

				'<controller:\w+>/<action:\w+>'=>'<controller>/<action>',

			),

		),

Luego en el controlador buscador/index recojo las 4 variables y voy buscando una por una en la bbdd para ver si se trata de una categoría, subcat, provincia o población.

Si necesita tal vez hacer alguna validación que sea demasiado compleja para agregarla como regla, recuerde que también puede agregarse una regla en forma de clase o en su defecto extender la funcionalidad CUrlManager…

y podría quedar algo como esto:




'urlManager'=>array(

   'class'=>'application.components.MiUrlManager',

  'rules'=>array(...),

)

o también algo como:




'urlManager'=>array(

  'rules'=>array(

    array(

      'class'=>'application.components.MiRutaPersonalizada'

    )

  )

)

Generalmente utilizo la primera opción (por costumbre) pero sé que como desde la versión 1.1.10 se permite usar la segunda.