Wie kann ich einen ctools-Inhaltstyp programmgesteuert rendern?

12

Ich habe ein ctools Plugin aka. Inhaltstyp aka. Panel-Bereich. Wie rendert man es programmatisch?

roGi
quelle
+1, sehr interessante Frage. Ich frage mich jedoch, ob ein ctools-Plugin außerhalb einer Seite des Seitenmanagers gerendert werden kann. Ist das Rendern eines Inhaltstyps immer noch sinnvoll, da dies kontextfrei wäre?
Letharion
Die Verwendung von Kontexten ist nicht obligatorisch. Es ist auch immer eine Option, einen Kontext manuell zu erzwingen. Wie hier - gist.github.com/3076130
roGi

Antworten:

4

ctools_content_render() ist die Lösung.

roGi
quelle
2
Können Sie ein Beispiel dafür geben, wie dies funktionieren würde? Ich lese die Dokumente und probiere Dinge aus, komme aber nicht weiter
Paul Sheldrake,
Abhängig davon, wo Sie ctools_content_render () aufrufen, müssen Sie möglicherweise auch den ctools-Code in den Gültigkeitsbereich bringen, da sonst schwerwiegende Fehler auftreten. Dies kann mit "module_load_include (" inc "," ctools "," includes / content ") erreicht werden."
Alexkb
Vergessen Sie nicht, ctools_include('content');vorher einzuschließen ctools_content_render(), da sonst ein schwerwiegender Fehler auftritt.
Andrey Rudenko
3

Es gibt ein großartiges und einfaches Beispiel dafür im ctools_ajax_sampleModul (in der CTools-Suite).

Wie bereits erwähnt, müssen Sie die Funktion verwenden ctools_content_render().

Das Beispiel zeigt, wie Sie die Argumente der Funktion füllen, obwohl Sie sie natürlich an Ihre Bedürfnisse anpassen müssen.

Dieser Thread in Drupal-Gruppen bietet weitere Informationen zum Laden des richtigen Kontexts.

Datei 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
quelle
2

Wenn Sie die erforderliche Datei laden, müssen Sie nur die Renderfunktion ( hook_content_type_render) aufrufen, die ein Standardklassenobjekt zurückgibt, ähnlich wie dies der hook_block_viewFall ist.
Alles, was Sie von dort benötigen, ist eine Theme-Funktion, es sei denn, Sie möchten die Raw-Ausgabe direkt rendern.

Im Code könnte es ungefähr so ​​aussehen:

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
quelle
1
Danke für deine Antwort. Natürlich ist es naheliegend, die Render-Funktion direkt aufzurufen. Aber diese Lösung fühlt sich eher wie ein Hack an. Ich suche nach etwas in der Art von "ctools_render_ctype ('ctype_name')" :)
roGi
@roGi Diese Funktion gibt es nicht. Ich habe oben gezeigt, wie sie aussehen würde, aber es ist wahrscheinlich nicht machbar, etwas so einfaches wie Sie es vorschlagen zu machen, da ctools-Inhaltstypen das nicht sind einfach.
googletorp
0

Mit dem folgenden Code konnte ich eine Panel-Seite in Panopoly abrufen:

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);
Paprikaschoten
quelle
Indem Sie die Plugin-Datei mit module_load_include()einbeziehen, können Sie den Ladevorgang der ctools-Plugins unterbrechen. CTools verwendet die require_onceMethode. Wenn die Datei zuvor von einem Drittanbieter-Skript eingeschlossen wurde, kann sie nicht von ctools (und dem Analysearray $plugin) eingeschlossen werden. Als Ergebnis wird Ihr Fenster an anderen Stellen nicht funktionieren.
Andrey Rudenko