0 follower

Moduler

MÀrk: Stöd för moduler har varit tillgÀngligt fr o m version 1.0.3.

En modul Àr en komplett och oberoende mjukvaruenhet som bestÄr av modeller, vyer, kontrollrar samt andra stödkomponenter. En modul motsvarar ur mÄnga aspekter en applikation. Den huvudsakliga skillnaden Àr att en modul inte kan sÀttas ut pÄ egen hand, den mÄste hÀrbÀrgeras i en applikation. AnvÀndare kan komma Ät en kontroller i en modul sÄ som de gör med en vanlig kontroller pÄ applikationsnivÄ.

Moduler Àr anvÀndbara i ett flertal scenarier. En storskalig applikation kan delas upp i flera moduler, som var och en utvecklas och underhÄlls separat. Vissa vanligen anvÀnda finesser, som administrering av anvÀndare eller kommentarhantering, kan utvecklas i form av moduler vilka utan svÄrighet kan ÄteranvÀndas i kommande projekt.

1. Skapa modul ¶

En modul organiseras i en katalog vars namn bildar dess unika ID. Modulkatalogens struktur liknar strukturen hos applikationens rotkatalog. Nedan visas den typiska katalogstrukturen för en modul benÀmnd forum:

forum/
   ForumModule.php            modulens klassfil
   components/                innehÄller ÄteranvÀndbara komponenter
      views/                  innehÄller vyfiler för widget
   controllers/               innehÄller kontrollerklassfiler
      DefaultController.php   standardkontrollerns klassfil
   extensions/                innehÄller tredjepartstillÀgg
   models/                    innehÄller modellklassfiler
   views/                     innehÄller kontrollervyfiler och layoutfiler
      layouts/                innehÄller layoutvyfiler
      default/                innehÄller vyfiler för DefaultController
         index.php            fil som innehÄller indexvy

En modul mÄste ha en modulklass som Àrver frÄn och utvidgar CWebModule. Klassnamnet bildas med hjÀlp av uttrycket ucfirst($id).'Module', dÀr $id refererar till modulens ID (lÀs: modulens katalognamn). Modulklassen utgör den centrala platsen för lagring av information som skall delas av modulens kod. Vi kan till exempel anvÀnda CWebModule::params för lagring av modulparametrar, samt anvÀnda CWebModule::components för att dela applikationskomponenter pÄ modulnivÄ.

Tips: Verktyget yiic kan anvÀndas för att skapa det grundlÀggande skelettet till en ny modul. Till exempel, för att skapa ovanstÄende forum-modul, kan vi exekvera följande kommandon i ett kommandoradsfönster:

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

2. AnvÀnda modul ¶

För att anvÀnda en modul, placera först modulkatalogen under katalogen modules i applikationens rotkatalog. Deklarera sedan modulens ID i applikationens property modules. För att till exempel anvÀnda ovanstÄende forum-modul, kan följande applikationskonfiguration anvÀndas:

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

En modul kan Àven konfigureras med initiala propertyvÀrden. TillvÀgagÄngssÀttet Àr mycket snarlikt konfigurering av applikationskomponenter. Exempel: forum-modulen kan i sin modulklass ha en property postPerPage, vilken kan konfigureras i applikationskonfigurationen pÄ följande sÀtt:

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

Modulinstansen kan kommas Ät via propertyn module i den för tillfÀllet aktiva kontrollern. Genom modulinstansen kan vi sedan nÄ information som delas pÄ modulnivÄ. Exempelvis kan följande uttryck anvÀndas för att komma Ät ovanstÄende postPerPage-information:

$postPerPage=Yii::app()->controller->module->postPerPage;
// or the following if $this refers to the controller instance
// $postPerPage=$this->module->postPerPage;

En kontrollerÄtgÀrd i en modul kan nÄs via en route pÄ formatet moduleID/controllerID/actionID. Exempel: om vi antar att ovanstÄende forum-modul har en kontroller PostController, kan vi som route anvÀnda forum/post/create för att referera till ÄtgÀrden create i denna kontroller. Motsvarande URL för denna route blir dÄ http://www.example.com/index.php?r=forum/post/create.

Tips: Om en kontroller finns i en underkatalog till controllers, kan vi fortfarande anvÀnda ovanstÄende route format. Till exempel om PostController Àr placerad under forum/controllers/admin kan vi referera till ÄtgÀrden create genom att anvÀnda forum/admin/post/create.

3. NÀstlad modul ¶

Moduler kan vara nÀstlade. Det vill sÀga, en modul kan innehÄlla en annan modul. Vi kallar den förra förÀldramodul (parent module), den senare barnmodul (child module). Barnmoduler mÄste placeras i underkataloger till förÀldramodulens modules-katalog. För att komma Ät en kontrollerÄtgÀrd i en barnmodul, anvÀnder vi följande route parentModuleID/childModuleID/controllerID/actionID.