تصویر محمدعلی اکبری

چرا به ایجاد نوع موجودیت جدید نیاز داریم؟

در پروژه‌های کوچک می‌توان همه چیز را با موجودیت‌های موجود در دروپال ایجاد کرد. اما وقتی صحبت از سرعت در پروژه های بزرگ به میان می‌آید تا جای ممکن باید از Node و فاصله گرفت و آنها را برای تنها محتوا استفاده کرد. زیرا تعداد زیادی hook برای node ها فراخوانی می‌شوند. nodeها نسخه بندی (revision) می‌شوند. همچنین اگر فیلدهای هر موجودیت را از قبل میدانیم میتوانیم آنها را مستقیم در مجودیت خود تعریف کنیم و از join ها با جداول field ها خود داری کنیم.

برای ایجاد موجودیت از ماژول Entity API استفاده می‌کنیم. به این ترتیب حجم کدهایی که باید نوشته شود کاهش پیدا میکند و ماژول مورد نظر خیلی تمیز تر نوشته می‌شود.

ابتدا جدول مربوط به موجودیت را با استفاده از database schema API بسازید.

سپس آن را به دروپال معرفی کنید. می‌توانید تنظیمات ممکن را از API reference مشاهده کنید.

<?php
/**
* Implements hook_entity_info().
*/
function examplemodule_entity_info() {
  return array(
    'name_of_entity' => array(
      'label' => t('Name of entity'),
      'base table' => 'your_table',
      'entity keys' => array(
        'id' => 'your_tables_primary_key',
      ),
    ),
  );
}
?>

برای آنکه موجودیت جدید توسط menu callback شناسایی شود و به صورت خودکار بارگذاری شود hook_load و hook_load_multiple را نیز پیاده سازی کنید.

<?php
/**
* Load a single record.
*
* @param $id
*    The id representing the record we want to load.
*/
function examplemodule_load($id, $reset = FALSE) {
  return examplemodule_load_multiple(array($id), $reset);
}

/**
* Load multiple records.
*/
function examplemodule_load_multiple($ids = array(), $conditions = array(), $reset = FALSE) {
  return entity_load('name_of_entity', $ids, $conditions, $reset);
}
?>

در صورتی که نیاز دارید موجودیت جدید قابلیت پذیرفتن فیلد‌ها را داشته باشد چندین hook دیگر نیز باید پیاده سازی شود.

<?php
function examplemodule_build_modes($obj_type) {
  $modes = array();
  if ($obj_type == 'examplemodule') {
    $modes = array(
      'full' => t('Full node'),
      'teaser' => t('Teaser'),
    );
  }
  return $modes;
}
?>

افزودن نظر جدید