{"id":53,"date":"2013-10-21T20:13:51","date_gmt":"2013-10-21T18:13:51","guid":{"rendered":""},"modified":"2018-09-17T21:55:03","modified_gmt":"2018-09-17T19:55:03","slug":"moj-vlastny-modul-pre-drupal","status":"publish","type":"post","link":"https:\/\/spireng.sk\/en\/moj-vlastny-modul-pre-drupal\/","title":{"rendered":"M\u00f4j vlastn\u00fd modul pre Drupal"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"imgp_img\" style=\"float: left; margin: 2px 5px;\" src=\"\/sites\/default\/files\/imagepicker\/1\/dsfsd5df.jpg\" alt=\"Obr\u00e1zok\" width=\"200\" height=\"242\" \/>Drupal je Content Management System (CMS) zalo\u017een\u00fd na PHP jazyku. To CMS znamen\u00e1, \u017ee je to syst\u00e9m, ktor\u00fd viete spusti\u0165 na web servery a pomocou rozhrania internetov\u00e9ho prehliada\u010da vytvori\u0165 cel\u00fa str\u00e1nku (vytvori\u0165 jej obsah &#8211; preto ten \u201econtent\u201c v n\u00e1zve). Aspo\u0148 tak to bolo kedysi, ke\u010f CMS vznikali. Od vtedy u\u017e ale ubehlo mno\u017estvo \u010dasu, z Drupalu (ako aj in\u00fdch CMS) sa stal okrem jeho p\u00f4vodn\u00e9ho \u00fa\u010delu, aj v\u00fdvojov\u00e1 platforma, na ktorej viete vyv\u00edja\u0165 vlastn\u00fa, \u0161pecifick\u00fa funkcionalitu. Na z\u00e1klady p\u00edsania modulu pre Drupal sa teraz pozrieme bli\u017e\u0161ie.<!--more--><\/p>\n<p><!--break-->Drupal je syst\u00e9m, ktor\u00fd u\u017e m\u00e1 \u010do to za sebou. Jeho v\u00fdvoj sa za\u010dal v roku 2001 a z\u00edskal si pomerne ve\u013ek\u00fa komunitn\u00fa podporu. In\u0161tal\u00e1cia je trivi\u00e1lna a ovl\u00e1danie nie je tie\u017e zlo\u017eit\u00e9. Toto v\u0161ak nie je \u010dl\u00e1nok, ktor\u00fd by sa mal zaobera\u0165 t\u00fdm, ako vybudova\u0165 str\u00e1nku z existuj\u00facich modulov. Materi\u00e1lov na t\u00fato t\u00e9mu je na internete dos\u0165. Odovzd\u00e1vanie t\u00fdchto inform\u00e1ci\u00ed presko\u010d\u00edm, ale z\u00e1rove\u0148 o\u010dak\u00e1vam, \u017ee m\u00e1te aspo\u0148 nejak\u00e9 z\u00e1klady, preto\u017ee budem bez vysvetlenia pou\u017e\u00edva\u0165 pojmy, ktor\u00e9 s\u00fa pre be\u017en\u00e9ho drupalistu zn\u00e1me.<\/p>\n<p>Hne\u010f na za\u010diatok n\u00e1vodu na v\u00fdvoj modulu v\u00e1m d\u00e1m jednu radu: pozrite sa, \u010di neexistuje modul, ktor\u00fd u\u017e t\u00fato funkcionalitu m\u00e1. Je to dos\u0165 pravdepodobn\u00e9. V \u010dase p\u00edsania tohto \u010dl\u00e1nku eviduje ofici\u00e1lna Drupalovsk\u00e1 str\u00e1nka (www.drupal.org) viac ako 19 000 modulov. A to je dos\u0165. Je celkom mo\u017en\u00e9, \u017ee niekto pred vami u\u017e rie\u0161il probl\u00e9m, ktor\u00fd sa teraz sna\u017e\u00edte vyrie\u0161i\u0165 vy. Ak by ste aj nena\u0161li modul, ktor\u00fd bude presne vyhovova\u0165 va\u0161\u00edm po\u017eiadavk\u00e1m, tak m\u00f4\u017eete n\u00e1js\u0165 nie\u010do, \u010do mu je podobn\u00e9 a necha\u0165 sa in\u0161pirova\u0165. \u010eal\u0161ia rada: na vyh\u013ead\u00e1vanie pou\u017e\u00edvajte sk\u00f4r nejak\u00fd extern\u00fd vyh\u013ead\u00e1vac\u00ed syst\u00e9m. Ten, ktor\u00fd s\u00fa je s\u00fa\u010das\u0165ou Drupal str\u00e1nky, mi niekedy nena\u0161iel ve\u013ea pomerne relevantn\u00fdch odkazov.<\/p>\n<p><span style=\"color: #000000;\">Drupal je p\u00edsan\u00fd v PHP, a teda aj v\u00e1\u0161 modul bude pravdepodobne nap\u00edsan\u00fd v tomto jazyku<\/span>. Pre k\u00f3d platia v\u00e4\u010d\u0161inou \u0161tandardn\u00e9 pravidl\u00e1 ako pre in\u00fd PHP k\u00f3d s jedinou v\u00fdnimkou, a to \u017ee na koniec s\u00faboru by ste nemali d\u00e1va\u0165 ukon\u010dovaciu PHP zna\u010dku ( ?&gt; ). \u010eal\u0161ie \u0161tandardy p\u00edsania k\u00f3du je mo\u017en\u00e9 n\u00e1js\u0165 <a href=\"http:\/\/drupal.org\/coding-standards#phptags\">tu<\/a>. \u00daplne minim\u00e1lny modul v Drupale mus\u00ed ma\u0165 aspo\u0148 2 s\u00fabory, a to:<\/p>\n<ol>\n<li>&lt;nazov_modulu&gt;.info<\/li>\n<li>&lt;nazov_modulu&gt;.module<\/li>\n<\/ol>\n<p>Ten prv\u00fd je popisn\u00fd s\u00fabor modulu (so \u0161peci\u00e1lnou Drupalovskou syntaxou) a ten druh\u00fd obsahuje PHP k\u00f3d modulu (samozrejme tak\u00fdchto s\u00faborov m\u00f4\u017ee by\u0165 viac, ale tento jeden je minimum). <em>&lt;nazov_modulu&gt;<\/em> mus\u00ed by\u0165 jedine\u010dn\u00fd n\u00e1zov (vzh\u013eadom na existuj\u00face moduly) a mus\u00ed by\u0165 zhodn\u00fd pre oba s\u00fabory. Drupal funguje tak, \u017ee kontroluje mno\u017einu prie\u010dinkov, v ktor\u00fdch sa m\u00f4\u017eu nach\u00e1dza\u0165 moduly a h\u013ead\u00e1 pr\u00e1ve tie .info. Ak ich n\u00e1jde, analyzuje obsah a inform\u00e1cie o module zobraz\u00ed v administr\u00e1torskom rozhran\u00ed. Ako som povedal, prie\u010dinkov s modulmi m\u00f4\u017ee by\u0165 viac, ale odpor\u00fa\u010da sa svoje moduly uklada\u0165 do sites\/all\/modules\/custom\/&lt;nazov_modulu&gt;.<\/p>\n<p>.info s\u00fabor obsahuje podstatn\u00e9 inform\u00e1cie pre Drupal, aby vedel, ako m\u00e1 s modulom zaobch\u00e1dza\u0165. S\u00fabor je vlastne tvoren\u00fd mno\u017einou dvoj\u00edc: k\u013e\u00fa\u010d &#8211; hodnota. Tu s\u00fa pr\u00edklady niektor\u00fdch k\u013e\u00fa\u010dov:<\/p>\n<p><strong> Name<\/strong> &#8211; n\u00e1zov modulu<\/p>\n<p><strong> Description<\/strong> &#8211; popis modulu<\/p>\n<p><strong> Core<\/strong> &#8211; verzia jadra Drupalu potrebn\u00e9ho pre modul<\/p>\n<p><strong> Files[]<\/strong> &#8211; pole (ten ist\u00fd k\u013e\u00fa\u010d zad\u00e1te viackr\u00e1t na viacer\u00fdch riadkoch) n\u00e1zov s\u00faborov, ktor\u00e9 tvoria modul (minim\u00e1lne .info a .modul s\u00fabory by mali by\u0165 v tomto zozname)<\/p>\n<p><strong> Dependency[]<\/strong> &#8211; pole n\u00e1zov modulov, na ktor\u00fdch je ten v\u00e1\u0161 z\u00e1visl\u00fd. Drupal potom nedovol\u00ed spusti\u0165 v\u00e1\u0161 modul, ak nie s\u00fa v\u0161etky potrebn\u00e9 z\u00e1vislosti dostupn\u00e9.<\/p>\n<p>Direkt\u00edv je viac a toto s\u00fa len z\u00e1kladn\u00e9. Je dobr\u00e9 si ich pred za\u010dat\u00edm p\u00edsania modulu aspo\u0148 zbe\u017ene pozrie\u0165.<\/p>\n<p>Tak\u017ee m\u00e1te modul, v \u0148om .info s\u00fabor s inform\u00e1ciami, a teraz u\u017e ost\u00e1va len p\u00edsa\u0165 k\u00f3d. Ale ako? Aby ste toho boli schopn\u00ed, mus\u00edte sa zozn\u00e1mi\u0165 s Drupal API. To sa del\u00ed do dvoch ve\u013ek\u00fdch \u010dast\u00ed. Prv\u00fa predstavuj\u00fa met\u00f3dy, ktor\u00e9 viete vola\u0165 zo svojho k\u00f3du a r\u00f4zne tak vyu\u017e\u00edva\u0165 prostredie Drupalu. T\u00fa druh\u00fa \u010das\u0165 predstavuj\u00fa met\u00f3dy, ktor\u00e9 nap\u00ed\u0161ete vo svojom k\u00f3de a ktor\u00e9 bud\u00fa volan\u00e9 Drupalom. To znie dos\u0165 zvl\u00e1\u0161tne, \u017ee? Aby ste pochopili o \u010do ide, potrebujete sa zozn\u00e1mi\u0165 s <em>Inversion of Control<\/em> vzorom. Op\u00e4\u0165, materi\u00e1lov je na internete mnoho, a ja sa to pok\u00fasim len zhrn\u00fa\u0165:<\/p>\n<p><em>Je to vzor, pri ktorom riadiaci objekt nepozn\u00e1 presn\u00fa implement\u00e1ciu jednotliv\u00fdch krokov procesu, len vie, v akom porad\u00ed ich vola\u0165 a to aj rob\u00ed. <\/em><\/p>\n<p>To m\u00f4\u017ee znie\u0165 dos\u0165 krkolomne na prv\u00fd poh\u013ead, ale v podstate to znamen\u00e1, \u017ee Drupal (ako riadiaci syst\u00e9m) len vie, kedy m\u00e1 vola\u0165 ur\u010dit\u00e9 met\u00f3dy v jadre alebo moduloch a rozumie procesu len na ur\u010ditej \u00farovni abstrakcie, ale nepozn\u00e1 konkr\u00e9tne kroky, ktor\u00e9 sa dej\u00fa. V praxi to m\u00f4\u017ee znamena\u0165, \u017ee pri dotaze na str\u00e1nku Drupal skontroluje, \u010di niektor\u00e9 moduly nemaj\u00fa met\u00f3du, ktor\u00e1 by v takomto pr\u00edpade mala by\u0165 volan\u00e1, a ak \u00e1no, zavol\u00e1 ich.<\/p>\n<p>Takto vyzer\u00e1 pop\u00edsan\u00fd princ\u00edp. Ale \u010do to znamen\u00e1 pri p\u00edsan\u00ed modulu? Drupal preh\u013ead\u00e1va v\u00e1\u0161 modul, sna\u017e\u00ed sa n\u00e1js\u0165 met\u00f3dy, ktor\u00e9 s\u00fa pre neho \u0161pecifick\u00e9, a ktor\u00e9 potom bude vola\u0165 v ur\u010dit\u00fdch miestach vykon\u00e1vania. Ako tak\u00e9to met\u00f3dy spozn\u00e1? Pod\u013ea n\u00e1zvu. Tak\u00e1to met\u00f3da sa ozna\u010duje ako <em>hook<\/em> a jej n\u00e1zov je postaven\u00fd pod\u013ea ur\u010dite sch\u00e9my. Napr\u00edklad met\u00f3da, ktor\u00e1 dok\u00e1\u017ee prida\u0165 polo\u017eku do administr\u00e1torsk\u00e9ho menu sa ozna\u010duje ako <em>hook_menu<\/em>. To <em>hook<\/em> sa v n\u00e1zve met\u00f3dy v\u017edy nahrad\u00ed za n\u00e1zov v\u00e1\u0161ho modulu. Ak napr\u00edklad vyv\u00edjate modul <em>kalkulacka<\/em>, tak met\u00f3da vo va\u0161om module sa bude naz\u00fdva\u0165 <em>kalkulacka_menu<\/em>. Tak\u00e1to met\u00f3da potom bude automaticky volan\u00e1 pri vytv\u00e1ran\u00ed menu a vy v nej viete ovplyvni\u0165, ako bude v\u00fdsledn\u00e9 menu vyzera\u0165 (hlavne do neho viete prida\u0165 polo\u017eky pre svoj modul). Drupal v podstate predstavuje z\u00e1kladn\u00fd r\u00e1mec pre fungovanie syst\u00e9mu, ktor\u00fd m\u00e1 v jednotliv\u00fdch procesoch (napr\u00edklad: generovanie formul\u00e1ra, menu, ukladanie polo\u017eky do datab\u00e1zy at\u010f.) mno\u017estvo bodov, na ktor\u00e9 sa viete zachyti\u0165 a roz\u0161\u00edri\u0165 tak jeho funkcionalitu. Ak napr\u00edklad chcete, aby sa na ka\u017edom formul\u00e1ri va\u0161ej str\u00e1nky zobrazovalo nejak\u00e9 \u0161peci\u00e1lne pol\u00ed\u010dko, implementujete funkciu volan\u00fa pri vytv\u00e1ran\u00ed ka\u017ed\u00e9ho formul\u00e1ra, a to pol\u00ed\u010dko tam vlo\u017e\u00edte.<\/p>\n<p>K hookom sme sa dostali od Drupal API, preto\u017ee s\u00fa naozaj jeho s\u00fa\u010das\u0165ou. Na to, aby ste dok\u00e1zali vytvori\u0165 modul, ktor\u00fd bude robi\u0165 to, \u010do potrebujete, mus\u00edte aspo\u0148 z \u010dasti pozna\u0165 syst\u00e9m hookov. Je ich pomerne dos\u0165 (nieko\u013eko stoviek) &#8211; pre verziu 7 si m\u00f4\u017eete pozrie\u0165 zoznam <a href=\"http:\/\/api.drupal.org\/api\/drupal\/includes!module.inc\/group\/hooks\/7\">tu<\/a>. \u010co je nepochybne zauj\u00edmav\u00e9 je, \u017ee ka\u017ed\u00fd doin\u0161talovan\u00fd modul m\u00f4\u017ee okrem pou\u017e\u00edvania existuj\u00facich hookov dodefinova\u0165 svoje, a tak ich mno\u017einu roz\u0161irova\u0165. Zhruba sa d\u00e1 o Drupal API poveda\u0165, \u017ee v\u00e1\u0161 k\u00f3d sa bude nach\u00e1dza\u0165 medzi dvoma vrstvami Drupalu. Tou nad vami, ktor\u00e1 bude vola\u0165 va\u0161e hook met\u00f3dy a tou pod vami, ktor\u00fa zase budete vola\u0165 vy (napr\u00edklad met\u00f3da, ktor\u00e1 v\u00e1m zap\u00ed\u0161e d\u00e1ta do datab\u00e1zy). Niekde uprostred medzi t\u00fdmito vrstvami je v\u00e1\u0161 k\u00f3d.<\/p>\n<p>Tak\u017ee viete vytvori\u0165 s\u00fabory pre modul, nap\u00edsa\u0165 nejak\u00fd PHP k\u00f3d, rozumiete Drupal API. Tak to by bolo asi tak v\u0161etko. Vlastne nie. Je to tot\u00e1lne minimum a inform\u00e1ci\u00ed, ktor\u00e9 budete musie\u0165 vstreba\u0165, bude omnoho viac. Napr\u00edklad si budete musie\u0165 zvykn\u00fa\u0165 na pr\u00e1cu s poliami. Drupal vyu\u017e\u00edva polia vo ve\u013ekej miere hlavne na definovanie ur\u010dit\u00fdch \u0161trukt\u00far. Napr\u00edklad na popis formul\u00e1ra. Tak\u00fd popis je vlastne viacrozmern\u00e9 pole s presne pop\u00edsanou \u0161trukt\u00farou a dovolen\u00fdmi hodnotami. \u010ealej pre v\u00e1s bude ur\u010dite zauj\u00edmav\u00e9 pozrie\u0165 sa na proces in\u0161talovania a odin\u0161talovania v\u00e1\u0161ho modulu. To s\u00fa pr\u00e1ve tie momenty, kedy si modul pripravuje (alebo upratuje po sebe) datab\u00e1zu. V Drupale je na to \u0161peci\u00e1lny s\u00fabor s n\u00e1zvom <em>&lt;nazov_modulu&gt;.install<\/em>. A v \u0148om s\u00fa dva podstatn\u00e9 hooky: <em>hook_install()<\/em> a <em>hook_uninstall()<\/em>. Viete si predstavi\u0165, \u010do asi robia a ja len dod\u00e1m, \u017ee s\u00fa tie\u017e zadefinovan\u00e9 pomocou pol\u00ed. To, \u010do v\u00e1s nepochybne sk\u00f4r alebo nesk\u00f4r stretne, s\u00fa probl\u00e9my, kedy sa nie\u010do nespr\u00e1va, ako ste predpokladali. Vtedy je dobre ma\u0165 na pam\u00e4ti tri mo\u017en\u00e9 kroky, ktor\u00e9 v\u00e1m m\u00f4\u017eu pom\u00f4c\u0165:<\/p>\n<ol>\n<li>vyma\u017ete cache (je na to tla\u010didlo, ktor\u00e9 sa d\u00e1 n\u00e1js\u0165 v administr\u00e1torskom menu)<\/li>\n<li>skontrolova\u0165 pr\u00e1va<\/li>\n<li>v <em>setting.php<\/em> s\u00fabore si zapn\u00fa\u0165 zobrazovanie ch\u00fdb (\u0161peci\u00e1lne to pom\u00e1ha v pr\u00edpade, ak v\u0161etko, \u010do dostanete namiesto str\u00e1nky, je biela plocha)<\/li>\n<\/ol>\n<p>St\u00e1le sme sa ani z\u010faleka nedostali k v\u0161etk\u00fdm t\u00e9mam. Je \u0165a\u017ek\u00e9 robi\u0165 s Drupal, vyhn\u00fa\u0165 sa pritom \u0161abl\u00f3nam, blokom alebo poh\u013eadom (Views). To v\u0161etko s\u00fa z\u00e1kladn\u00e9 mechanizmy alebo moduly, na ktor\u00fdch je postaven\u00e1 ve\u013ek\u00e1 \u010das\u0165 Drupalu. Tento \u010dl\u00e1nok predstavuje len \u00favod p\u00edsania modulu a na v\u00e1\u017enej\u0161ie t\u00e9my je potrebn\u00e9 \u010fal\u0161ie \u0161t\u00fadium. Samotn\u00fd fakt, \u017ee existuje mno\u017estvo mechanizmov, hotov\u00fdch modulov a ofici\u00e1lnych postupov ale sved\u010d\u00ed o tom, \u017ee Drupal je pomerne mocn\u00fd n\u00e1stroj, ktor\u00fd by v\u00e1s nemal sklama\u0165, nech u\u017e sa so svojou str\u00e1nkou rozhodnete \u00eds\u0165 kamko\u013evek.<\/p>","protected":false},"excerpt":{"rendered":"<p>Drupal je Content Management System (CMS) zalo\u017een\u00fd na PHP jazyku. To CMS znamen\u00e1, \u017ee je to syst\u00e9m, ktor\u00fd viete spusti\u0165 na web servery a pomocou rozhrania internetov\u00e9ho prehliada\u010da vytvori\u0165 cel\u00fa str\u00e1nku (vytvori\u0165 jej obsah &#8211; preto ten \u201econtent\u201c v n\u00e1zve). Aspo\u0148 tak to bolo kedysi, ke\u010f CMS vznikali. Od vtedy u\u017e ale ubehlo mno\u017estvo \u010dasu, [&hellip;]<\/p>","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13],"tags":[],"class_list":["post-53","post","type-post","status-publish","format-standard","hentry","category-vyvoj-softveru"],"_links":{"self":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/53","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/comments?post=53"}],"version-history":[{"count":2,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/53\/revisions"}],"predecessor-version":[{"id":185,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/posts\/53\/revisions\/185"}],"wp:attachment":[{"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/media?parent=53"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/categories?post=53"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/spireng.sk\/en\/wp-json\/wp\/v2\/tags?post=53"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}