Rules با نزدیک به ۱۹۳۰۰۰ استفاده کننده یکی از قدرتمندترین ابزارهای دروپالیست. بسیاری از کارهایی که نیاز به نوشتن ماژولهای سفارشی دارند با این ماژول قابل پیادهسازیه. اما بعضی از ابزارهایی که در کد در اختیار توسعه دهندگان قرار گرفته هنوز رابطی برای استفاده در این ماژول ندارند، از جمله EFQ که ما سعی کردیم این نقص رو برطرف کنیم.
پیچیدهترین فلوچارتها و سختترین کارها رو در کمترین زمان میتوان با Rules پیادهسازی کرد. یکی از نیازهای این کار، پیدا کردن موجودیتها (Entity) از پایگاه دادست. شاید بخوایم فقط گرههایی (Node) که فیلدی با نام my_custom_select_list با مقداری مشخص دارند همچنین نویسندهی آنها کاربر جاری سایت هست رو پیدا کنیم (در صورت وجود فقط یک شرط، میشه از خود Rules استفاده کرد اما کار جایی پیچیده میشه که شرطها از یک عدد زیادتر میشن). اولین ابزاری که به ذهن میرسه، استفاده از Views است، اما ساخت یک view، افزودن فیلد مورد نظر و تعیین دسترسیهای مربوطه، هم کار طاقتفرساییه هم صفحهی مدیریت views رو شلوغ میکنه.
برای این کار، توی کد، ابزاری به اسم EntityFieldQuery یا به اختصار EFQ برای Query از موجودیتها بر اساس فیلدها و خصیصههای مختلفشون وجود داره برای مطالعهی صفحهی راهنمای این کلاس (class) به دروپال مراجعه کنید. نمونه کدی از EFQ برای واژههای ردهبندی (taxonomy terms) با فیلد related_user از نوع entity reference، به این صورت خواهد بود:
$uid = $GLOBALS['user']->uid; // Create the EFQ object. $taxonomny_query = new EntityFieldQuery(); // 1.Add condition: Entity should be of type taxonomy_term. // 2.Add codition: it's <related_user> field must have same value as current user. // 3.Order the result: Order fetched terms by term id. // 4.Limit it: Only load maximum of 5 terms. $terms = $taxonomny_query->entityCondition('entity_type', 'taxonomy_term') ->fieldCondition('related_user', 'target_id', $uid) ->propertyOrderBy('tid', 'DESC') ->range(0, 5) ->execute(); $loaded_terms = array(); // Make sure EFQ found something. if (isset($terms['taxonomy_term'])) { $tids = array_keys($terms['taxonomy_term']); foreach ($tids as $tid) { $loaded_terms[$tid] = taxonomy_term_load($tid); } } // Do something with $loaded_terms here.
اما ازآنجایی که یکی از مزیتهای Rules ننوشتن کد هست، استفاده از EFQ در نگاه اول زیاد جالب به نظر نمیاد. اما با EFQ Rules میتونید قدرت EFQ رو به Rules بیارید. این ماژول، یک نوع دادهای برای EFQ در Rules تعریف میکنه (انواع دادههای Rules و تعریف اونها). اما کار اصلی در کنشهای (Action) این ماژول صورت میگیره. برای شروع فرایند EFQ، نیازی به افزودن یک متغیر از نوع EFQ ندارید، بلکه کنشی به نام "New EntitiFieldQuery" برای ساخت و تعریف متغیر EFQ وجود داره.
بعد از ساختن EFQ، با سایر کنشها میتونید شرطها و مقادیر مورد نظر رو به EFQ خودتون اضافه کنید، مثل شرط موجودیتهایی که از نوع خاصی هستند یا دارای فیلد مورد نظر شما هستند و این فیلد مقدار مشخصی داره. برای راهنمای کامل کارهایی که میشه انجام داد، به ضفحهی EFQ در دروپال مراجعه کنید. پیدا کردن معادل هر متد این کلاس در کنشهای این ماژول کار آسونی خواهد بود. در نهایت، کنشی با نام Execute EFQ and fetch entities وجود داره که EFQ رو اجرا و موجودیتهای پیدا شده رو بارگذاری و به شما برمیگردونه.
این ماژول همچنان در مرحلهی ابتدایی قرار داره و با سایر دوستای دروپالیمون در drupal.org مشغول تست و بررسی اون هستیم ولی به زودی به یک ماژول کامل تبدیل خواهد شد. از دوست عزیزمون axel.rutz هم که با ما همکاری کرد تشکر میکنم.
شاد و موفق باشید.