Bagaimana cara merender tipe konten ctools secara terprogram?

12

Saya memiliki plugin ctools alias. tipe konten alias. panel panel. Bagaimana cara membuatnya secara terprogram?

roGi
sumber
+1, pertanyaan yang sangat menarik. Namun saya bertanya-tanya, dapatkah plugin ctools dibuat di luar halaman pengelola halaman? Karena itu akan batal konteks, apakah rendering jenis konten e masih masuk akal?
Letharion
Menggunakan konteks tidak wajib. Juga, memaksa konteks secara manual selalu menjadi pilihan. Seperti di sini - gist.github.com/3076130
roGi

Jawaban:

4

ctools_content_render() adalah solusinya.

roGi
sumber
2
Bisakah Anda memberikan contoh bagaimana ini akan bekerja? Saya membaca dokumen dan mencoba hal-hal tetapi tidak mendapatkan di mana saja
Paul Sheldrake
Bergantung pada tempat Anda memanggil ctools_content_render (), Anda mungkin juga perlu membawa kode ctools ke dalam ruang lingkup, jika tidak, Anda akan mendapatkan kesalahan fatal. Ini dapat dicapai dengan "module_load_include (" inc "," ctools "," include / content ");"
alexkb
Jangan lupa untuk memasukkan ctools_include('content');sebelumnya ctools_content_render(), karena dalam kasus lain Anda akan mendapatkan kesalahan fatal.
Andrey Rudenko
3

Ada contoh yang bagus dan sederhana tentang cara melakukan ini di ctools_ajax_samplemodul (dalam suite CTools).

Seperti yang telah ditunjukkan, kuncinya adalah menggunakan fungsi ctools_content_render().

Contoh menunjukkan bagaimana mengisi argumen fungsi, meskipun Anda jelas harus menyesuaikannya sesuai dengan kebutuhan Anda.

Utas ini di Grup Drupal memberi lebih banyak wawasan tentang cara memuat konteks yang benar.

Mengajukan 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
sumber
2

Jika Anda memuat file yang diperlukan, yang benar-benar perlu Anda lakukan, adalah memanggil fungsi render ( hook_content_type_render) yang akan mengembalikan objek kelas standar, seperti hook_block_viewhalnya halnya.
Yang Anda butuhkan dari sana adalah fungsi tema, kecuali jika Anda hanya ingin me-render output mentah secara langsung.

Dalam kode itu bisa terlihat seperti ini:

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
sumber
1
terima kasih untuk balasan Anda. Memanggil fungsi render secara langsung, tentu saja, adalah pilihan yang jelas. Tetapi solusi ini terasa lebih seperti peretasan. Saya mencari sesuatu di sepanjang baris "ctools_render_ctype ('ctype_name')" :)
roGi
@roGi Fungsi itu tidak ada, apa yang saya tunjukkan di atas adalah inti dari tampilannya, tetapi mungkin tidak akan layak untuk membuat sesuatu yang sederhana seperti yang Anda sarankan, karena tipe konten ctools tidak begitu sederhana.
googletorp
0

Saya dapat menarik halaman panel dalam panopoly menggunakan kode berikut:

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);
chadpeppers
sumber
Dengan memasukkan file plugin dengan module_load_include()Anda dapat merusak proses pemuatan plugin ctools. CTools menggunakan require_oncemetode, jadi jika file dimasukkan sebelumnya oleh skrip pihak ketiga tidak akan mungkin untuk memasukkannya dengan ctools (dan parse $pluginarray). Jadi sebagai resullt panel Anda tidak akan bekerja di tempat lain.
Andrey Rudenko