Moduł

Moduł jest samowystarczalną jednostką aplikacji, która zawiera modele, widoki, kontrolery oraz inne wspierające komponenty. W wielu aspektach, moduły przypominają aplikację. Główna różnica jest taka, że moduł nie może istnieć sam i musi rezydować w aplikacji. Użytkownicy posiadają dostęp do kontrolerów w modułach w ten sam sposób jak w kontrolerze aplikacji.

Moduły są użyteczne w kilku scenariuszach. Dla dużych aplikacji, możemy ją podzielić na kilka modułów, każdy z nich może być pisany oraz zarządzany osobno. Część wspólnie używanych funkcjonalności, takich jak zarządzanie użytkownikami, zarządzanie komentarzami, mogą być opracowywane w postaci modułów, które można łatwo ponownie wykorzystać w przyszłych projektach.

1. Tworzenie modułu

Moduł jest zorganizowany w katalogu, którego nazwa służy jako jego unikalne ID. Struktura katalogów modułu jest podobna do tej z katalogu głównego aplikacji. Poniżej pokażemy typową strukturę modułu nazwanego forum:

forum/
   ForumModule.php            klasa modułu
   components/                posiada komponenty użytkownika do ponownego użycia
      views/                  zawiera pliki widoków dla widżetów
   controllers/               zawiera pliki klas kontrolerów
      DefaultController.php   plik domyślnego kontrolera klasy
   extensions/                zawiera zewnętrzne rozszerzenia
   models/                    zawiera pliki modeli klas
   views/                     zawiera pliki widoku kontrolera oraz układów
      layouts/                zawiera pliki układów widoku
      default/                zawiera plik widoku dla DefaultController (domyślnego kontrolera)
         index.php            plik widoku index

Moduł musi posiadać klasę modułu, która dziedziczy z CWebModule. Nazwa klasy zależy od wyniku wyrażenia ucfirst($id).'Module', gdzie $id odpowiada ID modułu (lub katalogowi modułu). Klasa modułu służy jako główne miejsce dla przechowywania informacji współdzielonych wewnątrz kodu modułu. Na przykład, możemy użyć CWebModule::params do przechowywania parametrów modułu oraz CWebModule::components do dzielenia komponentów aplikacji na poziomie modułu.

Wskazówka: Aby utworzyć podstawowy szkielet nowego modułu możemy używać generatora modułów zawartego w Gii.

2. Używanie modułów

Aby używać modułu, najpierw umieść moduł w katalogu modules w katalogu głównym aplikacji. Następnie zadeklaruj ID modułu we właściwości modules aplikacji. Na przykład, w celu używania powyższego modułu forum, możemy używać następującej konfiguracji aplikacji:

return array(
    ......
    'modules'=>array('forum',...),
    ......
);

Moduł może również zostać skonfigurowany poprzez wartości inicjalne właściwości. Sposób użycia jest bardzo podobny do tego z konfiguracji komponentów aplikacji. Na przykład, moduł forum może mieć właściwość nazwaną postPerPage (ilość postów na stronę) w swojej klasie, która może zostać skonfigurowana w [konfiguracji aplikacji(/doc/guide/basics.application#application-configuration) następująco:

return array(
    ......
    'modules'=>array(
        'forum'=>array(
            'postPerPage'=>20,
        ),
    ),
    ......
);

Dostęp do instancji modułu można uzyskać poprzez właściwość module aktualnie aktywnego kontrolera. Poprzez instancję modułu, możemy uzyskać dostęp do informacji dzielonych na poziomie modułu. Na przykład, w celu uzyskania dostępu do powyższej informacji o ilości postów na stronę postPerPage, możemy użyć następującego wyrażenia:

$postPerPage=Yii::app()->controller->module->postPerPage;
// lub następująco jeśli $this oznacza instancję kontrolera
// $postPerPage=$this->module->postPerPage;

Dostęp do akcji kontrolera w module można uzyskać poprzez trasę IDmodułu/IDkontrolera/IDakcji. Na przykład zakładając, że powyższy moduł forum posiada kontroler nazwany PostController, używamy trasy forum/post/create aby odnieść się do akcji create w tym kontrolerze. Odpowiadający tej trasie adres URL będzie następujący http://www.example.com/index.php?r=forum/post/create.

Wskazówka: Jeśli kontroler jest podkatalogiem katalogu controllers możemy wciąż używać powyższego formatu trasy. Na przykład zakładając, że kontroler PostController znajduje się wewnątrz forum/controllers/admin, możemy odnieść się do akcji create używając forum/admin/post/create.

3. Zagnieżdżone moduły

Liczba zagnieżdzeń modułów jest nieograniczona. Oznacza to, że jeden moduł może posiadać inne moduły, które mogą posiadać kolejne moduły. Pierwszego nazywamy modułem rodzica a drugiego modułem dziecka. Moduły dzieci muszą zostać zadeklarowane we właściwościach modules swego rodzica, w taki sam sposób jak moduły w konfiguracji aplikacji z wcześniejszych przykładów. Aby uzyskać dostęp do akcji modułu dziecka, powinniśmy skorzystać z trasy IDModułuRodzica/IDModułuDziecka/IDKontrolera/IDAkcji.

$Id: basics.module.txt 2890 2011-01-18 15:58:34Z qiang.xue $

Total 1 comment

#2235 report it
Trejder at 2010/11/30 03:11am
Wymagana deklaracja wartości początkowych!

Aby przykład z używaniem wartości początkowych (zob. "2. Używanie modułów") działał, konieczne jest, aby ustawiana w podany sposób właściwości była zadeklarowana w głównym pliku modułu!

Na przykład. Jeśli tworzony jest moduł forum i ustawiana jego właściwość postPerPage (jak w przykładzie), konieczna jest edycja pliku protected/modules/forum/ForumModule.php i dodanie na jego początku następującego kodu:

class UserModule extends CWebModule
{
    public $postPerPage = 20;
    ...
}

gdzie 20 to domyślna wartość tej właściwości, na wypadek, gdyby użytkownik nie określił własnej w konfiguracji aplikacji używającej tworzonego modułu.

Bez tej deklaracji zostanie wyświetlony błąd 500 mówiący o tym, że właściwość ForumModule.postPerPage jest niezdefiniowana.

Leave a comment

Please to leave your comment.