Le applicazioni Yii sono costruite su component che sono oggetti scritti per uno scopo
specifico. Un component è un'istanza di CComponent o una sua classe derivata.
L'uso di un component coinvolge principalmente l'accesso alle sue proprietà e la
generazione/gestione dei suoi eventi. La classe base CComponent specifica come
definire le proprietà e gli eventi.
La proprietà del component è come il membro di una variabile pubblica di un oggetto. Si può leggere il valore od assegnare ad essa un valore. Per esempio,
$width=$component->textWidth; // recupera la proprietà di textWidth
$component->enableCaching=true; // imposta la proprietà di enableCaching
Per definire la proprietà di un component, si può semplicemente dichiarare il membro di una variabile pubblica nella classe component. Una modalità più flessibile, comunque, è quella di definire i metodi getter e setter come qui di seguito:
public function getTextWidth()
{
return $this->_textWidth;
}
public function setTextWidth($value)
{
$this->_textWidth=$value;
}
Il codice qui sopra definisce una proprietà scrivibile chiamata textWidth
(il nome
è indifferente al maiuscolo/minuscolo). Durante la lettura della proprietà,
viene invocata getTextWidth()
ed il valore restituito diventa il valore della proprietà;
Allo stesso modo, quando viene scritta la proprietà, viene invocata setTextWidth()
.
Qualora il metodo setter non sia definito, la proprietà sarà a sola lettura ed il
tentativo di scrittura genererà un'eccezione. L'uso dei metodi getter e setter per
definire una proprietà ha il vantaggio che la logica supplementare (es. l'esecuzione della
validazione, la generazione di eventi) può essere eseguita durante la lettura e la
scrittura della proprietà.
Note: |Nota: C'è una leggera differenza tra la proprietà definita tramite i metodi getter/setter e la variabile membro di una classe. Il nome della prima è indifferente
al maiuscolo/minuscolo mentre la seconda è sensibile al maiuscolo/minuscolo.
Gli eventi dei component sono proprietà speciali che hanno i metodi (chiamati
gestori degli eventi
) come loro valori. Il collegamento (assegnazione) di un
metodo ad un evento farà si che il metodo venga invocato automaticamente nel momento
in cui l'evento venga generato. Quindi, il comportamento di un component può essere
modificato in un modo che potrebbe non essere stato previsto durante lo sviluppo
del component.
Un evento del component è definito tramite la definizione di un metodo il cui nome
inizia con on
. Come i nomi delle proprietà sono definiti tramite i metodi getter/setter,
i nomi degli eventi sono insensibili al maiuscolo/minuscolo. Il codice che segue
definisce un evento onClicked
:
public function onClicked($event)
{
$this->raiseEvent('onClicked', $event);
}
dove $event
è una istanza di CEvent o una classe figlia che rappresenta il
parametro dell'evento.
Si può collegare un metodo a questo evento come segue:
$component->onClicked=$callback;
dove $callback
si riferisce ad una funzione callback valida di PHP. Può essere
una funzione globale o un metodo di una classe. Nel secondo caso, la funzione callback
deve essere data come array: array($object,'methodName')
.
La firma di un gestore di evento deve essere come segue:
function methodName($event)
{
......
}
dove $event
è il parametro che descrive l'evento (che proviene dalla chiamata
di raiseEvent()
). Il parametro $event
è una istanza di CEvent o la sua classe
derivata. Come minimo, contiene l'informazione su chi abbia generato l'evento.
Un gestore di eventi può essere anche una funzione anonima che è supportata da PHP 5.3 o superiore. Per esempio,
$component->onClicked=function($event) {
......
}
Se ora viene chiamata onClicked()
, l'evento onClicked
sarà generato (all'interno
di onClicked()
), ed il gestore di evento collegato sarà invocato automaticamente.
Un evento può essere collegato a più gestori. Quando è generato un evento, i gestori saranno invocati nell'ordine in cui essi sono collegati all'evento. Se un gestore volesse impedire che gli altri gestori venagno invocati, si può impostare $event->handled a true.
Il component supporta il pattern mixin e può essere collegato con uno o più behavior. Un behavior è un oggetto i cui metodi possono essere 'ereditati' dai component collegati tramite lo strumento di collezionare funzionalità piuttosto che specializzazioni (es. normale ereditarietà della classe). Un component può essere collegato a più behavior e ottenere così 'l'ereditarietà multipla'.
Le classi behavior devono implementare l'interfaccia IBehavior. La maggior parte delle behavior possono estendere dalla classe base CBehavior. Se un behavior necessita di essere collegato ad un model, si può estendere da CModelBehavior o CActiveRecordBehavior che implementano funzionalità aggiuntive specifiche per i model.
Per usare un behavior, è necessario che prima sia collegato ad un component chiamando il metodo attach(). Quindi si può chiamare un metodo behavior tramite il component:
// $name identifica univocamente il behavior nel component
$component->attachBehavior($name,$behavior);
// test() è un metodo di $behavior
$component->test();
Un behavior collegato può essere utilizzato come una normale proprietà di un component.
Per esempio, se un behavior chiamato tree
è collegato ad un component, si può
ottenere il riferimento a questo oggetto behavior usando:
$behavior=$component->tree;
// equivalente al seguente codice:
// $behavior=$component->asa('tree');
Un behavior può essere disabilitato temporaneamente cosicché i suoi metodi non sono disponibili tramite il component. Per esempio,
$component->disableBehavior($name);
// la seguente dichiarazione genererà una eccezione
$component->test();
$component->enableBehavior($name);
// adesso funziona
$component->test();
È possibile che due behavior collegati allo stesso componente abbiano metodi con lo stesso nome. In questo caso, il metodo del behavior collegato per primo avrà la precedenza.
Quando sono usati insieme ad eventi, i behavior sono ancora più potenti. Un behavior, quando viene collegato ad un component, può collegare alcuni dei suoi metodi ad alcuni eventi del component. Così facendo, il behavior ha la possibilità di osservare o modificare il normale flusso di esecuzione del component.
Si può accedere alla proprietà di un behavior tramite il component a cui è collegato.
Le proprietà comprendono sia i membri di variabili pubbliche che le proprietà definite
tramite i getter e/o setter del behavior. Per esempio, se un behavior ha una proprietà
chiamata xyz
ed il behavior è collegato al component $a
, si può usare l'espressione
$a->xyz
per accedere alla proprietà del behavior.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.