0 follower

Module

Nota: Suportul pentru module este disponibil incepand cu versiunea 1.0.3.

Un modul este o unitate software de sine statatoare care este formata din modele, view-uri, controllere si alte componente suportate. In multe privinte, un modul seamana cu o aplicatie. Principala diferenta este ca un modul nu poate fi decat in interiorul unei aplicatii. Utilizatorii pot accesa controller-ele dintr-un modul la fel cum acceseaza controller-ele normale din aplicatie.

Modulele sunt utile in cateva scenarii. Pentru o aplicatie complexa, putem alege sa o impartim in mai multe module, fiecare fiind dezvoltat si intretinut separat. Unele feature-uri, folosite in mod obisnuit, precum gestiunea utilizatorilor, gestiunea comentariilor, pot fi dezvoltate ca module astfel incat ele vor fi reutilizate usor in proiectele viitoare.

1. Creare modul

Un modul este organizat ca un director al carui nume este ID-ul sau unic. Strunctura directorului modulului este similara cu cea a directorului de baza al aplicatiei. Structura de directoare tipica a unui modul cu numele forum ar arata in felul urmator:

forum/
   ForumModule.php            fisierul clasei modulului
   components/                contine componente utilizator reutilizabile
      views/                  contine fisierele view ale widget-urilor
   controllers/               contine fisierele claselor controller-elor
      DefaultController.php   fisierul clasei controller-ului implicit
   extensions/                contine extensii third-party
   models/                    contine fisierele cu clasele modelelor
   views/                     contine fisierele de layout si view-urile controller-elor
      layouts/                contine fisierele layout pt view-uri
      default/                contine fisierele view pentru DefaultController
         index.php            view-ul index 

Un modul trebuie sa aiba o clasa de modul care sa fie derivata din CWebModule. Numele clasei este determinat folosind expresia ucfirst($id).'Module', unde $id se refera la ID-ul modulului (acelasi cu numele directorului modulului). Clasa modulului serveste ca loc central pentru stocarea informatiilor vizibile peste tot in codul modulului. De exemplu, putem folosi CWebModule::params pentru a stoca parametrii modulului si sa folosim CWebModule::components pentru a shera componentele aplicatiei la nivelul modulului.

Sfat: Putem folosi unealta yiic pentru a crea un schelet simplu al unui nou modul. De exemplu, pentru a crea modulul forum de mai sus, putem executa urmatoarele comenzi intr-o linie de comanda:

% cd WebRoot/testdrive
% protected/yiic shell
Yii Interactive Tool v1.0
Please type 'help' for help. Type 'exit' to quit.
>> module forum

2. Folosirea modulului

Pentru a folosi un modul, trebuie sa punem directorul modulului in directorul modules din directorul de baza al aplicatiei. Apoi sa declaram ID-ul modulului in proprietatea modules a aplicatiei. De exemplu, pentru a folosi modulul forum de mai sus, putem folosi urmatoarea configuratie de aplicatie:

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

Un modul poate sa fie de asemenea configurat cu valori initiale pentru proprietatile sale. Folosirea este foarte similara cu configurarea componentelor aplicatiei. De exemplu, modulul forum poate avea o proprietate cu numele postPerPage (in clasa sa) care poate fi configurata in configuratia aplicatiei in felul urmator:

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

Instanta modulului poate fi accesata prin proprietatea module a controller-ului activ in acest moment. Prin instanta modulului, putem accesa apoi informatiile care sunt sherate la nivel de modul. De exemplu, pentru a accesa informatia postPerPage de mai sus, putem folosi urmatoarea expresie:

$postPerPage=Yii::app()->controller->module->postPerPage;
// sau urmatoarea daca $this se refera la instanta controller-ului
// $postPerPage=$this->module->postPerPage;

Un action de controller din interiorul unui modul poate fi accesat prin ruta moduleID/controllerID/actionID. De exemplu, presupunand ca modulul forum de mai sus are un controller cu numele PostController, putem folosi ruta forum/post/create pentru a ne referi la action-ul create din acest controller. URL-ul corespunzator pentru aceasta ruta va fi http://www.example.com/index.php?r=forum/post/create.

Sfat: Daca un controller este intr-un subdirector din controllers, inca putem folosi formatul rutei de mai sus. De exemplu, presupunand ca PostController este sub forum/controllers/admin, putem sa apelam action-ul create folosind ruta forum/admin/post/create.

3. Module imbricate

Modulele pot fi imbricate. Adica, un modul poate contine alt modul. Le puntem denumi modulul parinte si modulul copil. Modulele copil trebuie sa fie pus in directorul modules al modulului parinte. Pentru a accesa un action al unui controller dintr-un modul copil, trebuie sa folosim ruta parentModuleID/childModuleID/controllerID/actionID.