Լրացուցիչ Բլոկների Տեսակներ (EBT) - Դասավորության Կառուցողի նոր փորձառություն❗

Լրացուցիչ Բլոկների Տեսակներ (EBT) - ձևավորված, կարգավորելի բլոկների տեսակներ՝ սլայդշոուներ, ներդիրներ, քարտեր, բացվող ցանկեր և շատ ուրիշներ։ Ներառված կարգավորումներ՝ ֆոնի, DOM տուփի, JavaScript փլագինների համար։ Փորձեք դասավորությունների կառուցման ապագան արդեն այսօր։

EBT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EBT մոդուլները

❗Լրացուցիչ Պարբերությունների Տեսակներ (EPT) - Պարբերությունների նոր փորձառություն

Լրացուցիչ պարբերության տեսակներ (EPT) - անալոգիական պարբերության վրա հիմնված մոդուլների հավաքակազմ։

EPT մոդուլների ցուցադրական տարբերակներ Ներբեռնել EPT մոդուլները

Scroll

Աշխատանք տվյալների բազայի հետ Drupal 7-ում - Դաս 5 - Ընդլայնիչներ

12/05/2025, by Ivan

Ինչի՞ց սկսել:

Ընտրության հարցումները աջակցում են ընդլայնումներ (extenders)։ Ընդլայնումը հնարավորություն է տալիս ավելացնել ֆունկցիոնալություն ընտրության հարցմանը կատարողականության ընթացքում։ Այդ ֆունկցիոնալությունը կարող է լինել լրացուցիչ մեթոդ կամ վերամշակել գոյություն ունեցող մեթոդի վարքագիծը։

Դրա համար ՕՕԾ-ում (OOP) օգտագործվում են ձևավորման նմուշներ (design patterns), ընդլայնումները իրականացվում են որպես Դեկորատոր դիզայնի նմուշ (Decorator Pattern)։ Դրանք դինամիկ կերպով կցում են լրացուցիչ պարտականություններ օբյեկտին՝ ապահովելով մեթոդի ընդլայնման ճկուն այլընտրանք ենթադասի փոխարեն։

Extenders (ընդլայնումների) օգտագործում

Ընդլայնում օգտագործելու համար դուք պետք է ունենաք հարցման օբյեկտ։ Ընտրության հարցման օբյեկտի extend() մեթոդը կվերադարձնի նոր օբյեկտ, որը կօգտագործվի ներկայիս հարցման օբյեկտի փոխարեն։ Օրինակ՝

<?php
$query = $query->extend('PagerDefault');
?>

Այս օրինակում ստեղծվում է նոր PagerDefault հարցման օբյեկտ, որը ներառում է սկզբնական հարցման օբյեկտը և վերադարձնում է նոր օբյեկտ։ $query-ն կարող է օգտագործվել նաև առանց ընդլայնումների, սակայն ընդլայնմամբ օբյեկտը ստանում է լրացուցիչ հնարավորություններ։ Նկատեք նաև, որ extend() մեթոդը վերադարձնում է $query, իսկ հին արժեքը չի պահպանվում։ Հաջորդ օրինակը ավելի հստակ կբացատի սա․

<?php
$query = db_select('node', 'n');
$query
  ->fields('n', array('nid', 'title'))
  ->extend('PagerDefault')   // Այս տողը վերադարձնում է նոր PagerDefault օբյեկտ։
  ->limit(5);               // Աշխատում է, քանի որ աշխատում է ընդլայնված օբյեկտի վրա։

// extend()-ի վերադարձը երբեք չի պահպանվել փոփոխականում, այնպես որ $query դեռևս Select օբյեկտ է։
$query->orderBy('title');

// Այս տողը կատարում է սկզբնական Select օբյեկտը՝ ոչ ընդլայնվածը։
$result = $query->execute();
?>

Խնդիրներից խուսափելու համար խորհուրդ է տրվում $query-ին միանգամից նշանակել ընդլայնված հարցման օբյեկտը։

<?php
$query = db_select('node', 'n')->extend('PagerDefault')->extend('TableSort');
$query->fields(...);
// ...
?>

Սա ապահովում է, որ $query-ն ամբողջությամբ ընդլայնված հարցման օբյեկտ է։ Ընդլայնումները կարող են օգտագործվել բազմիցս, սակայն դրանց կարգը կարող է նշանակություն ունենալ։ Օրինակ՝ table-sort-ով ընդլայնված օբյեկտը պետք է նախապես ընդլայնված լինի PagerDefault-ով։

Նոր ընդլայնումների ստեղծում

Ընդլայնումը պարզապես դաս է (class), որը իրականացվում է որպես SelectQueryInterface և ընդունում է երկու պարամետր՝ ընտրության հարցում և DatabaseConnection օբյեկտ։ Ընդլայնումը պետք է իրականցնի SelectQueryInterface-ի մեթոդները և փոխանցի դրանք constructor-ի միջոցով։

Առավել հաճախ ընդլայնման դասերը ընդլայնում են SelectQueryExtender-ը, որը կառավարում է մնացած ամեն ինչ։ Իրականում ընդլայնումը ցանկացած class է, որը ժառանգում է SelectQueryExtender-ից։ Այս դասի անունը պետք է օգտագործել extend() կոչի մեջ հարցման օբյեկտի վրա։

Ավելացնելը կամ վերաիմաստավորելը մեթոդները կախված է ընդլայնման class-ից։ Ցանկացած մեթոդ, որը չի վերաիմաստավորվել, ուղղակի փոխանցվում է հարցման օբյեկտին։ Երբ մեթոդը վերաիմաստավորվում է, ընդլայնումը կարող է կանչել սկզբնական հարցման մեթոդը կամ ոչ՝ սակայն պետք է վերադարձնի այն արժեքը, ինչ ակնկալվում է SelectQuery ինտերֆեյսով։ Ավելի հաճախ վերադարձվում է ինքնին ընդլայնման օբյեկտը կամ դրա միջով այլ ընդլայնում։

Հաջորդ օրինակը ավելի հստակ կբացատրի նշվածը․

<?php
class ExampleExtender extends SelectQueryExtender {

  /**
   * Տեսականորեն վերաիմաստավորում է orderBy().
   */
  public function orderBy($field, $direction = 'ASC') {
    return $this;
  }

  /**
   * Իրականապես կատարում է դասակարգում։
   */
  public function orderByForReal($field, $direction = 'ASC') {
    $this->query->orderBy($field, $direction);
    return $this;
  }
}
?>

Այս օրինակում մենք վերաիմաստավորում ենք orderBy() մեթոդը առանց որևէ բան ավելացնելու, և փոխարենը ավելացնում ենք լրացուցիչ մեթոդ՝ orderByForReal(), որը կատարում է իրական դասակարգում։ Երկուսն էլ վերադարձնում են հարցման օբյեկտը՝ պահպանելով շղթայով կանչերի հնարավորությունը։

Ցանկացած մոդուլ կարող է հայտարարել ընդլայնում։ Drupal-ի միջուկը ապահովում է երկու հիանալի ընդլայնում՝ PagerDefault և TableSort։

Բազաների բազմակի աջակցություն

Ընդլայնման մեթոդը աշխատում է ինչպես db_select-ը։ Ընդլայնումը որոնում է դասի անունը, որը պարունակում է տվյալ շտեմարանի դրայվերի վերջածանցը։ Այսպիսով, դուք կարող եք հայտարարել ExampleExtender_pgsql և ExampleExtender, որը կօգտագործվի ըստ հասանելիության։