A hook_form_alter() a gyakorlatban

Hojtsy Gábor képe

A Drupal.hu frissítésével merült fel az igény arra, hogy bizonyos a fejlesztői csapat által kevésbé lényegesnek ítélt node szerkesztő mezőknek mégis nagyobb jelentőséget tulajdonsítsunk a felület megjelenítésekor, így a Drupal 4.7.0-val érkezett új tömbökre épülő űrlap építő rendszer egyik előnyös tulajdonságát, a hook_form_alter() űrlap módosító hurok képességeit kellett igénybe vennem. Ráadásul ezt Őry Máté fordítói levlistára beküldött magyar dátumokat támogató megoldásával fűszereztem, így egy kis ismertető alapja éppen összeállt.

A Drupal 4.7.0-ás kiadásának legnagyobb fejlesztői változása a teljesen átalakított űrlap összeállításért és ellenőrzésért felelős rendszer, mely a korábbi Drupal verziókkal összehasonlítva valamelyest bonyolutabb, de ugyanakkor sokkal rugalmasabb programozást tesz lehetővé. Megtehetjük például, hogy meglévő űrlapokba új elemeket veszünk fel, beviteli mezők csoportjait sorrendezünk át, és hasonlók.

Lássuk, hogy ezen írás születésekor mit teszünk a drupalhu.module kódjában:

// A drupalhu modul weight értéke nagyra
// van állítva az adatbázsiban, ezért ez
// hívódik meg legutoljára a form_alter()-ek közül
function drupalhu_form_alter($form_id, &$form) {
// Node form átírása
if (preg_match("!_node_form$!", $form_id)) {
// Node típusok a path és options megnyitásához
$openpath = in_array($form['type']['#value'], array('story', 'book', 'page'));
$openoptions = $openpath || $form['type']['#value'] == 'weblink';

// Opciók megnyitása
if (isset($form['options']) && $openoptions) {
$form['options']['#collapsed'] = FALSE;
}
// Álnév kötelező vagy nem látszik
if (isset($form['path'])) {
if ($openpath) {
$form['path']['#collapsed'] = FALSE;
$form['path']['#weight'] = -2;
$form['path']['path']['#title'] = 'Az útvonal álneve';
$form['path']['path']['#required'] = TRUE;
}
else {
unset($form['path']);
}
}
}
// Magyar dátum megjelenítéshez a beállítás
// űrlap átírása Őry Máté kódja alapján
if ($form_id == 'system_settings_form') {
$hu_formats = array(
'short' => 'Y. m. d. H.i',
'medium' => 'Y. F j. H.i',
'long' => 'Y. F j., l H.i'
);
foreach ($hu_formats as $n => $f) {
$form['dates']['date_format_' . $n]['#options'][$f] = format_date(time(), 'custom', $f) . ' (magyar)';
$form['dates']['date_format_' . $n]['#default_value'] = variable_get('date_format_' . $n, $f);
}
}
}
?>

Mikor fut le a drupalhu_form_alter()?

Mindig lefut egyszer, amikor egy űrlap összeállítása során módosíthatjuk annak tartalmát, szerkezetét. Számunkra azonban nem mindegy, hogy más módosító függvényekhez képest mikor hívódik meg saját függvényünk. Mint a függvény előtti megjegyzés is mutatja, fontos, hogy meggyőződjünk róla, hogy a drupalhu_form_alter() függvényünk eléggé későn hívódik meg. A node szerkesztő űrlap 'path' eleme ugyanis szintén egy form_alter megvalósításon keresztül kerül az űrlapra, és ha alfabetikus sorrendben futnának le a modulok, akkor itt még nem látnánk azt az elemet, így nem is tudnánk befolyásolni. A meghívási sorrendet az adatbázis system táblájának weight értékével szabályozhatjuk. A nagyobb súlyú modulok hurkai később hívódnak meg, mint a kisebb súlyúaké.

A módosítandó űrlap kiválasztása

Két űrlapot fogunk módosítani a rendszerben, ezeket a $form_id alapjánt tudjuk azonosítani. A második eset egyszerűbb, hiszen a system_settings_form egyértelműen azonosítja a rendszer beállítások űrlapját. Az első esetben azonban egy story_node_form típusú űrlap azonosítót fogunk kapni, tehát a node típus is szerepel az azonosítóban. Ezért én egy mintaillesztő kifejezést választottam a megfelelő végződés megállapítására. A path_form_alter() egy másik megoldást is mutat ugyanerre a kérdésre.

Node szerkesztő felület testreszabása

Tekintsük az első űrlap módosítást, ahol tehát a node szerkesztő űrlap tulajdonságait változtatjuk meg. Az, hogy adott esetben milyen tömb struktúrán tudunk módosításokat végezni részben a node_form_array(), részben pedig a path_form_alter() függvényből tudjuk kideríteni.

Először is ha a szerkesztőség által jóváhagyandó tartalommal van dolgunk, és már jelen van az adminisztrátorok számára űrlapba tett 'options' mezőcsoport, amelyben a közzétételre, kiemelésre és más általános lehetőségekre vonatkozó beállítások találhatóak, akkor ezt kinyitjuk. Másodszor pedig a webcím álnév beállító csoportját emeljük ki az űrlap elejére, a taxonómia beállítás utánra azoknál a tartalmaknál, melyekhez álnév szokott tartozni. Ráadásul az elemcsoportban kötelezővé tesszük az álnév megadására szolgáló elem kitöltését. Ezzel nem kerülhet álnév nélküli szerkesztett tartalom a rendszerbe. Azért kell címet adnunk az elemnek, mert ezt használja fel a Drupal a hibaüzenet kiírásakor, és emellett jelenhet meg a piros csillag, ami a kötelező kitöltést jelzi. Végül amely típusoknál nem használunk álneveket (weblink és forum a drupal.hu esetében), ott ennek a beállítási lehetőségét el is tüntetjük.

Magyar weblapra magyar dátumokat

Őry Máté küldte be nemrég a fordítói levelezőlistára megoldását, mely szintén a form_alter hurkot használja arra, hogy lehetővé tegye helyes magyar dátum formátumok kiválasztását a rendszer beállításainál. Ennek egy jelentősen rövidített, ám funkcionalitásában többet adó megoldását adtam hozzá a drupalhu.module kódjához.

Tehát ha a system_settings_form űrlappal van dolgunk, akkor ennek dátumokra vonatkozó lehetőségeit szeretnénk kibővíteni a magyar formátum választhatóságával. A módosítható elemek a system_view_general() függvényben azonosíthatóak.

A megoldás elérése érdekében felvesszük a három lehetséges dátum részletezettségnek (short, medium, long) megfelelő magyar formátumokat egy tömbbe. A system_view_general kódjából tudjuk, hogy $form['dates']['date_format_short'] és hasonló nevű űrlap mezők teszik lehetővé a dátum kiválasztását. Ezek választási lehetőségeihez felvesszük a magyar formátumokat, sőt oda is írjuk a minták végére, hogy ezek a helyes magyar dátum formátumok, ugyanis sokan nem tudják például, hogy a magyar idő kijelzésben az óra és perc számait pont választja el egymástól. Végül pedig beállítjuk ezeket a formátumokat alapértelmezésnek, tehát ha még nem állítottak be semmit, akkor a rendszer ezt ajánlja fel.

Fontos megjegyezni, hogy ettől a változtatástól függetlenül a dátumok alapértelmezése nem a magyar formátum lesz a rendszerben, hiszen a máshol használt variable_get() hívásoknak más alapértelmezése van. Ezért vagy az adminisztrációs felületen kell beállítanunk a most már rendelkezésre álló magyar dátum formátumot, vagy az adatbázisban kell átszerkesztenünk. A fenti kódnak köszönhetően a felületen egyszerűbb dolgunk lesz.

Zárszó

A fenti két példa remélhetőleg megmutatta, hogy a Drupal 4.7-es sorozat új űrlap összeállítási rendszere megkönnyíti az életünket, hiszen saját fejlesztéseinket az alap modulok módosítása helyett elkülönített függvényekbe helyezhetjük, megkönnyítve a későbbi hibakeresést és frissítést is.

Hozzászólások

Őry Máté képe

jó leírás, összeszedett, használható. kéne még sok ilyen