Добавляем поддержку Token'ов в настройки Panel Pane

Всем привет! Сегодня столкнулся с небольшой задачкой: как добавить поддержку Token'ов в кастомный Panel Pane. Как оказалось ничего сложно, но на всякий случай оставлю заметку.

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

  1. /**
  2.  * Plugins are described by creating a $plugin array which will be used
  3.  * by the system that includes this file.
  4.  */
  5. $plugin = array(
  6. 'single' => TRUE,
  7. 'title' => t('Deal Participant'),
  8. 'description' => t('Participant information.'),
  9. 'render callback' => 'gm_deal_participant_content_type_render',
  10. 'required context' => new ctools_context_required(t('Node'), 'node'),
  11. 'edit form' => 'gm_deal_participant_content_type_edit_form',
  12. 'category' => t('GM Deal'),
  13. );

Без каких либо премудростей описываем форму с настройками:

  1. /**
  2.  * Panel pane settings form.
  3.  *
  4.  * @param $form
  5.  * @param $form_state
  6.  */
  7. function gm_deal_participant_content_type_edit_form($form, &$form_state) {
  8. $conf = $form_state['conf'];
  9.  
  10. $form['uid'] = array(
  11. '#type' => 'textfield',
  12. '#title' => t('User ID'),
  13. '#description' => t('Tokens are supported.'),
  14. '#default_value' => isset($conf['uid']) ? $conf['uid'] : NULL,
  15. );
  16.  
  17. return $form;
  18. }
  19.  
  20. /**
  21.  * Submit callback for panel form settings.
  22.  *
  23.  * @param $form
  24.  * @param $form_state
  25.  */
  26. function gm_deal_participant_content_type_edit_form_submit($form, &$form_state) {
  27. $form_state['conf'] = array(
  28. 'uid' => $form_state['values']['uid'],
  29. );
  30. }

Замена Token на значение

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

  1. /**
  2.  * Panel pane render.
  3.  *
  4.  * @param $subtype
  5.  * @param $conf
  6.  * @param $args
  7.  * @param $context
  8.  * @return null|stdClass
  9.  */
  10. function gm_deal_participant_content_type_render($subtype, $conf, $args, $context) {
  11. if (empty($context) || empty($conf['uid'])) {
  12. return NULL;
  13. }
  14.  
  15. // Добавляем возможность использования Token.
  16. // Сформируем параметры в нужном формате и передадим на вход функции замены токенов.
  17. $contexts = new stdClass();
  18. $contexts->{$context->id} = $context;
  19. $uid = ctools_context_keyword_substitute($conf['uid'], array(), $contexts);
  20.  
  21. $user_obj = user_load($uid);
  22.  
  23. $block = new stdClass();
  24. $block->content = 'Hello, world!';
  25. return $block;
  26. }

Вот такой хитрый прием у меня получился на скорую руку. Хотя в определенный момент я понял, что лучше было бы заморочится на контексте, но об этом уже, наверное, в другой заметке.

Комментарии

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

Скажите, пожалуйста, зачем это делать, если в custom panel есть чекбокс Use context keywords? Добавляете нужный контекс и используете.

Аватар пользователя angarsky
angarsky
А если мне надо вывести не просто текст с плэйсхолдерами, а добавить логику? Поэтому я и начал писать плагин. Идея с токенами мне и самом не очень нравится, но ничего другого мою задачу решить не помогло. Сразу пытался Context plugin написать, но там уперся в рамки API.

Добавить комментарий

  .d8888b.   8888888b.             888       888 
d88P Y88b 888 Y88b 888 o 888
.d88P 888 888 888 d8b 888
8888" 888 d88P .d88b. 888 d888b 888
"Y8b. 8888888P" d8P Y8b 888d88888b888
888 888 888 88888888 88888P Y88888
Y88b d88P 888 Y8b. 8888P Y8888
"Y8888P" 888 "Y8888 888P Y888


Зарегистрируйтесь для добавления материалов без проверки.