Comment rendre un type de contenu ctools par programme?

12

J'ai un plugin ctools aka. type de contenu aka. volet du panneau. Comment le restitue-t-on par programme?

roGi
la source
+1, question très intéressante. Je me demande cependant, un plugin ctools peut-il être rendu en dehors d'une page de gestionnaire de page? Étant donné que cela serait dépourvu de contexte, le rendu du type de contenu e-t-il toujours logique?
Letharion
L'utilisation de contextes n'est pas obligatoire. De plus, forcer un contexte manuellement est toujours une option. Comme ici - gist.github.com/3076130
roGi

Réponses:

4

ctools_content_render() est la solution.

roGi
la source
2
Pouvez-vous donner un exemple de la façon dont cela fonctionnerait? Je lis les documents et j'essaye des choses mais je ne vais nulle part
Paul Sheldrake
Selon l'endroit où vous appelez ctools_content_render (), vous devrez peut-être également mettre le code ctools dans la portée, sinon vous obtiendrez des erreurs fatales. Ceci peut être réalisé avec "module_load_include (" inc "," ctools "," includes / content ");"
alexkb
N'oubliez pas d'inclure ctools_include('content');avant ctools_content_render(), car dans d'autres cas, vous obtiendrez une erreur fatale.
Andrey Rudenko
3

Il y a un excellent et simple exemple sur la façon de le faire dans le ctools_ajax_samplemodule (dans la suite CTools).

Comme cela a été souligné, la clé est d'utiliser la fonction ctools_content_render().

L'exemple montre comment remplir les arguments de la fonction, bien que vous deviez évidemment la personnaliser en fonction de vos besoins.

Ce fil dans les groupes Drupal donne plus d'informations sur la façon de charger le bon contexte.

Fichier 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
la source
2

Si vous chargez le fichier requis, tout ce que vous devez vraiment faire est d'appeler la fonction de rendu ( hook_content_type_render) qui retournera un objet de classe standard, tout comme le hook_block_viewfait.
Tout ce dont vous avez besoin à partir de là est une fonction de thème, à moins que vous ne vouliez simplement rendre la sortie brute directement.

Dans le code, cela pourrait ressembler à ceci:

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
la source
1
Merci pour votre réponse. L'appel direct de la fonction de rendu est, bien sûr, le choix évident. Mais cette solution ressemble plus à un hack. Je cherche quelque chose dans le sens de "ctools_render_ctype ('ctype_name')" :)
roGi
@roGi Cette fonction n'existe pas, ce que j'ai montré ci-dessus est l'essentiel de son apparence, mais il ne sera probablement pas possible de faire quelque chose d'aussi simple que vous le suggérez, car les types de contenu ctools ne le sont pas Facile.
googletorp
0

J'ai pu tirer une page panélisée dans le panopole en utilisant le code suivant:

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);
piments
la source
En incluant un fichier de plugin avec module_load_include()vous, vous risquez de casser le processus de chargement des plugins ctools. CTools utilise la require_onceméthode, donc si le fichier a été inclus précédemment par un script tiers, il ne sera pas possible de l'inclure par ctools (et parse $pluginarray). Donc, en tant que resullt, votre volet ne fonctionnera pas dans d'autres endroits.
Andrey Rudenko