Come utilizzare un application behavior per mantenere la configurazione a runtime

In questo tutorial sarà spiegato un metodo per gestire alcune configurazioni a runtime.

La guida si ispira al tutorial originale inglese denominato

[size="2"]How to use an application behavior to maintain runtime configuration[/size]

Da quello che ho capito finora il behavior è uno strumento molto potente che ci offre yii ed è bene capirlo a fondo.

Per farlo proveremo a gestire configurazioni lato utente molto diffuse nelle web applicaton, come l’internalizzazione, la lingua e la data che possono cambiare a seconda del paese.

In questo esempio salviamo la lingua selezionata dall’utente in sessione.

  1. Creare un file in /protected/components denominato ApplicationConfigBehavior.php contenente questo codice:



<?php

 

/**

 * ApplicationConfigBehavior is a behavior for the application.

 * It loads additional config parameters that cannot be statically 

 * written in config/main

 */

class ApplicationConfigBehavior extends CBehavior

{

    /**

 	* Declares events and the event handler methods

 	* See yii documentation on behavior

 	*/

    public function events()

    {

        return array_merge(parent::events(), array(

            'onBeginRequest'=>'beginRequest',

        ));

    }

 

    /**

 	* Load configuration that cannot be put in config/main

 	*/

    public function beginRequest()

    {

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

   			$this->owner->user->setState('applicationLanguage', $_POST['lang']);

   	if ($this->owner->user->getState('applicationLanguage'))

            $this->owner->language=$this->owner->user->getState('applicationLanguage');

        else 

            $this->owner->language='en';

    }

}



  1. Questo file dev’essere incluso in /protected/config/main.php. Quindi nell’array bisogna aggiungere:

'behaviors' => array('ApplicationConfigBehavior')

  1. Per aggiornare la lingua possiamo utilizzare un widget (da inserire nel layout / main), ad esempio:

/protected/components/LangBox.php


<?php

class LangBox extends CWidget

{

    public function run()

    {

        $currentLang = Yii::app()->language;

        $this->render('langBox', array('currentLang' => $currentLang));

    }

}

?>

/protected/components/views/langBox.php


<?php echo CHtml::form(); ?>

    <div id="langdrop">

        <?php echo CHtml::dropDownList('_lang', $currentLang, array(

            'en_us' => 'English', 'is_is' => 'Icelandic'), array('submit' => '')); ?>

    </div>

<?php echo CHtml::endForm(); ?>

Complimenti sempre chiaro e limpido ;) certo ke hai messo la 4^ !!!

Sono ancora un novellino e ho molte lacune.

Però quando vedo qualcosa di utile alla comunità,

anche se non ho ancora approfondito completamente l’argomento,

lo riporto ugualmente qui sul forum italiano per aiutare tutti a crescere.

Così che poi, altri possano aggiungere a loro volta il proprio contributo.

Lo trovo un bel metodo didattico di imparare divertendosi.

E spero di leggere / imparare presto qualche vostra scoperta / approfondimento sui behavior

Problemino che penso dipenda dal behavior:

ho implementato questa soluzione ed ho provato ad accedere a gii

mi salta il passaggio dell’autenticazione di gii

mi reindirizza al classico login

mi loggo come "demo/demo"

riesco ad accedere a gii senza ancora aver mai inserito la password di gii.

spero di essermi spiegato… in pratica aggira l’autenticazione di gii :unsure: :unsure: :unsure:

Comunque ottima guida ;) molto utile

Confermo quanto affermi.

Ho il tuo stesso difetto e non essendomene accorto subito non ne avevo individuato la causa.

Se disabiliti il behavior hai già verificato che gii torni a chiedere la sua password?

Giusto per essere certi che dipenda da questo

Fatto! Disabilitato il behavior e gii chiede la sua password (tutto torna normale)

Forse devi prima controllare se l’utente è autenticato in beginRequest e poi controllare/impostare la lingua altrimenti yii ti richiede l’autenticazione.

Ho dato solo un’occhiata di corsa :)

Teoricamente il beginRequest[color="#1C2837"][size="2"] è il primo evento che viene scaturito quando viene invocata una qualsiasi action del framework.[/size][/color]

[color="#1C2837"][size=“2”]E per come l’ho capita io, non ha senso il comportamento di gii. Sembra più un bug.[/size][/color]

[color="#1C2837"][size=“2”]Anche perchè io potrei sviluppare un sito multi lingua che non richieda l’autenticazione, ma solo il cambio di lingua.[/size][/color]

[color="#1C2837"][size=“2”]Però prova a verificare l’ipotesi di Nicola.[/size][/color]

[color="#1C2837"][size="2"]Prova a commentare il codice in questo modo:[/size][/color]

[color="#1C2837"][size="2"]




public function beginRequest()

{

/*

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

                        $this->owner->user->setState('applicationLanguage', $_POST['lang']);

        if ($this->owner->user->getState('applicationLanguage'))

            $this->owner->language=$this->owner->user->getState('applicationLanguage');

        else 

            $this->owner->language='en';

*/

}[/size][/color]

[color="#1C2837"][size="2"]

[/size][/color]

[color=#1C2837][size=2]e vediamo se il problema persiste.[/size][/color]

persiste ;)

Anche io ho lo stesso problema, ma non ci ho mai perso piu’ di un decimo di secondo.

Sul server di produzione gii non ci deve essere punto e basta, per cui non e’ importante se chiede o meno la password.

Condivido il tuo pensiero ma tu ammetterai che si tratta di un comportamento anomalo… il mio dubbio è che possa intaccare altro oltre a gii

Io ho avuto un problema con l’internazionalizzazione dell’application name.

Se impostate Yii::app()->name a qualcosa di internazionalizzato, l’application ID cambia con l’internazionalizzazione, il che causa diversi problemi (specialmente con le cache e con gli stati).

Se siete in queste condizioni specificate un application id fisso.