Amikor változtatni kell a Drupal kódján (1)

Hojtsy Gábor képe

Májusban egy Drupal without modifications című szál kapott erőre a Drupal fejlesztői levelezőlistán, mely arról is szólt, hogy szükséges-e módosításokat végrehajtanunk a Drupal alap kódján ahhoz, hogy a kívánt webhelyet megkapjuk. Ez természetesen azzal a komoly igazsággal zárult, hogy "attól függ". A Drupal.hu kialakításakor például szigorú vezérelv volt, hogy alap telepítést használjunk, csak modulokkal kiegészítve a rendszert. Így ahelyett, hogy varázslatokat művelnénk, a maga valóságában tudjuk bemutatni a Drupal rendszert. A módosítások elkerülése sok esetben működik, de nem minden esetben tartható.

A jelenleg Drupal 4.6 alapú Weblabor.hu esetében például nem tudtunk megoldani néhány dolgot anélkül, hogy a Drupal alapmotor forráskódon változtattunk volna. Minden esetben igyekeztünk átgondolni, hogy szükségünk van-e egy-egy változtatásra, és időről-időre visszatérünk ezekre a kérdésekre. Éppen egy ilyen nemrég megvalósult "visszatérés" ihlette ezt a kis tippet.

Dokumentáljuk a változásokat

Ha mégis módosítanunk kell valamit, minden esetben érdemes a változtatásokat a kódban dokumentálni. Mi erre a célra a +WL: megjegyzés előtagot választottuk, mely jól kereshető a kódban. A több soros változtatásoknál hosszabban írjuk le, hogy miért nyúltunk a kódba, de mindig egy sorba tesszük a megjegyzést, mert így később programozottan is egyszerűen kigyűjthető. Egy valós példa a Weblabor kódból:

// +WL: máshol jelenítjük meg az XML ikont
// $output .= theme('xml_icon', url('taxonomy/term/$tid/0/feed'));
?>

A kód közvetlen módosítása

A kód módosításának egyik útja, hogy közvetlenül a meglévő forrást szerkesztjük. Ezt főleg kisebb változtatások esetén alkalmazzuk, amikor csak 1-5 sort kell módosítani, vagy hozzáadni. Néhány érdekes változtatás, amit meg kellett tennünk:

  • A contact.module kódjában a szerkesztőség CC-zésének lehetősége. Pár sor változtatást igényelt.
  • Változtatható karakter kódolás az RSS csatornához. A node modul módosítását igényelte.
  • Hozzászólás űrlap megjelenítése csak azokon az oldalakon, ahol még nincs hozzászólás (különben a szálazás érdekében a válasz linkekre irányítjuk a figyelmet). Néhány karakteres módosítást kellett tennünk.

Érdekes, hogy ezek és még számos változtatásunk sokszor az űrlapokat érintik, amik a Drupal 4.7-estől kezdve bevezetett sokkal rugalmasabb tömb alapú megoldással már sokkal kevésbé igénylik majd a kód módosítását.

Számos kifejezetten Weblabor specifikus függvényt kiszerveztünk egy wllib.inc nevű fájlba, melyet a sites/default/settings.php fájlból töltünk be, így elkerülve, hogy emiatt módosítani kelljen a Drupal kódját. Így a módosításainkat kis méretűen tudjuk tartani, legalábbis, amikor további kódot kell hívni.

Meglévő viselkedés helyettesítése

A fenti rövid kódpélda esetében is érdemes elgondolkodni, hogy egyáltalán bárhol is szükségünk van-e az xml_icon megjelenítésére. Ha nincs, akkor természetesen a theme_xml_icon()-nak megfelelő saját smink függvényünket kell elkészíteni, üres visszatérési értékkel. Ez a Weblabor környezetében az azigazi_xml_icon() nevű függvény lenne. Esetünkben viszont úgy gondoltuk, hogy nem akarjuk teljesen eltávolítani ezt a rendszerből (bár valószínű ez a döntés is megérett a felülvizsgálatra).

Vannak azonban olyan helyzetek, amiket nem lehet egyszerű kód módosítással kezelni, és a smink függvényekhez hasonló felülíró mechanizmust sem kapunk, hanem jobban járunk, ha egy függvényt máshol definiálunk. Így alakult, hogy a drupal_get_path_map(), drupal_get_path_alias(), drupal_get_normal_path(), és a drupal_rebuild_path_map() függvényeket a kódban egyszerűen megjegyzésbe tettük, a +WL: magyarázattal ellátva, és a wllib.inc-ben valósítjuk meg a működésüket. Sajnos eléggé összetett álnév számítási rendszert fejlesztettünk ki, ragaszkodva a lehetőleg magyar webcímek használatához. Ez nagyon komoly teljesítmény problémákat okozott a 4.6-os álnév rendszerbe épüléssel, ezért a tesztjeink arra mutattak, hogy jobban tesszük, ha saját céljainkra optimalizált megvalósítást teszünk a kódba. Ráadásul emiatt több kisebb változtatást is el kellett végeznünk más modulokban is.

A változtatásokat kezelni kell

Az embernek könnyen "eljár a keze", akár meggondolatlanul is képes változtatásokat vinni a rendszerbe, ha szükségét látja. Sajnos ez gondot okozhat a későbbi frissítéskor, amin a speciális megjegyzések sem segítenek, ha egyszerűen csak felülmásoljuk a kódot. A következő részben azt szeretném leírni, hogy a fenti változtatások megtartása mellett hogyan tudjuk mégis folyamatosan frissíteni a Weblabor mögött működő Drupal rendszert.