Добавляем поддержку 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.    .d8888b.    .d8888b.  
d88P Y88b d88P Y88b d88P Y88b
.d88P 888 888 888 888
.d88b. 8888" Y88b. d888 Y88b. d888
d8P Y8b "Y8b. "Y888P888 "Y888P888
88888888 888 888 888 888
Y8b. Y88b d88P Y88b d88P Y88b d88P
"Y8888 "Y8888P" "Y8888P" "Y8888P"


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