Як візуально відобразити тип вмісту ctools?


12

У мене є плагін ctools ака. контент-тип ака. панель панелей. Як це рендерує програмно?


+1, дуже цікаве запитання. Мені цікаво, чи може плагін ctools відображатися за межами сторінки менеджера сторінки? Оскільки це буде недійсним у контексті, чи має вигляд типу вмісту все-таки сенс?
Летаріон

Використання контекстів не є обов'язковим. Крім того, форсування контексту вручну - це завжди варіант. Як ось - gist.github.com/3076130
roGi

Відповіді:


4

ctools_content_render() є рішенням.


2
Чи можете ви навести приклад того, як це працювало? Я читаю документи і пробую речі, але нікуди не дістаюсь
Пол Шелдрейк

Залежно від місця виклику ctools_content_render (), вам може знадобитися також ввести код ctools у область застосування, інакше ви отримаєте фатальні помилки. Цього можна досягти за допомогою "module_load_include (" inc "," ctools "," include / content ");"
alexkb

Не забудьте включити ctools_include('content');раніше ctools_content_render(), адже в іншому випадку ви отримаєте фатальну помилку.
Андрій Руденко

3

Є чудовий і простий приклад того, як це зробити в ctools_ajax_sampleмодулі (в наборі CTools).

Як було зазначено, головним є використання функції ctools_content_render().

На прикладі показано, як заповнити аргументи функції, хоча, очевидно, ви повинні налаштувати її відповідно до своїх потреб.

Цей потік у групах Drupal дає більше розуміння того, як завантажити правильний контекст.

Файл 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;
}

2

Якщо ви завантажуєте потрібний файл, все, що вам потрібно зробити, це викликати функцію візуалізації ( 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;
}

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);

Включивши файл плагіна, module_load_include()ви можете порушити процес завантаження плагінів ctools. CTools використовує require_onceметод, тому, якщо файл був включений раніше сценарієм Thirdparty, його неможливо буде включити ctools (і $pluginмасив розбору ). Таким чином, у результаті перезавантаження ваша панель не працюватиме в інших місцях.
Андрій Руденко
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.