Avevo bisogno in pratica di riscrivere le azioni o meglio ancora le rotte di yii.
Penso di aver trovato la soluzione, comunque riporto per completezza quello sto facendo.
Sto sviluppando un app per facebook con yii.
Mi spiego meglio con un esempio perchè a parole è complicato.
In pratica tutti i link della mia applicazione: menù,chiamate ajax,ecc,ecc sono (devono essere) nella forma seguente:
http://www.facebook.com/pages/MiaApplicazionediTest/?sk=app_158261004286449&app_data=mycontroller/myaction
http://www.facebook.com/pages/MiaApplicazionediTest/?sk=app_158261004286449&app_data=mycontroller2/myaction2
http://www.facebook.com/pages/MiaApplicazionediTest/?sk=app_158261004286449&app_data=mycontroller3/myaction3
Tutti questi link facebook me li gira sull’applicazione ad un controller predefinito che si configura in partenza, per esempio
http://miapplicazione.miodominio/index.php?r=site/index
Quindi io ho un unico controller ‘site’ in cui ricevo la stringa app_data che contiene i vari controller e azioni che effettivamente devo essere eseguiti, per cui sono costretto a riscrivere il routing di yii in funzione di ciò.
La soluzione che ho trovato è la seguente, in main.php
'urlManager' => array(
'class' => 'SiteRouter'
),
in components/SiteRouter.php
class SiteRouter extends CUrlManager {
public function parseUrl($request) {
if (isset($_GET[$this->routeVar])) {
if (preg_match('/gii/', $_GET[$this->routeVar]) || preg_match('/login/', $_GET[$this->routeVar])) {
return $_GET[$this->routeVar];
} else {
return $this->getAppData(); // un metodo privato che mi ritorna app_data
}
} elseif (isset($_POST[$this->routeVar]))
if (preg_match('/gii/', $_POST[$this->routeVar]) || preg_match('/login/', $_POST[$this->routeVar])) {
return $_POST[$this->routeVar];
} else {
return $this->getAppData();
}
else
return '';
}
}
questo lo posso fare se le rotte come in questo caso sono in GET_FORMAT