9.2. Ի՞նչ «կեռիկ» է նշանակում Drupal-ում։
Այս հոդվածը նախատեսված է ձեզ ծանոթացնելու Drupal համակարգին։ Մենք կգրենք կոդի օրինակներ հետագայում՝ մեր սեփական մոդուլը ավելացնելուց հետո։
Drupal-ը միաձուլված (monolithic) համակարգ չէ, որտեղ ամեն ինչ կատարյալ է և փոփոխության կարիք չունի։ Հաճախ հաճախորդները խնդրում են կայքին ավելացնել այս կամ այն ֆունկցիոնալությունը։ Drupal-ի հիմնական (core) կոդը պահպանելու և ֆունկցիոնալություն ավելացնելու համար մենք օգտագործում ենք մոդուլներ։ Մոդուլային համակարգը թույլ է տալիս ընդլայնել Drupal-ի հնարավորությունները։ Բայց ի՞նչ անել, եթե մեզ անհրաժեշտ է ընդլայնել պատրաստի հակամոդուլի (counter module) հնարավորությունները։ Իհարկե, մենք կարող ենք ստեղծել խնդիր (issue) drupal.org կայքում և սպասել՝ մեկ ամիս, երկու կամ մեկ տարի... մինչև մոդուլի մեջ ավելացվի անհրաժեշտ ֆունկցիոնալությունը։ Բայց մենք կարող ենք այլ կերպ վարվել՝ գրել մեզ անհրաժեշտ կոդը։ Drupal-ի հիմնական և լրացուցիչ մոդուլների հնարավորությունները ընդլայնելու համար մենք կօգտագործենք hook-եր և plugin-ներ մեր սեփական մոդուլների մեջ։
Հիմնական գաղափարն այն է, որ մենք չպետք է փոփոխենք Drupal-ի կամ հավելյալ մոդուլների կոդը՝ խնայելով ծրագրավորողի աշխատանքի վճարը։ Որպեսզի հնարավոր լինի հեշտությամբ թարմացնել Drupal-ը և մոդուլները, չպետք է փոփոխություններ կատարել դրանց հիմնական կոդում։ Հակառակ դեպքում ձեր բոլոր փոփոխությունները կջնջվեն թարմացման ժամանակ։
Drupal-ը ունի hook-երի համակարգ՝ մոդուլները և հիմնական համակարգը կապակցելու, ինչպես նաև մոդուլների փոխազդեցության համար։ Hook-ը callback ֆունկցիա է, այսինքն՝ երբ կոդը հասնում է hook-ին, կատարվում է մեր մոդուլում ավելացրած ֆունկցիայի կոդը։ Այդ կերպ մենք կարող ենք փոփոխել, ավելացնել, ջնջել կամ պարզապես ցուցադրել օգտատիրոջ տվյալները, մենյուները, դասակարգումները (taxonomy), բովանդակության տարրերը։
Drupal 8-ում hook-երի քանակը բավականին մեծ է, թեև նվազել է Drupal 7-ի համեմատ։ Շատ hook-եր փոխարինվել են Symfony-ի բաղադրիչներով․
https://api.drupal.org/api/drupal/core%21core.api.php/group/hooks/8.2.x
Drupal 7-ի hook-երի ցանկը շատ երկար է, պահանջում է երկար ոլորել՝
https://api.drupal.org/api/drupal/includes%21module.inc/group/hooks/7.x
Սակայն դա չի նշանակում, թե Drupal 8-ը ավելի թույլ է։ Drupal 7-ում hook-ով իրականացվող բաները Drupal 8-ում իրականացվում են համապատասխան plugin-ներով։
Եթե ուշադիր ուսումնասիրեք Drupal 8-ի hook-երը, կտեսնեք, որ շատերի անունների վերջում կա _alter
, ինչը նշանակում է, որ hook-ը նախատեսված է փոփոխելու փոփոխականների արժեքները։ Օրինակ՝
hook_form_alter()
— թույլ է տալիս փոփոխել ձևի (form) զանգվածը դրա մշակման ժամանակ։ Հետագայում մենք կվերլուծենք, թե ինչպես են ձևերը գեներացվում զանգվածներից։ Այս hook-ը կիրառելու համար մեր մոդուլում պարզապես գրում ենք հետևյալ ֆունկցիան՝
function mymodule_form_alter() {
// փոփոխում ենք form զանգվածը
}
Ես պարզեցրել եմ օրինակը՝ չնշելով ֆունկցիայի արգումենտները կամ namespace-ները։ Կարևորը՝ հասկանալ, թե ինչպես են աշխատում hook-երը։ mymodule
-ը մեր մոդուլի անունն է։ Մենք hook-ի տեղում գրում ենք մոդուլի անունը, և Drupal-ը ավտոմատ կերպով գտնում է ֆունկցիան և օգտագործում է այն։ Ինչպես է դա աշխատում՝ prepareForm()
մեթոդում կանչվում է alter()
մեթոդը՝
$this->moduleHandler->alter($hooks, $form, $form_state, $form_id);
Սա նշանակում է, որ բոլոր մոդուլները, որոնք կիրառում են hook_form_alter()
, այս կետում կավելացնեն իրենց կոդը։ Այսպիսով, եթե մենք ուզում ենք ավելացնել կոդ Drupal-ի որևէ հատվածում, ապա նախ պետք է փորձել hook-ով, ապա plugin-ով, և եթե դա էլ չի ստացվում՝ ստիպված ենք փոփոխել կամ "patch" անել մոդուլը (ցավոք, երբեմն պետք է անել դա)։ Բայց առայժմ մենք չենք բախվել իրավիճակի, երբ պետք է փոփոխել plugin-ը, ուստի սովորենք գրել մեր սեփական մոդուլները։