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.
-
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
-
in config/main.php aggiungo questa rules all’urlManager:
'prodotto/(.*)-<id:\d+>'=>'prodotto/dettaglio',
- in ProdottoController creo una funzione del tipo:
public function actionDettaglio($id)
{
$this->layout = '//layouts/schedaprodotto';
$this->render('view',array(
'model'=>$this->loadModelMio($id),
));
}
- 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'
-
è ok;
-
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.