Come eseguire il rendering di un tipo di contenuto ctools a livello di codice?


12

Ho un plugin ctools aka. tipo di contenuto aka. riquadro del pannello. Come lo si rende programmaticamente?


+1, domanda molto interessante. Mi chiedo però, un plug-in di ctools può essere reso al di fuori di una pagina del gestore della pagina? Dal momento che sarebbe privo di contesto, il rendering e il tipo di contenuto ha ancora senso?
Letharion,

L'uso dei contesti non è obbligatorio. Inoltre, forzare manualmente un contesto è sempre un'opzione. Come qui - gist.github.com/3076130
roGi

Risposte:


4

ctools_content_render() è la soluzione.


2
Puoi fornire un esempio di come funzionerebbe? Sto leggendo i documenti e provando cose ma non arrivo da nessuna parte
Paul Sheldrake il

A seconda di dove chiami ctools_content_render (), potresti anche dover portare il codice ctools nell'ambito, altrimenti otterrai errori fatali. Ciò può essere ottenuto con "module_load_include (" inc "," ctools "," Includes / content ");"
alexkb,

Non dimenticare di includere ctools_include('content');prima ctools_content_render(), perché in altri casi otterrai un errore fatale.
Andrey Rudenko,

3

C'è un grande e semplice esempio su come farlo nel ctools_ajax_samplemodulo (nella suite CTools).

Come è stato sottolineato, il tasto è usare la funzione ctools_content_render().

L'esempio mostra come popolare gli argomenti della funzione, anche se ovviamente è necessario personalizzarla in base alle proprie esigenze.

Questo thread nei gruppi Drupal offre maggiori informazioni su come caricare il giusto contesto.

File 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

Se carichi il file richiesto, tutto ciò che devi fare è chiamare la funzione render ( hook_content_type_render) che restituirà un oggetto di classe standard, proprio come hook_block_viewfa.
Tutto ciò di cui hai bisogno è una funzione tema, a meno che tu non voglia semplicemente renderizzare direttamente l'output grezzo.

Nel codice potrebbe assomigliare a questo:

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
grazie per la tua risposta. Chiamare direttamente la funzione di rendering è, ovviamente, la scelta ovvia. Ma questa soluzione sembra più un trucco. Sto cercando qualcosa sulla falsariga di "ctools_render_ctype ('ctype_name')" :)
roGi

@roGi Quella funzione non esiste, quello che ho mostrato sopra è l'essenza di come sarebbe, ma probabilmente non sarà fattibile fare qualcosa di semplice come suggerisci, poiché i tipi di contenuto di ctools non sono quello semplice.
googletorp

0

Sono stato in grado di estrarre una pagina con pannelli in panopolio usando il seguente codice:

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

Includendo il file del plugin con module_load_include()te, potresti interrompere il processo di caricamento dei plugin di ctools. CTools usa il require_oncemetodo, quindi se il file è stato incluso in precedenza dallo script di terze parti, non sarà possibile includerlo in ctools (e $pluginnell'array di analisi ). Quindi, come una nuova ricerca, il riquadro non funzionerà in altri luoghi.
Andrey Rudenko,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.