URLs personalizadas

Hola a todos!

Estoy probando un proyecto en localhost ya sin el .index.php.

Estuve viendo esto pero no entendí como solucionar este problema.

Suponiendo que tengo un modelo Empresa y cuando quiero verlas a todas quiero ir a:


localhost/nombreProyecto/empresas

(notar plural)

Cómo puedo hacer para que el index del modelo Empresa sea esa URL?

Además si quiero ingresar a la vista de, por ejemplo, la empresa "Coca Cola", cómo puedo hacer para que sea algo como:


localhost/nombreProyecto/empresas/CocaCola

?

Desde ya les agradezco.

Saludos!

Me faltó aclarar que el nombre de la empresa es ‘unique’, con lo cual no tendría problemas para usarlo como atributo en la URL.

Ideas?

Antes de contestar me gustaría aclarar un tema de conceptos. Dices "el index del modelo Empresa", pero para ser exactos se trata de la acción index del controlador Empresa. Es bueno siempre utilizar los conceptos correctos a la hora de pedir ayuda para así evitar malos entendidos.

Pasando a tu problema, en esa url que mencionas hay un ejemplo de lo que necesitas:




'posts'=>'post/list',



No he probado esta solución, pero siguiendo esa lógica podrías lograr lo que buscas definiendo la siguiente regla en tu config/main.php :




'empresas'=>'empresa/index',



Para este requerimiento podrías definir una regla como ésta:




 'empresas/<nombre:\w+>'=>'empresa/view',

 

Ahora, para que la regla funcione deberás modificar la acción view del controlador empresa para que cargue la instancia de la empresa basado en el nombre que viene en la url.




public function actionView($nombre) {

	$model = Empresas::model()->find('nombre = :nombreUrl', array(':nombreUrl' => $nombre));

	if(!$model === null) {

 		$this->render('view', array('model' => $model));

	} else {

      	throw new CHttpException(404, 'No se ha encontrado la empresa');

	}

}



Escribí el código sin realizar alguna prueba (por tiempo), por lo que podría no funcionar correctamente, pero espero que al menos te dé una idea de cómo solucionar tu problema.

Saludos.

Gracias de nuevo Mauricio!

Pude hacer funcionar lo primero pero haciendo más o menos lo que me sugeriste para esto:


localhost/nombreProyecto/empresas/CocaCola

no pude hacerlo andar correctamente. Si ahora coloco el nombre me da un 404 que NO es el que pongo en la acción view de Empresa, es:


The system is unable to find the requested action "NOMBRE" 

por esto me doy cuenta que no está entrando a actionView.

Tenés alguna idea de que puedo estar haciendo mal? Creería que el tema viene por esto:


'empresas/<nombre:\w+>'=>'empresa/view',

También probé con <nombre:\d+> pero sigue sin redirigir a la vista correspondiente.

Hoy en la mañana terminé un sistema pequeño que utilizaré mañana por la mañana para hacer las pruebas correspondientes al caso que no te está resultando, te cuento los resultados en caso de que aún no logres resolverlo.

Ya sé qué problema tienes, estás agregando las reglas después de las que vienen con Yii. La evaluación de cada patrón se hace de arriba a abajo, por lo tanto yii cree que intentas acceder a la acción "nombre" del controlador empresas.

Para que funcione lo que deseas, debes agregar tu patrón sobre los predeterminados. Si una url no calza con tu patrón, seguirá evaluándose hacía abajo.

GRACIAS MAURICIO!

Logré hacer lo que necesitaba. No se por qué con tu función me daba error 404, terminé usando:




	public function actionView($nombre) {

            $model = Empresa::model()->findByAttributes(array('nombre'=>$nombre));

            if($model) 

                   $this->render('view', array('model' => $model));                    

            else 

                    throw new CHttpException(404, 'No se ha encontrado la Empresa');

            

        }



y agregué esto en main.php para poder usar la misma idea en un update:




'empresa/update/<nombre:\w+>'=>'empresa/update',



Me alegra haber ayudado :D