Статьи

Создание нового типа узла Drupal

Drupal — это очень гибкая система управления контентом для создания веб-сайтов. Он предоставляет множество замечательных функций из коробки, которые позволяют нам создавать комплексные сайты без написания PHP-кода. Он также предоставляет функции для добавления большей функциональности за счет использования модулей.

По умолчанию типы узлов Drupal — это статья и страница. Это может быть полезно для базовых сайтов, но если мы планируем создать более сложный сайт, мы захотим добавить различные типы узлов. Мы даже можем определить их, написав модуль!

В этой статье вы узнаете, как написать собственный модуль Drupal, который будет устанавливать новые типы узлов, используя хуки и Drupal API.

Создание вашего модуля

Давайте начнем с создания базовой структуры модуля, в которой мы создадим наш новый тип контента.

Чтобы создать модуль, в каталоге sites/all/modulesproductcustomtype В этой папке создайте три файла:

  • productcustomtype.info
  • productcustomtype.install
  • productcustomtype.module

После того, как вы создали каталог, откройте productcustomtype.info

  name = productcustomtype
 описание = новый тип контента продукта
 пакет = Продукт Пользовательский тип узла
 core = 7.x
 файлы [] = productcustomtype.install
 files [] = productcustomtype.module 

Выше просто определяет некоторые параметры для нашего модуля, чтобы Drupal мог использовать его и отображать информацию о нашем модуле. Как только это будет сделано, мы должны увидеть наш модуль в списке модулей, как показано ниже. Но пока не включайте его — мы сделаем это после следующего шага.

Друпал-01

Установка и удаление узла

Как только у нас есть основные файлы для модуля, мы можем начать писать код для установки пользовательского типа узла. Первый хук, который нам нужно реализовать, это hook_node_info Используя этот хук, модуль может определять один или несколько типов узлов в Drupal. Реализация ловушки возвращает массив, определяющий новый тип узла, который модуль собирается добавить.

Чтобы реализовать этот хук, добавьте следующий код в productcustomtype.module

 <?php
/**
 * Implements hook_node_info()
 */
function productcustomtype_node_info() {
    return array(
        'product' => array(
            'name' => t('Product'),
            'base' => 'product',
            'description' => t('You can define new Products here'),
            'has_title' => TRUE,
            'title_label' => t('Product title')
         )
    );
}

Реализация возвращает массив, определяющий новый тип продукта узла, а также некоторые его свойства, такие как его имя, описание, если у него есть заголовок, и базу (которая используется в различных хуках для этого типа контента).

Поскольку мы определили, что этот тип узла имеет заголовок, нам нужно показать текстовое поле заголовка, когда отображается форма для этого узла, чтобы добавить содержимое. Для этого нам нужно будет реализовать hook_form

hook_form Хук реализован в productcustomtype.module

 <?php
/**
 * Implement hook_form()
 */
function product_form($node, $form_state) {
    return node_content_form($node, $form_state);
}

Мы просто используем Drupal API, который дает реализацию hook_formhas_title

Как только мы это сделаем, нам нужно реализовать хук hook_install

Добавьте реализацию в productcustomtype.install

 <?php
/**
 * Implements hook_install().
 */
function productcustomtype_install() {
    node_types_rebuild();
    $types = node_type_get_types();|
      node_add_body_field($types['product']); 
}

Сначала мы сохраняем все новые типы узлов, созданные различными модулями (включая наши), вызывая функцию Drupal API node_types_rebuild() Затем мы получаем все типы узлов и call node_add_body_field()

Как только мы это сделаем, мы можем включить наш модуль, который установит наш новый тип узла. Тогда мы сможем увидеть наш новый тип, когда нажмем « Добавить содержимое» следующим образом:

Друпал-02

Если мы добавим новый продукт, он также появится на домашней странице Drupal.

Друпал-03

Все модули в Drupal должны очищать любые данные, которые они создают в базе данных, или любые типы, которые они добавляли, когда они удаляются пользователем. Чтобы поддержать это, мы должны реализовать hook_uninstallproductcustomtype.install

 <?php
/**
 * Implements hook_uninstall().
 */
function productcustomtype_uninstall() {
    $ournewtype = 'product';
    $sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
    $result = db_query($sql, array(':type' => $ournewtype));
    $nodeids = array();
    foreach ($result as $row) {
        $nodeids[] = $row->nid;
    }
    node_delete_multiple($nodeids);
    node_type_delete($ournewtype);
}

Сначала мы узнаем все идентификаторы узлов, которые являются узлами нашего установленного типа контента. Как только мы собрали идентификаторы, мы используем функцию API node_delete_multiple() Затем мы используем node_type_delete()

Теперь, если мы удалим наш модуль, все узлы нашего типа и сам наш тип должны быть удалены.

Создание дополнительных полей

Как только мы добавили новый тип узла, у нас появилась функциональность, аналогичная функциональности узла. Но что, если мы хотим добавить больше полей в зависимости от типа узла? Например, если это тип продукта, мы могли бы добавить еще два поля, такие как цена и количество.

Для этого нам нужно сначала создать поля, а затем создать экземпляры полей для нашего типа узла. Мы пишем две новые функции в файле productcustomtype.install

 <?php
function _productcustomtype_installed_fields() {
    $t = get_t();
    return array(
        'productcustomtype_price' => array(
            'field_name' => 'productcustomtype_price',
            'label' => $t('Price of the product'),
            'type' => 'text'
        ),
        'productcustomtype_quantity' => array(
            'field_name' => 'productcustomtype_quantity',
            'label' => $t('Quantity of the product'),
            'type' => 'text'
        )
    );
}

function _productcustomtype_installed_instances() {
    $t = get_t();
    return array(
        'productcustomtype_price' => array(
            'field_name' => 'productcustomtype_price',
            'type' => 'text',
            'label' => $t('Price of the product'),
            'widget' => array(
                'type' => 'text_textfield'
            ),
            'display' => array(
                'example_node_list' => array(
                    'label' => $t('Price of the product'),
                    'type' => 'text'
                )
            )
        ),
        'productcustomtype_quantity' => array(
            'field_name' => 'productcustomtype_quantity',
            'type' => 'text',
            'label' => $t('Quantity of the product'),
            'widget' => array(
                'type' => 'text_textfield'
            ),
            'display' => array(
                'example_node_list' => array(
                    'label' => $t('Quantity of the product'),
                    'type' => 'text'
                )
            )
        )
    );
}

Затем мы создаем функцию add_custom_fields()productcustomtype.install

 <?php
function add_custom_fields() {
    foreach (_productcustomtype_installed_fields() as $field) {
        field_create_field($field);
    }
    foreach (_productcustomtype_installed_instances() as $fieldinstance) {
        $fieldinstance['entity_type'] = 'node';
        $fieldinstance['bundle'] = 'product';
        print_r($fieldinstance);
        field_create_instance($fieldinstance);
    }
}

Теперь мы можем просто вызвать add_custom_fields()productcustomtype_install()

 <?php
function productcustomtype_install() {
    node_types_rebuild();
    $types = node_type_get_types();
    node_add_body_field($types['product']);
    add_custom_fields();
}

Нам также необходимо обновить нашу productcustomtype_uninstall()

 <?php
function productcustomtype_uninstall() {
    $ournewtype = 'product';
    $sql = 'SELECT nid FROM {node} n WHERE n.type = :type';
    $result = db_query($sql, array(':type' => $ournewtype));
    $nodeids = array();
    foreach ($result as $row) {
        $nodeids[] = $row->nid;
    }
    node_delete_multiple($nodeids);
    delete_custom_fields();
    node_type_delete($ournewtype);
    field_purge_batch(500);
}

function delete_custom_fields() {
    foreach (array_keys(_productcustomtype_installed_fields()) as $field) {
        field_delete_field($field);
    }
    $instances = field_info_instances('node', 'product');
    foreach ($instances as $instance_name => $fieldinstance) {
        field_delete_instance($fieldinstance);
    }
}

Установите модуль еще раз и нажмите на продукт, чтобы добавить новый продукт, и мы должны увидеть два поля, как показано ниже:

Друпал-04

После того, как мы сохраним узел и увидим его в окне предварительного просмотра, мы увидим поля следующим образом:

Друпал-05

Вывод

Drupal CMS предоставляет множество полезных хуков и мощный API, который позволяет нам выполнять различные настройки. В этой статье мы смогли создать совершенно новый тип узла, который появится в разделе контента Drupal. И используя API Drupal, мы также прикрепили поля к этому новому типу узла, чтобы любой мог легко добавить контент, используя новый тип узла. Так что получайте удовольствие, создавая новый тип узла для своего сайта в Drupal.

Изображение через Fotolia