При работе с модулем 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.