Action non definita a priori

Ho un controller in cui le azioni non sono prederminate a priori ma dipendono da alcuni parametri, quello che vorrei fare nel controller è qualcosa del genere


public function beforeaction($action_id) {


$my_action = $this->findActions();

Yii::app()->controller->action->id = $my_action;

        

}

ma chiaramente così è in sola lettura…

Prima di pensare a questa soluzione, potresti dirci qual’è il problema che stai cerando di risolvere?

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