Как создать content_type плагин для модуля Ctools

При работе с модулем Panels content_types плагины являются очень важной составляющей страницы. Для начала давайте разберемся, что же такое content_types плагины и для чего они нужны. Когда мы перекрываем страницу модулем Page Manager и изменяем вывод страницы модулем Panels, именно с помощью content_types плагинов мы выводим содержимое на страницу.

Любому друпалеру рано или поздно придется написать свой плагин. И сегодня я покажу как это сделать. Для примера, я напишу плагин, который будет выводить текст, введенный пользователем.

Итак, переходим к созданию content_type плагина.

Шаг 1. Этот шаг стандартный, нам необходимо создать модуль. Создаем в "sites/all/modules" каталог "example", а внутри него файлы "example.info" и "example.module". Содержимое "example.info":

name = Example
description = Content type plugin example
core = 7.x

dependencies[] = ctools

Шаг 2. Теперь нам необходимо указать в какой папке будет храниться наш плагин (плагины принято хранить в папке plugins внутри модуля), для этого имплементируем хук hook_ctools_plugin_directory(). Содержимое "example.module":

<?php

/**
 * Implements hook_ctools_plugin_directory().
 */
function example_ctools_plugin_directory($module, $plugin) {
  if ($module == 'ctools' && !empty($plugin)) {
    return 'plugins/' . $plugin;
  }
}

Шаг 3. Теперь нам необходимо описать наш плагин. Он будет описан в файле "plugins/content_types/exampe_text.inc". Открываем файл "exampe_text.inc" и добавляем туда следующее:

<?php

$plugin = array(
  'title' => t('Example content type plugin'), // Название плагина, отображаемое при его выборе.
  'description' => t('The output a custom text.'), // Описание плагина, отображаемое при его выборе.
  'render callback' => 'example_text_content_type_render', // Функция, которая будет формировать и выводить содержимое плагина.
  'edit form' => 'example_text_edit_form', // Форма с настройками плагина.
  'category' => t('Custom panes'), // Категория, в которой будет находиться плагин.
  'single' => TRUE, // Флаг, указывающий является ли плагин подтипом другого.
);

Здесь я использовал не все возможные параметры, вот список, на мой взгляд, наиболее важных параметров:

$plugin = array(
  'title' => t('Content type plugin title'), // Название плагина, отображаемое при его выборе.
  'description' => t('Content type plugin description.'), // Описание плагина, отображаемое при его выборе.
  'render callback' => 'module_name_content_type_render', // Функция, которая будет формировать и выводить содержимое плагина.
  'edit form' => 'module_name_edit_form', // Форма с настройками плагина.
  'category' => t('Content type plugin category'), // Категория, в которой будет находиться плагин.
  'required context' => new ctools_context_required(t('Node'), 'node'), // Обязательный контекст, без которого плагин не будет работать.
  'all contexts' => TRUE, // Флаг, указывающий, что плагину будут доступны все контексты.
  'single' => TRUE, // Флаг, указывающий является ли плагин подтипом другого.
);

Шаг 4. Создаем форму с настройками для плагина. В этом же файле, сразу после описания плагина добавляем следующее:

/**
 * 'Edit form' callback for the content type.
 */
function example_text_edit_form($form, &$form_state) {
  // Получаем ранее введенные настройки.
  $conf = $form_state['conf'];

  $form['text'] = array(
    '#type' => 'textarea',
    '#title' => t('Custom text'),
    '#default_value' => !empty($conf['text']) ? $conf['text'] : '',
  );

  return $form;
}

/**
 * Submit callback for the example_text_edit_form().
 */
function example_text_edit_form_submit($form, &$form_state) {
  // Сохраняем настройки.
  $form_state['conf'] = array(
    'text' => $form_state['values']['text'],
  );
}

Шаг 5. Теперь необходимо создать функцию, которая будет выводить наше содержимое. В этом же файле в конец добавляем следующее:

/**
 * Render callback for the content type.
 */
function example_text_content_type_render($subtype, $conf, $args, $context) {

  // Если в настройках плагина не ввели текст, то ничего не выводим.
  if (empty($conf['text'])) {
    return;
  }

  $block = new stdClass();
  $block->content = $conf['text'];
  return $block;
}

На этом урок можно было бы завершить, но я обязан упомянуть важную функцию при создании content_types плагинов. Иногда может понадобиться в настройках плагина использовать токены. Для того, чтобы потом вывести обработанную строку необходимо воспользоваться функцией ctools_context_keyword_substitute.

Комментарии (5)

Аватар пользователя Андрей
Андрей

Здравствуйте.
Что-то не видно плагина в списке выбора. Я вообще так делаю?:
Создал этот модуль, включил. Пошел на страницу "admin/structure/pages" и нажал "Create a new page".
Вбил "Administrative title", вписал "Path" и нажал "Continue".
На следующей странице выбрал себе "Columns: 1", нажал "Continue".
Дальше установил чекбокс "Disable Drupal blocks/regions" и нажал "Continue".
Потом вписал Title и нажал "Finish".
Дальше в "Variants » Panel » Contexts" в выпадающем списке пытался найти "Example content type plugin", но его там нет.
Я что-то упустил? Не пойму.

Аватар пользователя Андрей
Андрей

Да, я уже тогда через минуту нашел. Спасибо.

Аватар пользователя PVasili
PVasili

А как в 1 модуле сделать несколько плагинов?

Аватар пользователя Benya
Benya

Каждый плагин находится в своем файле. Просто создается новый файл рядом с первым и в нем создаешь новый плагин