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.
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';
}
}
Questo file dev’essere incluso in /protected/config/main.php. Quindi nell’array bisogna aggiungere:
'behaviors' => array('ApplicationConfigBehavior')
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));
}
}
?>
Forse devi prima controllare se l’utente è autenticato in beginRequest e poi controllare/impostare la lingua altrimenti yii ti richiede l’autenticazione.
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]
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.