Добавляем поддержку 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.

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

               d8888    .d8888b.            
d8P888 d88P Y88b
d8P 888 888
.d8888b d8P 888 888d888b. 888 888
88K d88 888 888P "Y88b `Y8bd8P'
"Y8888b. 8888888888 888 888 X88K
X88 888 Y88b d88P .d8""8b.
88888P' 888 "Y8888P" 888 888


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