ctoolsコンテンツタイプをプログラムでレンダリングする方法は?


12

別名ctoolsプラグインがあります。コンテンツタイプ別名。パネルペイン。プログラムでどのようにレンダリングしますか?


+1、非常に興味深い質問。しかし、ctoolsプラグインをページマネージャーページの外部でレンダリングできますか?それはコンテキストを無効にするので、eコンテンツタイプのレンダリングは依然として意味がありますか?
レサリオン

コンテキストの使用は必須ではありません。また、コンテキストを手動で強制することは常にオプションです。ここのような- gist.github.com/3076130
roGi

回答:


4

ctools_content_render() 解決策です。


2
これがどのように機能するかの例を提供できますか?私は、ドキュメントを読んで、物事をしようとしているが、どこにも届かない
ポール・シェルドレイク

ctools_content_render()を呼び出す場所によっては、ctoolsコードをスコープに入れる必要があります。そうしないと、致命的なエラーが発生します。これは、「module_load_include( "inc"、 "ctools"、 "includes / content");」で実現できます。
alexkb 14年

ctools_include('content');before を含めることを忘れないでください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

必要なファイルをロードする場合、本当に必要なのは、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
お返事をありがとうございます。もちろん、render funcを直接呼び出すことは当然の選択です。しかし、このソリューションはハッキングのように感じます。「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メソッドを使用するため、以前にサードパーティのスクリプトによってファイルが含まれていた場合、ctools(および解析$plugin配列)によってファイルを含めることはできません。したがって、結果として、ペインは他の場所では機能しません。
アンドレイルデンコ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.