Tímto příspěvkem začínám seriál o vytvoření vlastního modulu pro Group Office verze 4. V seriálu se nebudu odkazovat na žádné jiné návody, veškeré postupy jsou založené na zkušenostech při vývoji modulů pro Group Office.

V první části se seznámíme s datovou strukturou modulu, která by vždy měla obsahovat následující části:

  • controller
  • install
  • language
  • model
  • views
  • soubor definující modul

Kompletní struktura je pak zobrazena na následujícím obrázku. Krom základních adresářu obsahuje adresáře popisující cron a customfields.

Od verze 4 dispojuje GroupOffice MVC architekturou a tomu i odpovídá výše zmíněná struktura. Databázové modely jsou tedy definovány v adresáři model, controller obsahuje informace o jednotlivých akcích kontrolerů a views definuje jednotlivé view - v tuto chvíli ExtJS 3. Samotná témata/styl a vzhled jsou definovány v adresáři themes jednotlivých views.

Soubor s definicí modulu má vždy tvar <nazevModulu>Module.php. Samotná třída v tomto souboru kopíruje kvůli autoloaderu adresářovou strukturu GO_<nazevModulu>_<nazevModulu>Module, která rozšiřuje třídu GO_Base_Module.

<?php
GO_Example_ExampleModule extends GO_Base_Module
{
    public function autoInstall()
    {
        return true; //automaticky instaluje modul do DB
    }

    public function author()
    {
        return 'Michal Charvát'; //jméno autora
    }

    public function authorEmail()
    {
        return 'info@michalcharvat.cz'; //email autora
    }

Výše uvedená třída nám definuje obecně modul bez dalších funkcí. Obecně by stačilo zadat pouze funkci autoInstall(), která je defaultně nastavena na hodnotu false.

Dalším krokem, který se Vám většinou bude hodit, je funkce vracející výchozí kategorii či skupinu záznamů, ke které se váží oprávnění.
Oprávnění samotná se dělí na dvě skupiny:

  • oprávnění modulu
  • oprávnění skupin záznamů + jednotlivé záznamy

Oprávnění modulu definují, jaká oprávnění má uživatel v daném modulu. Pokud je ale modul dělen ještě na skupiny záznamů, obdobně jako poznámky, pro každého uživatele je nutné definovat práva do jednotlivých skupin, neboť se právy modulu neřídí (za předpokladu, že se držíte standardního postupu tvorby modulu).

public static function getDefaultCategory($userId)
{
    //na zaklade userId vyhledame GO uzivatele
    $user = GO_Base_Model_User::model()->findByPk($userId);
    if (!$user) {
        return false;
    }
    //vybereme vychozi kategorii vybraneho uzivatele
    $category = GO_Example_Model_Category::model()->getDefault($user);
    return $category;
}

Poslední funkcí, kterou budete pravděpodobně potřebovat je firstRun. Jedná se o funkci, která je volána pouze při prvním kontaktu s modulem v dané SESSION. Funkce se většinou hodí na definici vlastností, které chcete předat do view, což je řešeno pomocí pole, které obsahuje klíč exportVariables:

public static function firstRun()
{
    parent::firstRun();
    //zjistime vychozi kategorii na zaklade prihlaseneho uzivatele
    $category = self::getDefaultCategory(GO::user()->id);

    return array(
        'exportVariable' => array(
            'GO' => array(
                'example' => array( //nazev modulu
                    'defaultCategory' => array(
                        'id' => $category->id,
                        'name' => $category->name
                    )
                )
            )
        )
    );
}

Tímto bych ukončil základní informace o modulu jako takovém. V dalším díle bychom si rozebrali základní práci s DB modelem.