Views API. Опис своїх таблиць.

20.08.2012
Views API. Define custom table
Автор:

При написанні сайтів, трапляються завдання, для вирішення котрих необхідно створювати свою таблицю в базі даних і потім власними ж запитами взаємодіяти із цією таблицею. За таких обставин написання численних запитів стане досить виснажливим заняттям. Аби вирішити цю проблему досить описати таблицю для всіма улюбленого модуля Views. Як це зробити ми і розглянемо.
Насамперед створюємо нову таблицю в базі даних:

/**
 * Implements hook_schema().
 */
function example_module_schema() {
  $schema['example_table'] = array(
    'fields' => array(
      'nid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => FALSE,
        'default' => 0,
        'description' => 'Node {node}.nid.',
      ),
      'uid' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => FALSE,
        'default' => 0,
        'description' => 'User {users}.uid.',
      ),
      'plai_text_field' => array(
        'description' => 'Example textfield.',
        'type' => 'varchar',
        'length' => 255,
        'not null' => TRUE,
        'default' => '',
      ),
      'timestamp_field' => array(
        'type' => 'int',
        'unsigned' => TRUE,
        'not null' => TRUE,
        'default' => 0,
        'description' => 'Some timestamp.',
      ),
    ),
    'primary key' => array('nid'),
  );
  
  return $schema;
}

Будемо записувати в таблицю ідентифікатор ноди, uid користувача, якийсь текст, що відноситься до ноди і користувача (відгук, коментар) та мітку часу.

Далі у своєму модулі оголошуємо про те, що ми будемо використовувати API в’юшок:

/**
 * Implements hook_views_api().
 */
function example_module_views_api() {
  return array(
    'api' => 3,
    'path' => drupal_get_path('module', 'example_module'),
  );
}

Після цього створюємо файл example_module.views.inc і в ньому оголошуємо hook_views_data(). Першим йде розділ опису таблиці, в якому вказуємо такі властивості:

  • "group" - назва групи, в якій наші налаштовування будуть виводитися. Наприклад: "Node: Node ID", "Taxonomy: Term description". Це важливо для цілісності, так як користувацький інтерфейс в’юшок сортує поля по групах, і це полегшить пошук
  • "title" - назва поля, воно має бути зрозумілим та інтуїтивним
  • "help" - більш докладний опис

Зазвичай використовується тільки властивість "group".
Якщо ви хочете, щоб ваша таблиця була центральною у в'юшці, ви можете визначити її як базову.
В цьому випадку можна вказати такі властивості:

  • "field" - primary key для оголошуваної таблиці. Якщо ви хочете зробити таблицю базовою, primary key обов'язковий. Для таблички node primary key - це nid, для users - uid
  • "title" - назва таблиці, яка буде відображатися в інтерфейсі користувача
  • "help" - більш детальний опис
  • "database" - в разі, якщо таблиця, яку ви оголошуєте знаходиться в іншій базі даних, це поле обов'язкове

Також ми можемо створити відкритий зв'язок нашої таблиці з будь-якою іншою (в даному прикладі з таблицею "node"). Для цього в розділі "join" вказуємо такі властивості:

  • "handler" - обробник, який буде використовуватися. За замовчуванням це "views_join". Ви можете використовувати свій, але для вирішення спільних задач в цьому нема необхідності
  • "table" - таблиця, до якої ми будемо приєднуватися. Властивість опціональна і в загальних випадках непотрібна. 
  • "field" - поле по якому будемо приєднувати таблицю - це обов'язкова властивість
  • "left_table" - наступний крок для досягнення цільової таблиці - проміжна таблиця. Якщо проміжної немає, то не вказуємо цю властивість
  • "left_field" - поле по якому будемо приєднувати таблицю "ліворуч" - це обов'язкова властивість
  • "type" - LEFT (за замовчуванням) або INNER
/**
 * Implements hook_views_data()
 */
function example_module_views_data() {
  // The 'group' index will be used as a prefix in the UI for any of this
  // table's fields, sort criteria, etc. so it's easy to tell where they came
  // from.
  $data['example_table']['table']['group'] = t('Example table');

  // Define this as a base table. In reality this is not very useful for
  // this table, as it isn't really a distinct object of its own, but
  // it makes a good example.
  $data['example_table']['table']['base'] = array(
    'field' => 'nid',
    'title' => t('Example table'),
    'help' => t("Example table contains example content and can be related to nodes."),
    'weight' => -10,
  );

  // This table references the {node} table.
  // This creates an 'implicit' relationship to the node table, so that when 'Node'
  // is the base table, the fields are automatically available.
  $data['example_table']['table']['join'] = array(
    // Index this array by the table name to which this table refers.
    // 'left_field' is the primary key in the referenced table.
    // 'field' is the foreign key in this table.
    'node' => array(
      'left_field' => 'nid',
      'field' => 'nid',
    ),
  );

Отже, таблицю ми оголосили. Далі потрібно описати поля в таблиці. Поля можуть мати такі властивості:

  • "group", "title", "help" - як і для таблиці, значення цих полів використовуються в інтерфейсі користувача
  • "real field" - якщо поле - це синонім, то тут потрібно вказати реальне ім'я поля
  • "field" - оголошення масива обробника для секції "Field". За замовчуванням використовується "views_handler_field". Якщо цей параметр вказаний, то поле з'явиться в списку полів для виводу. Атрибут "click_sortable", установленний в TRUE дозволяє сортування по цьому полю (в таблицях, наприклад)
  • "filter" - оголошення масива обробника для секції "Filters". За замовчуванням використовується "views_handler_filter". Якщо цей параметр вказаний, то поле з'явиться в списку полів для фільтрації
  • "sort" - оголошення масиву обробника для секції "Sort criteria". За замовчуванням використовується "views_handler_sort". Якщо цей параметр вказаний, то поле з'явиться в списку полів для сортування
  • "relationship" - дозволяє додавати зв'язки по цьому полю - секція "Relationship". За замовчуванням використовується обробник "views_handler_relationship". Обов'язково потрібно вказати базову таблицю для приєднання - елемент "base" і поле, по якому це приєднання буде відбуватися - елемент "field"
  • "argument" - оголошення масиву обробника для секції "Contextual Filters". За замовчуванням використовується обробник "views_handler_argument".
 // Next, describe each of the individual fields in this table to Views. For
  // each field, you may define what field, sort, argument, and/or filter
  // handlers it supports. This will determine where in the Views interface you
  // may use the field.

  // Node ID field.
  $data['example_table']['nid'] = array(
    'title' => t('Example content'),
    'help' => t('Some example content that references a node.'),
    // Because this is a foreign key to the {node} table. This allows us to
    // have, when the view is configured with this relationship, all the fields
    // for the related node available.
    'relationship' => array(
      'base' => 'node',
      'field' => 'nid',
      'handler' => 'views_handler_relationship',
      'label' => t('Example node'),
    ),
  );

  // Example plain text field.
  $data['example_table']['plain_text_field'] = array(
    'title' => t('Plain text field'),
    'help' => t('Just a plain text field.'),
    'field' => array(
      'handler' => 'views_handler_field',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_string',
    ),
    'argument' => array(
      'handler' => 'views_handler_argument_string',
    ),
  );


  // Example timestamp field.
  $data['example_table']['timestamp_field'] = array(
    'title' => t('Timestamp field'),
    'help' => t('Just a timestamp field.'),
    'field' => array(
      'handler' => 'views_handler_field_date',
      'click sortable' => TRUE,
    ),
    'sort' => array(
      'handler' => 'views_handler_sort_date',
    ),
    'filter' => array(
      'handler' => 'views_handler_filter_date',
    ),
  );

  return $data;
}

В результаті отримуємо дуже зручний інтерфейс, позбавляємось необхідності писати мільйони запитів і отримуємо зручність в обслуговуванні сайту.

Дякую за увагу.

Голосів: 1 Рейтинг: 5

Також по темі

2

В наші дні всі знають про такі ітернет магазини як eBay, Amazon і.т.д. Проте, мало хто знає...

3

Не всі знають, що модуль Views надає досить обширний API....

4

В продовження двох попередніх статей (клікклік) про...

5

Інколи виникає необхідність для зручності вводу даних створити поле з автозапоненням (autocomplete field). Прикладами таких полів можуть бути віджети для cck-полів Node reference i User reference...

Subscribe to our blog updates