Добавляем поддержку 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                     888b     d888 
d88888 8888b d8888
d88P888 88888b.d88888
d88P 888 .d8888b 888d888 888Y88888P888
d88P 888 d88P" 888P" 888 Y888P 888
d88P 888 888 888 888 Y8P 888
d8888888888 Y88b. 888 888 " 888
d88P 888 "Y8888P 888 888 888


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