Vi spiego la situazione. All’interno di un Controller ho il seguente codice:
$booPossoAttaccare = Yii::app()
->db
->createCommand()
->select('*')
->from('Costruzioni')
->join('SbloccoAzione', 'SbloccoAzione.idedificio = Costruzioni.idedificio')
->join('Azioni', 'Azioni.id = SbloccoAzione.idazione')
->where('Costruzioni.idutente=' . Yii::app()->user->id . ' and Azioni.nome="Attacca il nemico"')
->query()
->count() == 0 ? false : true;
Il codice qui sopra, mi sembrava molto ingombrante, quindi ho pensate che sarebbe interessante poterlo scrivere in questo modo:
Yii::app()->user->possoAttaccare()
Al che l’ho scritto davvero senza implementare nulla e mi sono beccato questa eccezzione.
CWebUser does not have a method named "possoAttaccare". (/Library/WebServer/yii/framework/base/CComponent.php:246)
Siccome CWebUser non ha quel metodo sapete che cosa faccio?
Mi creo una mia classe che estende CWebUser in questo modo:
class WebUSer extends CWebUser {
public function possoAttaccare() {
return Yii::app()
->db
->createCommand()
->select('*')
->from('Costruzioni')
->join('SbloccoAzione', 'SbloccoAzione.idedificio = Costruzioni.idedificio')
->join('Azioni', 'Azioni.id = SbloccoAzione.idazione')
->where('Costruzioni.idutente=' . Yii::app()->user->id . ' and Azioni.nome="Attacca il nemico"')
->query()
->count() == 0 ? false : true;
}
}
E poi dico ad yii che deve usare la mia classe come componente user (aggiungendo ‘class’ => ‘WebUser’,). In un config standard ‘class’ è omesso e di default è CWebUser se non sbaglio.
'components' => array(
...
'user' => array(
'class' => 'WebUser',
'allowAutoLogin' => true,
),
Morale della favola? Se yii non lo fa… estendiamolo. E’ semplice. E’ facile. E noi gli vogliamo sempre più bene. Ho scritto questo post perché l’esempio mi sembrava abbastanza semplice per dire come si estende CWebUSer ma in generale per dire che quando yii ci dice che non si può fare una cosa con una determinata classe, noi possiamo estenderla al volo. Ovviamente quello che vi ho mostrato non è il solo modo però mi piaceva.
Spero possa essere utile =).