logo

एक्स्ट्रा ब्लॉक टाइप्स (EBT) - नया लेआउट बिल्डर अनुभव❗

एक्स्ट्रा ब्लॉक टाइप्स (EBT) - स्टाइलिश, कस्टमाइज़ेबल ब्लॉक टाइप्स: स्लाइडशो, टैब्स, कार्ड्स, एकॉर्डियन्स और कई अन्य। बैकग्राउंड, DOM बॉक्स, जावास्क्रिप्ट प्लगइन्स के लिए बिल्ट-इन सेटिंग्स। आज ही लेआउट बिल्डिंग का भविष्य अनुभव करें।

डेमो EBT मॉड्यूल्स EBT मॉड्यूल्स डाउनलोड करें

❗एक्स्ट्रा पैराग्राफ टाइप्स (EPT) - नया पैराग्राफ्स अनुभव

एक्स्ट्रा पैराग्राफ टाइप्स (EPT) - एनालॉजिकल पैराग्राफ आधारित मॉड्यूल्स का सेट।

डेमो EPT मॉड्यूल्स EPT मॉड्यूल्स डाउनलोड करें

स्क्रॉल

Drupal 7 में डेटाबेस के साथ काम — पाठ 5 — एक्सटेंडर्स (Extenders)

14/10/2025, by Ivan

Drupal 7 में SELECT क्वेरीज़ “एक्सटेंडर्स (Extenders)” का समर्थन करती हैं। एक्सटेंडर का उपयोग किसी क्वेरी में अतिरिक्त कार्यक्षमता जोड़ने के लिए किया जाता है — यह रनटाइम पर क्वेरी की क्षमताओं को बढ़ाता है। एक्सटेंडर किसी क्वेरी ऑब्जेक्ट में नए मेथड्स जोड़ सकते हैं या मौजूदा मेथड्स के व्यवहार को संशोधित कर सकते हैं।

यह अवधारणा ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग (OOP) के Decorator Pattern पर आधारित है। एक्सटेंडर किसी क्वेरी ऑब्जेक्ट में अतिरिक्त “ज़िम्मेदारियाँ” जोड़ते हैं, जिससे उस ऑब्जेक्ट की क्षमताएँ बिना उसका मूल क्लास बदले विस्तारित हो जाती हैं।

Extenders (एक्सटेंडर्स) का उपयोग कैसे करें

किसी एक्सटेंडर का उपयोग करने के लिए, आपके पास पहले से एक क्वेरी ऑब्जेक्ट होना चाहिए। extend() मेथड उस क्वेरी ऑब्जेक्ट को लेता है और एक नया ऑब्जेक्ट लौटाता है, जो मूल ऑब्जेक्ट को लपेटता है (wrap करता है) और उसमें नई कार्यक्षमता जोड़ता है। उदाहरण के लिए:

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

ऊपर दिए गए उदाहरण में एक नया PagerDefault क्वेरी ऑब्जेक्ट बनाया जाता है, जिसमें मूल क्वेरी शामिल होती है और जो अतिरिक्त “pagination” कार्यक्षमता प्रदान करता है। ध्यान दें कि $query वेरिएबल में extend() का रिटर्न वैल्यू ही पुनः असाइन किया जाता है — पुराना क्वेरी ऑब्जेक्ट स्वतः नहीं बदलता।

<?php
$query = db_select('node', 'n');
$query
  ->fields('n', array('nid', 'title'))
  ->extend('PagerDefault')   // यह लाइन एक नया PagerDefault ऑब्जेक्ट लौटाती है।
  ->limit(5);               // यह PagerDefault ऑब्जेक्ट पर लागू होता है।

// लेकिन extend() का परिणाम किसी वेरिएबल में सहेजा नहीं गया,
// इसलिए $query अभी भी केवल SelectQuery ऑब्जेक्ट है।
$query->orderBy('title');

// इस लाइन पर Select ऑब्जेक्ट चलेगा, PagerDefault नहीं।
$result = $query->execute();
?>

इस तरह की समस्या से बचने के लिए, यह अनुशंसित है कि आप क्वेरी ऑब्जेक्ट को उसी वेरिएबल में पुनः असाइन करें:

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

$query->fields(...);
// ...
?>

इससे यह सुनिश्चित होता है कि $query में सभी एक्सटेंशन लागू हों। एक ऑब्जेक्ट में कई एक्सटेंडर्स का उपयोग संभव है, लेकिन उनका क्रम महत्वपूर्ण हो सकता है — उदाहरण के लिए, यदि आप PagerDefault और TableSort दोनों का उपयोग कर रहे हैं, तो पहले PagerDefault को लागू करना चाहिए।

नया Extender बनाना

एक्सटेंडर वास्तव में एक क्लास होता है जो SelectQueryInterface को लागू करता है और दो पैरामीटर्स स्वीकार करता है: एक SelectQuery ऑब्जेक्ट और एक DatabaseConnection ऑब्जेक्ट। एक्सटेंडर क्लास को इन दोनों के साथ कार्य करना होता है और मूल क्वेरी के लिए आवश्यक मेथड्स को एक्सेस करना होता है।

अधिकांश मामलों में, एक्सटेंडर SelectQueryExtender क्लास को एक्सटेंड करता है, जो बेसिक कार्यक्षमता पहले से उपलब्ध कराता है। प्रायः किसी भी एक्सटेंडर का क्लास नाम वही होता है जिसे आप extend() मेथड में पास करते हैं।

एक्सटेंडर क्लास नए मेथड्स जोड़ सकता है या मौजूदा मेथड्स को ओवरराइड कर सकता है। जो मेथड ओवरराइड नहीं किए जाते, वे सीधे मूल क्वेरी ऑब्जेक्ट को पास हो जाते हैं। यदि कोई मेथड ओवरराइड किया गया है, तो वह मूल क्वेरी को कॉल कर सकता है या नहीं — यह एक्सटेंडर के उद्देश्य पर निर्भर करता है। लेकिन उसे वही रिटर्न वैल्यू देनी चाहिए जो 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() मेथड जोड़ा है, जो वास्तव में क्वेरी को sort करता है। दोनों मेथड क्वेरी ऑब्जेक्ट लौटाते हैं ताकि chaining बनी रहे।

किसी भी मॉड्यूल द्वारा अपने एक्सटेंडर्स बनाए जा सकते हैं। Drupal का कोर दो बहुत उपयोगी एक्सटेंडर क्लास प्रदान करता है:

  • PagerDefault — पेजिनेशन जोड़ने के लिए।
  • TableSort — sortable टेबल हेडर्स के साथ क्वेरी को sort करने के लिए।

कई डेटाबेस ड्राइवरों का समर्थन

एक्सटेंडर्स db_select() की तरह ही डेटाबेस ड्राइवर के आधार पर क्लास खोजते हैं। उदाहरण के लिए, आप ExampleExtender_pgsql क्लास परिभाषित कर सकते हैं ताकि PostgreSQL के लिए विशिष्ट व्यवहार हो, और सामान्य ExampleExtender क्लास डिफ़ॉल्ट के रूप में उपयोग किया जाएगा यदि कोई विशेष ड्राइवर क्लास उपलब्ध नहीं है।