Добавляем поддержку Token'ов в настройки Panel Pane
Всем привет! Сегодня столкнулся с небольшой задачкой: как добавить поддержку Token'ов в кастомный Panel Pane. Как оказалось ничего сложно, но на всякий случай оставлю заметку.
Для начала описываем новый плагин, в котором отмечаем, что у нас будет использоваться форма настроек. Да, сразу скажу, что этот плагин у меня создавался для страницы отображения ноды.
- /**
- * Plugins are described by creating a $plugin array which will be used
- * by the system that includes this file.
- */
- $plugin = array(
- 'single' => TRUE,
- 'title' => t('Deal Participant'),
- 'description' => t('Participant information.'),
- 'render callback' => 'gm_deal_participant_content_type_render',
- 'required context' => new ctools_context_required(t('Node'), 'node'),
- 'edit form' => 'gm_deal_participant_content_type_edit_form',
- 'category' => t('GM Deal'),
- );
Без каких либо премудростей описываем форму с настройками:
- /**
- * Panel pane settings form.
- *
- * @param $form
- * @param $form_state
- */
- function gm_deal_participant_content_type_edit_form($form, &$form_state) {
- $conf = $form_state['conf'];
-
- $form['uid'] = array(
- '#type' => 'textfield',
- '#title' => t('User ID'),
- '#description' => t('Tokens are supported.'),
- '#default_value' => isset($conf['uid']) ? $conf['uid'] : NULL,
- );
-
- return $form;
- }
-
- /**
- * Submit callback for panel form settings.
- *
- * @param $form
- * @param $form_state
- */
- function gm_deal_participant_content_type_edit_form_submit($form, &$form_state) {
- $form_state['conf'] = array(
- 'uid' => $form_state['values']['uid'],
- );
- }
Замена Token на значение
Ну и собственно вся магия раскрывается в следующем листинге, который описывает рендер панельки:
- /**
- * Panel pane render.
- *
- * @param $subtype
- * @param $conf
- * @param $args
- * @param $context
- * @return null|stdClass
- */
- function gm_deal_participant_content_type_render($subtype, $conf, $args, $context) {
- if (empty($context) || empty($conf['uid'])) {
- return NULL;
- }
-
- // Добавляем возможность использования Token.
- // Сформируем параметры в нужном формате и передадим на вход функции замены токенов.
- $contexts = new stdClass();
- $contexts->{$context->id} = $context;
- $uid = ctools_context_keyword_substitute($conf['uid'], array(), $contexts);
-
- $user_obj = user_load($uid);
-
- $block = new stdClass();
- $block->content = 'Hello, world!';
- return $block;
- }
Вот такой хитрый прием у меня получился на скорую руку. Хотя в определенный момент я понял, что лучше было бы заморочится на контексте, но об этом уже, наверное, в другой заметке.
Комментарии
Скажите, пожалуйста, зачем это делать, если в custom panel есть чекбокс Use context keywords? Добавляете нужный контекс и используете.
Добавить комментарий