如何以编程方式呈现ctools内容类型?


12

我也有一个ctools插件。内容类型又名。面板窗格。如何以编程方式呈现它?


+1,非常有趣的问题。我想知道,是否可以将ctools插件呈现在页面管理器页面之外?既然没有上下文,呈现e内容类型是否仍然有意义?
Letharion

使用上下文不是强制性的。此外,手动强制上下文始终是一种选择。就像这里-gist.github.com/3076130
roGi 2012年

Answers:


4

ctools_content_render() 是解决方案。


2
您能否提供一个示例说明如何工作?我正在阅读文档并尝试尝试,但是
一无所获

根据调用ctools_content_render()的位置,可能还需要将ctools代码纳入范围,否则会出现致命错误。这可以通过“ module_load_include(” inc“,” ctools“,” includes / content“);”“实现
alexkb 2014年

不要忘了ctools_include('content');在before之前包含它ctools_content_render(),因为在其他情况下,您将得到致命错误。
Andrey Rudenko

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

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

1
感谢您的回复。当然,直接调用渲染函数是显而易见的选择。但是这种解决方案更像是黑客。我正在寻找类似于“ ctools_render_ctype('ctype_name')” :)的东西
roGi 2012年

@roGi该函数不存在,上面显示的是其外观的要点,但要实现您所建议的那样简单的方法可能并不可行,因为ctools内容类型并非如此简单。
googletorp

0

我可以使用以下代码在panopoly中提取面板化页面:

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方法,因此,如果第三方脚本先前已包含文件,则ctools(和解析$plugin数组)将无法包含该文件。因此,您的窗格将无法在其他地方使用。
Andrey Rudenko
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.