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.