HTML

Az élet kódjai

Csináld maga. Senki nem csinálja meg helyetted.

Friss topikok

Modul fejlesztés Drupal alatt

2012.12.19. 14:48 Travis.CG

Kaptam egy megbízást, hogy régi bioinformatikai weboldalakat ültessek át Drupal alá. A Drupal alapvetően szimpatikus kezdeményezés, mivel megkönnyíti a weblapkészítést. Most sajnos nem tudtam összeklikkelni az egész oldalt, kénytelen voltam modulokat fejleszteni, hogy az egyes szolgáltatások beviteli mezőit integrálhassam.

Mint a legtöbb modul rendszernél, itt is callback függvényeket kell használnunk, amit a Drupal terminológia hook-oknak nevez. Szinte minden funkcióhoz megtalálhatjuk a megfelelő hook függvényt. Ezen kívül csak két dolgot érdemes még tudni a modulokról: asszociatív tömböket használnak, a modul nevén alapuló névkonvenció van. Gyakorlatilag ennyit kell tudni a Drupal modulokról. Most nézzük meg kicsit részletesebben:

A modul nevén alapuló konvenció

Ez azt jelenti, hogy a modul nevét nagyon sokszor le kell írni. Először is létre kell hozni egy könyvtárat. A könyvtár neve a modul neve lesz. Minimum két fájl lesz benne, mindkettő a modul nevét tartalmazza, de az egyik .module kiterjesztést, a másik .info kiterjesztést kap. Az .info fájl egyfajta katalógusként szolgál, olyan információk kerülnek bele, mint a névtér, dependencia, minimális Drupal verziószám.

A .module fájlba kerül a kód. A kód a hook függvényeket tartalmazza. Minden hook függvény a modul nevéből, aláhúzásból és a hook típusának nevéből áll. Például ha van egy vacak nevű modulunk, akkor a vacak_menu lesz a függvény neve. Ezzel egy új elemet vehetünk fel a navigációs menübe.

Asszociatív tömbök

Minden függvény, ami a Drupal környezettel akar kommunikálni, egy asszociatív tömböt ad vissza. A kulcsok nevei és az értékek függvényenként eltérnek. Gyakorlatilag a modulfejlesztés ezen kulcs-érték párok bebiflázásából áll. Nem tudom, hogy ez a módszer-e a jobb, vagy a Spring XML konfigurációs megközelítése, de hajlok arra, hogy van valami harmadik út is, ami mindkét módszert veri. A probléma a Drupal megoldásával, hogy nem hibatűrő. Egy string elírása nem feltétlenül okoz hibaüzenetet, legfeljebb csodálkozhatunk, miért nem úgy működik a kód, ahogy elvárjuk. A másik gond, hogy ha már stringeket kell beírogatni, akkor legalább legyen konzekvens névhasználat. Egyszer ugyanis aláhúzással vannak elválasztva a kulcsban a szavak, máshol szóközzel.

Példának okáért nézzünk meg egy menü hook függvényt.

function example_menu(){
  $item['ExampleMenu'] = array(
    'title' => 'Title of the menu',
    'page callback' => 'myexamplefunc',
    'page arguments' => array('first', 'second'),
    'access callback' => TRUE,
  };

  return $item;
}

A modul neve tehát example, a menu neve, amit a felhasználó látni fog: Title of the menu, míg az adminisztrátori oldalon, a Navigation menüben az ExampleMenu név alatt érhetjük el. A menüre kattintva lefut a myexamplefunc függvény, aminek a paraméterei first és second lesz. A menüt minden felhasználó elérheti, erről gondoskodik az access callback rész.

A dokumentáció részletesen ír ezekről a stringekről, de a példaalkalmazások szerintem informatívabbak. Az egyik bajom a Drupal dokumentációjával, hogy bár tartalmaznak mindent, megtalálni a lényeget nagyon nehéz. Ha viszont a példaalkalmazásokban látott dolgokra keresünk rá, hamarabb célt érünk. Hasznos a felhasználói hozzászólások figyelése is, mert az is célorientált.

Formok

Statikus tartalmakat modulként fejleszteni időpazarló, azokat inkább klikkeljük össze az adminisztrációs felületen. Formokat is rakhatunk össze adminisztrációs felületen, de véleményem szerint ezt célszerűbb programkódra bízni.

Form esetén az page callback drupal_get_form lesz. Tehát a megjelenítést a Drupal motorja végzi. Azt, hogy mi jelenjen meg, mi határozhatjuk meg a page arguments részben. Itt soroljuk fel a függvényünket és annak paramétereit.

   'page callback' => 'drupal_get_form',
   'page arguments' => array('myform'),

Ezután három függvényt kell létrehozni. Az első a myform, ami megjeleníti a beviteli mezőket. A myform_validate ellenőrzi a mezők értékeit, végül a myform_submit segítségével feldolgozzuk azokat. Mindhárom függvény két paramétert kap: Az első tartalmazza a beviteli mezőkértékeit egy asszociatív tömbben, a második pedig a form állapotát. Ez utóbbit referencia szerint adjuk át.

A következő példa egy olyan formot készít, ami egy szöveges beviteli mezőt és a checkbox-ot tartalmaz:

function myform($form, &$form_state){
  $form['firstinput'] = array(
    '#title' => 'Put you secret data here',
    '#type'  => 'textfield',
    '#default_value' => 'default',
  );
  $form['secondinput'] = array(
     '#title' => 'It is a secret?',
     '#type'  => 'checkbox',
  );
  $form['submit'] = array(
     '#type' => 'submit',
     '#value' => 'Send to me',
  );

  return $form;
}

A formunk egy tömbökből álló tömb. Minden elem egy beviteli mező, az értékek egy újabb asszociatív tömbben vannak. Elég unalmas leprogramozni. A #type mező minden elemnél kötelező, de a további kombinációk itt találhatóak.

Drupal alá modult írni nem bonyolult feladat, inkább kitartást igényel. A rendszer előnye, hogy a statikus tartalmakat egy kényelmes szerkesztőfelületen készíthetjük el, de összetetteb feladatok esetén használhatjuk programozási ismereteinket is. A honlapkészítés egyik legkönnyebb módja.

Szólj hozzá!

Címkék: programozás

A bejegyzés trackback címe:

https://cybernetic.blog.hu/api/trackback/id/tr504967590

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

Nincsenek hozzászólások.
süti beállítások módosítása