Tworzenie rozszerzeń - instrukcja do ćwiczeń

Tak jak podano w hpoprzedniej części kursu, rozszerzenia tworzymy w katalogu extensions i dołączamy je w sekcji import konfiguracji (plik protected/config/main.php):

'import'=>array(

...

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

Rozszerzenie może zawierać kontrolki (widgets), moduły i komponenty.

Przetestujmy to na przykładzie nieco bardziej złożonej kontrolki extensions/test/widgets/test7.php:

<?php

class test7 extends CWidget {

public $cssFile;

public static function AssetPath($FileName) {

return Yii::getPathOfAlias('ext.test') // sciezka do rozszerzenia

.DIRECTORY_SEPARATOR.'assets'. // podkatalog

DIRECTORY_SEPARATOR.$FileName;

}

public function run(){

if (!isset($this->cssFile))

$this->cssFile=Yii::app()->getAssetManager()->publish($this->AssetPath('slideup.css'));

// AssetManager()->publish() wrzuca plik do bufora assets i zwraca jego sciezke

var_dump($this->cssFile);

$cs=Yii::app()->clientScript; // rejestracja pliku

$cs->registerCssFile($this->cssFile);

?>

<div class="container">

<div class="row">

<div class="col-xs-12 col-sm-12 col-md-12">RAMKI</div>

</div>

<div class="row">

<div class="col-xs-6 col-sm-4 SlideUpBox">

<h4>Bok 1</h4> <p> tresc </p>

</div>

<div class="col-xs-6 col-sm-4 SlideUpBox">

<h4>Bok 2</h4> <p> tresc </p>

</div>

<div class="col-xs-6 col-sm-4 SlideUpBox">

<h4>Bok 3</h4> <p> tresc </p>

</div>

</div>

</div>

<?php

}}

?>

Wywołanie:

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

Kontrolka tworzy efekt prostokątów reagujących na najechanie myszką. Do uzyskania tego efektu posłużono się stylami css3. Więcej informacji:

http://kodcss.pl/kurs-css/lekcje/dzial-4/css3-ruchome-tlo-w-elemencie-html

http://www.e-zoner.pl/css/css-wlasciwosci

W tej implementacji należy zwrócić uwagę na sposób w jaki dołączamy pliki statyczne zawarte w rozszerzeniu. Nie przenosimy ich do katalogu aplikacji, ale wykorzystujemy menadżera zasobów (AssetManager):

$nowa_sciezka_do_pliku=Yii::app()->getAssetManager()->publish(ścieżka do pliku);

Menadżer zasobów sprawdza, czy plik już jest w buforze aplikacji (katalog assets) i jeśli tak – podaje jego ścieżkę. Jeśli nie – najpierw dodaje go do bufora a później zwraca ścieżkę.

W rozszerzeniu można analogicznie jak w głównej aplikacji tworzyć widoki w podkatalogu views i komponenty w katalogu components.

Komponenty rejestrujemy normalnie w konfiguracji (plik main.php w katalogu config, sekcja components), podając odpowiednią ścieżkę – na przykład:

'Komponent1' => array(

'class' => 'ext.tst.components.Komponent1',

),

W pliku Komponent1:

<?php

class Komponent1 extends CApplicationComponent {

public $cs;

public $assetsUrl;

public function getVersion() { return 'wersja 1'; }

public function getAssetsUrl() {

if (isset($this->assetsUrl)) {

return $this->assetsUrl;

} else {

return $this->assetsUrl = Yii::getPathOfAlias('ext.tst').DIRECTORY_SEPARATOR.'assets'.DIRECTORY_SEPARATOR;

}

}

public function init() {

if (!$this->cs) $this->cs = Yii::app()->getClientScript();

$this->cs->registerCssFile(Yii::app()->getAssetManager()->publish($this->getAssetsUrl().'test.css'));

parent::init();

}

public function test() {

print $this->assetsUrl;

}

}

Funkcja init() dołącza arkusz stylu test.css.

Przykładowe użycie komponentu:

<?php
Yii::import('ext.tst.components.Komponent1');
$component = new Komponent1();
echo $component->getVersion();
$component->init();
echo $component->test();

Możemy komponent ładować wstępnie – wówczas nie trzeba za każdym razem importować (wiersz Yii::import('ext.tst.components.Komponent1'); można usunąć):

'import'=>array(
...
'ext.tst.components.*',
...
),

Ostatnia modyfikacja: poniedziałek, 1 luty 2016, 13:44