Как визуализировать тип контента ctools программно?

12

У меня есть плагин ctools ака. тип контента ака. панель панели. Как сделать это программно?

роги
источник
+1, очень интересный вопрос. Мне интересно, может ли плагин ctools отображаться вне страницы менеджера страниц? Поскольку в этом случае нет контекста, имеет ли смысл отображать тип содержимого по-прежнему?
Летарион
Использование контекстов не обязательно. Кроме того, принудительное использование контекста всегда возможно. Как здесь - gist.github.com/3076130
roGi

Ответы:

4

ctools_content_render() это решение.

роги
источник
2
Можете ли вы привести пример того, как это будет работать? Я читаю документы и пробую что-то, но никуда не деться
Пол Шелдрейк
В зависимости от того, где вы вызываете ctools_content_render (), вам также может понадобиться перенести код ctools в область действия, иначе вы получите фатальные ошибки. Это может быть достигнуто с помощью "module_load_include (" inc "," ctools "," includes / content ");"
alexkb
Не забудьте включить ctools_include('content');ранее ctools_content_render(), так как в противном случае вы получите фатальную ошибку.
Андрей Руденко
3

В этом ctools_ajax_sampleмодуле есть отличный и простой пример того, как это сделать (в наборе CTools).

Как уже было отмечено, ключ заключается в использовании функции ctools_content_render().

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

Этот поток в Drupal Groups дает больше информации о том, как загрузить правильный контекст.

файл ctools/ctools_ajax_sample/ctools_ajax_sample.module

function ctools_ajax_simple_form() {
  ctools_include('content');
  ctools_include('context');
  $node = node_load(1);
  $context = ctools_context_create('node', $node);
  $context = array('context_node_1' => $context);
  return ctools_content_render('node_comment_form', 'node_comment_form', ctools_ajax_simple_form_pane(), array(), array(), $context);
}

function ctools_ajax_simple_form_pane() {
  $configuration = array(
    'anon_links' => 0,
    'context' => 'context_node_1',
    'override_title' => 0,
    'override_title_text' => '',
  );
  return $configuration;
}
bmunslow
источник
2

Если вы загружаете требуемый файл, все, что вам действительно нужно сделать, - это вызвать функцию render ( hook_content_type_render), которая будет возвращать стандартный объект класса, так же, как и hook_block_viewделает.
Все, что вам нужно, - это функция темы, если только вы не хотите визуализировать необработанный вывод напрямую.

В коде это может выглядеть примерно так:

function render_ctools_content($subtype, $conf, $panel_args, $context, $function, $file, $theme = TRUE) {
  require_once $file;
  $pane = new stdClass();
  if (function_exists($function)) {
    $pane = $function($subtype, $conf, $panel_args, $context); // hook_content_type_render
  }
  if ($theme) {
    return theme('module_ctools_content', array('pane' => $pane));
  }
  return $pane->content;
}
googletorp
источник
1
Спасибо за ответ. Вызов функции рендеринга напрямую, конечно, очевидный выбор. Но это решение больше похоже на взлом. Я ищу что-то вроде "ctools_render_ctype ('ctype_name')" :)
roGi
@roGi Этой функции не существует, то, что я показал выше, это суть того, как она будет выглядеть, но, вероятно, будет нереально сделать что-то настолько простое, как вы предлагаете, так как типы контента ctools не такие просто.
googletorp
0

Мне удалось вытащить панель с панорамированием с помощью следующего кода:

module_load_include('inc', 'page_manager', 'plugins/tasks/node_view');
$node = node_load($nid);
$render = page_manager_node_view_page($node);
echo drupal_render($render);
chadpeppers
источник
Включив файл плагина, module_load_include()вы можете нарушить процесс загрузки плагинов ctools. CTools использует require_onceметод, поэтому, если файл был ранее включен сторонним скриптом, будет невозможно включить его с помощью ctools (и $pluginмассива разбора ). Таким образом, ваша панель не будет работать в других местах.
Андрей Руденко