come si usa expression?

Che cosa c’è di sbagliato?

Ho provato a scrivere questa regola. Mi trovo nella pagina di aggiornamento di un utente, e voglio che ad aggiornare sia solamente l’utente proprietario dell’account. Ho provato con questo codice. Ma devo aver frainteso l’uso di expression perché non funziona =(.


    public function accessRules() {

        return array(

            array('allow',

                'actions' => array('index', 'view'),

                'roles' => array('*'),

            ),

            array('allow',

                'actions' => array('udpate'),

                'expression' => 'Yii::app()->user->id == $_GET["id"]',

            ),

            array('allow',

                'actions' => array('admin', 'delete'),

                'roles' => array('Admin'),

            ),

            array('deny',

                'roles' => array('*'),

            ),

        );

    }

Ho fatto anche questo tentativo:




    public function accessRules() {


        $return = array(

            array('allow',

                'actions' => array('index', 'view'),

                'users' => array('*'),

            ),

            array('allow',

                'actions' => array('admin', 'delete'),

                'roles' => array('Admin'),

            ),

            array('deny',

                'users' => array('*'),

            ),

        );


        if (Yii::app()->user->id == $_GET['id'])

            $return[] = array('allow',

                'actions' => array('udpate'),

                'users' => array(Yii::app()->user->name),

            );


        return $return;

    }

Ho anche provato a fare un var_dump($record); Mi restituisce un array corretto se mi trovo o meno nella pagina dell’utente. Però ricevo sempre lo stesso messaggio 403: non ho il permesso di accedere.

Sei siccuro che $_GET[‘id’] ti da il vore giusto?

sarebbe meglio usare la session… oppure getId() - http://www.yiiframework.com/doc/api/1.1/CWebUser#getId-detail

prova se funziona con un numero…

            'expression' => 'Yii::app()->user->id == [b]1[/b]',

@mdomba: si restituisce il valore giusto

@ilovephp: $_GET[‘id’] è un numero

Cmq ho risolto il problema nella view, dove mostro un messaggio che dice "hey, non puoi modificare questo profilo. Vai al mio profilo".

Nella view? Non era più semplice fare checkAccess(‘role’, $param) direttamente nel controller e passargli i parametri? Temo che $_GET non venga visto dall’expression…

Si era più semplice :-p Non ci avevo pensato. ehehe

:P ho avuto i tuoi stessi dubbi/problemi, mi ci è voluto qualche giorno per documentarmi su tutto ghgh

In ogni caso la soluzione che utilizzo sono i filtri (seppur con Rights questa volta).




    public function filters() 

    { 

        return array(

            'updateOwn + test', // applica il filtro updateOwn all'action test

            'rights', 

        );

    }


	public function filterUpdateOwn($filterChain)

	{

		// Controllo il permesso passando il parametro

		if(Yii::app()->user->checkAccess('UpdateOwn', array('userid'=>$_GET['id'])))

                        // rimuovo il filtro "rights" da filters(). 1 è il suo indice, 0 è quello di questo filtro!

			$filterChain->removeAt(1);

		

		$filterChain->run();

	}


    public function actionTest()

    {

        $this->render('test');

    }




Non bisogna dimenticarsi di assegnare la rules "UpdateOwn" a una che viene assegnata a tutti gli utenti, ad esempio authenticated.

ciao ragazzi,

una soluzione di questo tipo è errata ?








	public function actionUpdate($id)

	{

		$model=$this->loadModel($id);


		// Uncomment the following line if AJAX validation is needed

		// $this->performAjaxValidation($model);


		if(isset($_POST['User']))

		{

			$model->attributes=$_POST['User'];

			if($model->save())

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

		}




		if (($model->id)==(Yii::app()->user->id)) {

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

		}else{

		

				$this->render('nonseiautorizzato');

		}


	}



con accessrule :




			array('allow', // allow authenticated user to perform 'create' and 'update' actions

				'actions'=>array('update','index'),

				'roles'=>array('modificaPropriDati'),

			),