Jak stworzyć moduł

Aplikację dzielimy na moduły, które:

  • mogą być wykorzystane w różnych aplikacjach;

  • pozwalają na lepsze zarządzanie kodem i łatwiejszy podział pracy;

Moduły są przechowywane w katalogu protected/modules. Nazwa modułu jest taka jak nazwa podkatalogu. Może zawierać podobnie jak aplikacja kontrolery, modele i widoki.

Najprostszy moduł (załącznik mod01.zip) o nazwie books składa się z pliku BooksModule.php zawierającego definicję klasy o takiej samen nazwie, na bazie klasy CwebModule::

<?php

class BooksModule extends CwebModule {

public function init() {

$this->setImport(array(

'books.models.*',

'books.components.*',

));

}

}

Funkcja setImport w tym wypadku wskazuje, że ma zaimportować modele i komponenty. Dodajemy standardowy kontroler (controler/DefaulrControler.php):

<?php

class DefaultController extends Controller {

public function actionIndex() {

$this->render('index');

}

}

Widać w nim renderowanie widoku index (views/default/index.php).

Aby taki moduł móc użyć w aplikacji, należy dopisać go do pliku konfiguracyjnego:

'modules'=>array( ...

'books',

W pliku modułu możemy zdefiniować zmienne publiczne i funkcje. Na przykład zmienna $title:

<?php

class BooksModule extends CwebModule {

public $title;

public function init() {

$this->setImport(array(

'books.models.*',

'books.components.*',

));

}

}

Zmienne te można inicjować w funkcji init, albo w pliku konfiguracyjnym, podając parametry modułu w postaci tablicy:

'modules'=>array(

'books'=>array('title'=>'Moje książki',),

Zarówno w kontrolerze jak i widoku, obiekt modułu jest dostępny poprzez zmienną $this->module. Oznacza to, że możemy odwołać się do zmiennej (pola) modułu na przykład tak:

<?php echo $this->module->title; ?>

Możemy też sięgać do innych modułów:

<?php echo Yii::app()->getModule('inny_modul')->title; ?>

Aby to było możliwe, musimy poszerzyć import w funkcji init:

$this->setImport(array(
'books.models.*',
'books .components.*',
'inny_modul.models.inny_modul ',
));
Często spotykanym rozwiązaniem jest zdefiniowanie w module własnej funkcji tłumaczącej komunikaty w wielojęzycznym środowisku. Na przykład:

public static function t($str='',$params=array()) {
return Yii::t("books", $str, $params);
}

Wówczas możemy jej używać w miejsce funkcji Yii::t() - bez potrzeby podawania pierwszego parametru (nazwy modułu):

echo BooksModule::t('Treść komunikatu');

Aby wywołać akcję zdefiniowaną w module, trzeba jej nazwę poprzedzić nazwą modułu (podając tylko nazwę modułu wywołujemy akcję domyślną z domyślnego kontrolera).

Aby uprościć wywołanie (url) możemy skorzystać z definicji UrlMenagera w konfiguracji. Na przykład definiując:

'urlManager'=>array(

'urlFormat'=>'path',

'showScriptName' => false, // usuniecie index.php z adresu

'rules'=>array(

'ksiazki' => 'books/ksiazki/',

'autor'=>'books/autor',

powodujemy, że w wywołaniu books/ksiazki i books/autor można pominć nazwę modułu ('books').

Ostatnia modyfikacja: piątek, 29 styczeń 2016, 22:23