Tworzenie kontrolek - instrukcja

Tworzymy własne kontrolki

Tworzenie własnych kontrolek w Yii jest bardzo proste. Fragment kodu html (lub php) używany w renderowaniu strony może zostać umieszczony w odrębnej procedurze i obudowany obiektem zbudowanym na bazie CWidget (lub jego pochodnego).

Jeśli implementację kontrolki umieścimy w katalogu komponentów (components), nie trzeba nawet dodatkowo jej importować.

Kontrolka (widget), plik components/test1.php

<?php

class test1 extends CWidget{

public function run(){

echo 'Testowa kontrolka1';

}

}

Wywołanie – w dowolnym widoku. Na przykład protected/views/site/index.php:

$this->widget('test1', array());

Kontrolka może zawierać inne kontrolki – tak jak formularz. Wówczas wywołanie jej wygląda następująco:

$kontrolka = $this->beginWidget('test2');
….

$this->endWidget();

Implementacja:

<?php

class test2 extends CWidget{

public function init() { // metoda wywoływana przez CController::beginWidget()

echo '<br /><hr />początek kontrolki2';

}

public function run(){

echo '<br />Testowa kontrolka 2';

}

}

Jeśli tworzymy kontrolkę na bazie innych klas niż CWidget, musimy zaimportować definicję odpowiedniej klasy. Poniżej przykład dla CPortlet z biblioteki zii:

<?php

Yii::import('zii.widgets.CPortlet');

class test3 extends CPortlet{

public function renderContent() {

echo '<br />Testowa kontrolka 3';

}

}

Należy zwrócić uwagę na to, że w dla CPortlet z biblioteki zii renderowanie kontrolki przeniesiono do funkcji renderControl!!

W tej funkcji możemy oczywiście używać widoków, które umieszcza się w katalogu protected/components/views:

<?php

Yii::import('zii.widgets.CPortlet');

class test4 extends CPortlet{

public function renderContent() {

$this->render('test4');

}

}
W kontrolce możemy używać także zmiennych publicznych, które (podobnie jak w widokach) są przekazywane w formie tabeli array('nazwa'=>wartość)

Wywołanie takiej kontrolki:

$this->widget('test5',array('tytul'=>'TYTUŁ'));

Implementacja:

<?php

Yii::import('zii.widgets.CPortlet');

class test5 extends CPortlet{

public $tytul;

public function section($type='', $par='') {

return 'testowy widget';

}

public function renderContent() {

$this->render('test5');

}

}

Widok:

<?php echo $this->section();

echo $this->tytul; ?>

W powyższym przykładzie pokazano dodatkowo jak używać publicznych funkcji zdefiniowanych w kontrolce (funkcja section).

Kontrolki można zdefiniować w rozszerzeniu – na przykład w pliku extension/test/widgets/test6.php:

<?php

Yii::import('zii.widgets.CPortlet');

class test6 extends CPortlet{

public function renderContent() {

echo '<br /><b>kontrolka 6</b>';

}

}

Należy jednak wówczas dodać import definicji do konfiguracji (plik protected/config/main.php):

'import'=>array(
...

'application.extensions.test.*',
),

Wywołanie:

$this->widget('ext.test.widgets.test6',array());

Więcej informacji:

http://www.yiiframework.com/doc/guide/1.1/pl/extension.create#widget

Ostatnia modyfikacja: poniedziałek, 1 luty 2016, 22:31