Rewrite url per alcune view

Ciao a tutti,

ho un Model che si chiama "prodotto".

Di conseguenza la pagina che mi mostra un singolo prodotto è del tipo www.miosito.it/prodotto/123, dove 123 è l’id del prodotto.

E’ possibile sostituire almeno l’id dell’url generato con ad esempio il titolo del prodotto per ottenere qualcosa tipo www.miosito.it/prodotto/vaso-ceramica-20cm ?

Grazie,

Franco

Certo, basta mettere nell’url manager una cosa di questo tipo:




'prodotti/(.*)-<id:\d+>'=>'prodotto/dettaglio'



In questo caso la stringa sarà del tipo

prodotti/<nome_prodotto>-<id_prodotto>

Grazie Fabrizio! visto che non conosco Yii, puoi dirmi come inserire questa direttiva? al momento ho una situazione di questo tipo:


'urlManager'=>array(

			'urlFormat'=>'path',

                    'showScriptName'=>false,

			'rules'=>array(

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

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

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

				'<view:(azienda|contatti|carrello|ordine-invia|storico-ordini|novita|)>'=>'site/page'

			),

		),

Aggiungi la riga che ti ho riportato in testa agli elementi dell’array ‘rules’

Ho fatto esattamente come mi hai detto, ma non funziona. Ho provato anche a sostituire “dettaglio” con “DESCRIZIONE” (il mio campo nel db per il titolo dell’oggetto), ma non è cambiato nulla. Se può servire il model di riferimento si chiama “Prodotto” e il controller “ProdottoController”.




'urlManager'=>array(

				'urlFormat'=>'path',

	                    'showScriptName'=>false,

				'rules'=>array(

					'prodotti/(.*)-<id:\d+>'=>'prodotto/DESCRIZIONE',

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

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

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

					'<view:(azienda|contatti|carrello|ordine-invia|storico-ordini|novita)>'=>'site/page'

				),

			),



Rimetti la riga




'prodotti/(.*)-<id:\d+>'=>'prodotto/dettaglio',



hai creato in ProdottiController il metodo




function actionDettaglio($id)

{

}



Verrà invocato questo metodo quando chiamato l’url del tipo

prodotti/pippo-1234

passando come $id il valore 1234

la funzione actionDettaglio cosa deve contenere all’interno?

La visualizzazione del dettaglio richiesto, come fosse una view.

Uhm… scusa Fabrizio ma ancora non ho capito bene.

Correggimi dove sbaglio.

  1. ho il model "Prodotto.php" e il controller "ProdottoController.php". Il risultato che voglio ottenere è www.miosito.it/prodotto/id-nomeprodotto. Ad esempio: www.miosito.it/prodotto/23-camice_bianco_taglia_m

  2. in config/main.php aggiungo questa rules all’urlManager:


'prodotto/(.*)-<id:\d+>'=>'prodotto/dettaglio',

  1. in ProdottoController creo una funzione del tipo:



public function actionDettaglio($id)

	{

		$this->layout = '//layouts/schedaprodotto';

		$this->render('view',array(

			'model'=>$this->loadModelMio($id),			

		));

	}



  1. a questo punto definisco la funzione loadModelMio:



public function loadModelMio($id)

	{

		$model=Prodotto::model()->findByAttributes(array('DESCRIZIONE'=>$id));

		if($model===null)

			throw new CHttpException(404,'The requested page does not exist.');

		return $model;

	}



dove sbaglio?

Grazie mille per la pazienza

Allora

1 e 2) Se vuoi quel tipo di impostazione del path, devi inserire una regola diversa nell’url manager, dove la variazione <id> è all’inizio e non alla fine; quindi in main.php devi inserire:




'prodotto/<id:\d+>-(.*)'=>'prodotto/dettaglio'



  1. è ok;

  2. Credo che tu stia confondendo l’id con la descrizione. La cosa importante è passare l’id

per il caricamento del model, del tipo:




public function loadModelMio($id)

        {

                $model=Prodotto::model()->findByAttributes(array('id'=>$id));

                if($model===null)

                        throw new CHttpException(404,'The requested page does not exist.');

                return $model;

        }



Ora è un po’ più chiaro.

L’unica cosa è che se digito un indirizzo del tipo:

www.miosito.it/prodotto/245-cassettieraxyz

Mi restituisce ERRORE 403.

Invece questo url funziona correttamente

www.miosito.it/prodotto/245

Sicuro che non ci sia qualche altra regola ad entrare in gioco?

Perchè l’ho provata e funziona.

Non credo, perchè ora l’urlmanager è settato in questo modo:




'urlManager'=>array(

				'urlFormat'=>'path',

	                    'showScriptName'=>false,

				'rules'=>array(

					'prodotto/<id:\d+>-(.*)'=>'prodotto/dettaglio',

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

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

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

					'<view:(azienda|contatti|carrello|ordine-invia|storico-ordini|novita|>'=>'site/page'

				),

			),



Nel dettaglio, qual è l’errore che ricevi?

Errore 403

La pagina che stai cercando non è disponibile.

Vuol dire che non trova nell’url manager una riga che fa il match,

anche se dall’url di prova che hai messo combacia perfettamente la prima riga.