Extra Block Types (EBT) - New Layout Builder experience❗

Extra Block Types (EBT) - styled, customizable block types: Slideshows, Tabs, Cards, Accordions and many others. Built-in settings for background, DOM Box, javascript plugins. Experience the future of layout building today.

Demo EBT modules Download EBT modules

❗Extra Paragraph Types (EPT) - New Paragraphs experience

Extra Paragraph Types (EPT) - analogical paragraph based set of modules.

Demo EPT modules Download EPT modules

Scroll

9.2. Ի՞նչ «կեռիկ» է նշանակում Drupal-ում։

19/04/2025, by Ivan

Menu

Այս հոդվածը նախատեսված է ձեզ ծանոթացնելու 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-ը, ուստի սովորենք գրել մեր սեփական մոդուլները։