Instrukcja do ćwiczeń (4): Biblioteki

Jak każdy większy program, aplikacja Yii korzysta z wielu bibliotek. Rozróżniamy przy tym:

- moduły

- komponenty

- rozszerzenia

Moduły

Najkrócej mówiąc moduły (modules) to biblioteki rozszerzające funkcjonalność strony dla jego użytkownika. Na przykład moduł m1 zawierający kontroler c1 może mieć zdefiniowaną akcję a1 – wówczas dostajemy obsługę URL: m1/c1/a1

Moduły są umieszczane w katalogu modules, podkatalogu odpowiadającym nazwie modułu. Wewnątrz mogą być katalogi tworzące strukturę taką jak w przypadku aplikacji (views, models, controllers etc). Dodatkowo w katalogu modułu tworzy się plik o nazwie <nazwa modułu>Module.php

Przykład:

modules/m1/m1Module.php

<?php

class M1Module extends CWebModule

{

public $version = '1.0';

public function init() {

$this->setImport(array(

'm1.models.*',

'm1.components.*',

));

}

} ?>

modules/m1/controllers/DefaultController.php

<?php

class DefaultController extends Controller{

public function actionIndex(){

$this->render('index',array());

}

}

modules/m1/controllers/c1Controller.php

<?php

class C1Controller extends Controller {

public function actionIndex(){

$this->render('index',array());

}

public function actionA1(){

$this->render('a1',array());

}

}

Do tego trzeba oczywiście dodać odpowiednie widoki (użyte w wywołaniu render):

modules/m1/views/default/index.php

modules/m1/views/c1/index.php

modules/m1/views/c1/a1.php

Funkcja Init w pliku m1Module.php zawiera import pozostałych plików modułu.

Aby użyć modułu, musimy dodać jego definicję w pliku konfiguracyjnym (config/main.php):

'import'=>array(

'application.modules.m1',
...

'modules'=>array(

'm1',

...

Dodatkowo w definicji można zawrzeć parametry. Wtedy w sekcji modules parametrów w miejsce 'm1', pojawi się:

'm1'=>array('parametr1' ...),

więcej informacji: http://www.yiiframework.com/doc/guide/1.1/pl/basics.module

Po kolei możemy przećwiczyć wywołania:

- http://localhost/…/m1 – wywoła actionIndex z kontrolera DefaultController

- http://localhost/…/m1/c1 – wywoła actionIndex z kontrolera C1Controller

- http://localhost/…/m1/c1/a1 – wywoła actionA1 z kontrolera C1Controller

Komponenty

Komponenty zawierają klasy obiektów używanych w implementacji programu – a więc w przeciwieństwie do modułów nie rozszerzają wprost funkcjonalności dla użytkownika.

Zapisuje się je w katalogu components. W teorii są to klasy zdefiniowane na bazie CComponent. W praktyce można spotkać innego rodzaju definicje. Włączenie komonentów odbywa się tak jak w przypadku modułów – tyle, że w sekcji 'components' pliku konfiguracyjnego.

Więcej informacji:

http://www.yiiframework.com/doc/guide/1.1/pl/basics.component

Rozszerzenia

Rozszerzeniami są biblioteki innych dostawców, dostarczane w paczce zawierającej komponenty i/lub moduły. Jeśli na przykład rozszerzenie r1 zawiera komponent o nazwie m2, to odwołujemy się do niego podając ścieżkę: application.extensions.r1.c1.

Rozszerzenia zapisuje się w podkatalogu extensions. Jeśli chcemy, aby rozszerzenie było dostępne tak, jak obiekty frameworka – bez dodatkowych importów w kodzie – trzeba dodać to rozszerzenie do sekcji import pliku konfiguracyjnego (+ ewentualnie do preload):

'import'=>array(
...
'ext.r1.*'
),

Zii

Zii jest rozszerzeniem, które jest dostarczane wraz z frameworkiem. Zawiera ono definicję kontrolek (widgets), których możemy użyć jako elementy wizualne strony. Przede wszystkim jest to kontrolka CMenu, która jest użyta w definicji menu aplikacji wygenerowanej poleceniem:

php yiic.php webapp NazwaAplikacji

W pliku szablonu (domyślnie views/layouts/main.php) można znaleźć definicję:

<?php $this->widget('zii.widgets.CMenu',array(
'items'=>array(
array('label'=>'Home', 'url'=>array('/site/index')),
array('label'=>'About', 'url'=>array('/site/page', 'view'=>'about')),
array('label'=>'Contact', 'url'=>array('/site/contact')),
array('label'=>'Login', 'url'=>array('/site/login'), 'visible'=>Yii::app()->user->isGuest),
array('label'=>'Logout ('.Yii::app()->user->name.')', 'url'=>array('/site/logout'), 'visible'=>!Yii::app()->user->isGuest)
),
)); ?>
Na tym przykładzie widać, że wywołanie kontrolki następuje z dwoma parametrami:

$this->widget(nazwa_klasy,parametry)

W tym wypadku nazwa_klasa to 'zii.widgets.Cmenu', a parametry umiejszczone w tablicy to definicja menu. Oczywiście formalnie poprawne jest:

$this->widget('zii.widgets.CMenu',array() );

W praktyce jednak jakieś elementy menu podajemy. Choćby tyle:

$this→widget('zii.widgets.Cmenu', array(
'items'=>array( array('label'=>'Home', 'url'=>'#'))));
URL może być podany jako tablica – wówczas nastąpi poskładanie właściwego adresu względem bieżącej lokalizacji (nie musimy operować adresami bezwzględnymi). Dodatkowo można podać parametr visible – określający, czy punkt menu jest widoczny. Można też w tablicy items umieścić tablice definiujące podmenu.

Formularze zii

Formularze zii różnią się od zwykłych formularzy jedynie użyciem kontrolek (widgetów). Możemy je generować przez generator kodu - moduł gii. Aby go użyć wystarczy odznaczyć odpowiednie komentarze w pliku konfiguracyjnym i ustawić tam hasło. Jeśli chcemy użyć gii na serwerze innym niż localhost, musimy dodać w konfiguracji odpowiedni filtr.

Przykładowe wywołanie: http://localhost/testwww/gii

UWAGA! Formularze gii współpracują z modelami typu ActiveRecord (takie są generowane przez gii).

Możemy na przykład wygenerować formularz testzii dla modułu TestUsers (tablica test_users używana wcześniej). Generator gii generuje od razu akcję, którą musimy dodać do kontrolera. Niech będzie to kontroler TestUusersController.php. Wówczas wygenerowany widok musimy przenieść do katalogu views/TestUsers.

Zamiast wygenerowanych pól użyjmy w widoku testzii kontrolkę ListView: http://www.yiiframework.com/doc/api/1.1/CListView

Odpowiednia strona dokumentacji zawiera opis, który kopiujemy w całości do pliku testzii.php. Poniżej tłustym drukiem zaznaczono to, co musimy zmienić:

<?php
$dataProvider=new CActiveDataProvider('TestUsers');
$this->widget('zii.widgets.CListView', array(
'dataProvider'=>$dataProvider,
'itemView'=>'_user', // refers to the partial view named '_post'
'sortableAttributes'=>array(
'title',
'create_time'=>'Post Time',
),
));

?>

Należy zwrócić uwagę na to, że zamiast modelu używamy providera danych (CActiveDataProvider). Różni się on od modelu tym, że zawiera dane dotyczące stronicowania, kryteria filtrowania rekordów itp.

_user to nazwa formularza wywoływanego dla każdego z listowanych elementów.

Tworzymy dla niego pliku _user.php

<?php

print "username=".$data->username.'<br />'; ?>

Zauważmy, że dane są przekazywane do zmiennej $data.

Testujemy: http://localhost/…./testusers/testzii

Aby móc zmieniać wygenerowane definicje formularzy -

Kontrolki Bootstrap

Kontrolki (widgety) zbudowane na podstawie biblioteki Bootstrap możemy używać po dołączeniu rozszerzenia Bootstrap, albo (bogatszego) Booster.

Wybierzmy tą drugą opcję. Ściągamy bibliotekę ze strony

http://yiibooster.clevertech.biz/widgets

Po ściągnieciu i rozpakowaniu biblioteki w protected/extensions - ustawiamy parametry w

protected/config/main.php

'preload'=>array('log','booster',),

^^^^^^^^

'modules'=>array(

....

'gii'=>array(

...

'generatorPaths' => array(

'booster.gii'

),

'components'=>array(

...

'booster' => array(

'class' => 'application.extensions.booster.components.Booster',

),

Użycie parametru 'generatorPaths' pozwala na wzbogacenie generatora gii. Możemy wygenerować od razu wszystkie widoki CRUD i kontroler do ich wywoływania. Oczywiście możemy formularze zmieniać korzystając z opisów kontrolek http://yiibooster.clevertech.biz/widgets

Ostatnia modyfikacja: sobota, 31 październik 2015, 08:59