Не так давно мы рассматривали то, как при разработке сайтов создать ctools тип контента для модуля Panels. На этот раз пришел черед другого типа плагинов для Ctools, а именно - access plugin. Плагины этого вида являются некими правилами, по которым Panels решают показывать либо не показывать pane (наименьшую структурную единицу панелей), выбрать тот или иной вариант отображения самой панельки.
Для примера рассмотрим такую задачу: у нас есть стандартная панель user_view, которая переопределяет стандартное отображение страницы пользователя в Drupal. Есть пользователь А, который смотрит профиль пользователя Б. Если пользователь А зарегистрирован на сайте раньше пользователя Б, то ему будем показываться один набор полей, если наоборот - другой. Задача немного надуманная (и присутствуют намеки на дедовщину), но для примера сойдет.
Первым делом, как и в случае с ctools типом контента, нужно с помощью hook_ctools_plugin_directory() объявить, что у нас есть плагины:
/*
* Implements hook_ctools_plugin_directory().
*/
function access_example_ctools_plugin_directory($owner, $plugin_type) {
if ($owner == 'ctools' && !empty($plugin_type)) {
return "plugins/{$plugin_type}";
}
}
Далее в папке модуля создаем следующие папки: папку "plugins", в ней папку "access", и создаем в ней файл плагина - назовем его "access_example_plugin.inc". В файле плагина описываем правило доступа массивом:
/**
* Plugins are described by creating a $plugin array which will be used
* by the system that includes this file.
*/
$plugin = array(
// Plugin user-friendly name.
'title' => t('Eldership rule'),
// Plugin description.
'description' => t('Controls access depends on eldership'),
// Without required context plugin will now be shown in Panels UI.
'required context' => array(new ctools_context_required(t('User'), 'user')),
// Function which will allow or restrict access.
'callback' => 'access_example_who_elder_access',
// Plugin settings form.
'settings form' => 'access_example_who_elder_access_settings_form',
// Provides a summary descriptions depends on settings selected.
'summary' => 'access_example_who_elder_access_summary',
);


