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

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

      888                      8888888888 
888 888
888 888
.d88888 88888888 88888b. 8888888
d88" 888 d88P 888 "88b 888
888 888 d88P 888 888 888
Y88b 888 d88P 888 888 888
"Y88888 88888888 888 888 8888888888


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