Bir ctools içerik türü programlı olarak nasıl oluşturulur?


12

Bir ctools eklentim aka. içerik türü aka. panel bölmesi. Programlı olarak nasıl render edilir?


+1, çok ilginç bir soru. Yine de merak ediyorum, bir ctools eklentisi sayfa yöneticisi sayfasının dışında işlenebilir mi? Bu bir bağlamı geçersiz kılacağından, e içerik türünü oluşturmak hala anlamlı mı?
Letharion

Bağlam kullanmak zorunlu değildir. Ayrıca, bir içeriği manuel olarak zorlamak her zaman bir seçenektir. Burada olduğu gibi - gist.github.com/3076130
roGi

Yanıtlar:


4

ctools_content_render() çözümdür.


2
Bunun nasıl çalışacağına dair bir örnek verebilir misiniz? Belgeleri okuyorum ve bir şeyler deniyorum ama hiçbir yere gitmiyorum
Paul Sheldrake

Ctools_content_render () öğesini nereye çağırdığınıza bağlı olarak, ctools kodunu da kapsamına almanız gerekebilir, aksi takdirde önemli hatalar alırsınız. Bu, "module_load_include (" inc "," ctools "," include / content ");" ile elde edilebilir.
alexkb

Daha ctools_include('content');önce dahil etmeyi unutmayın ctools_content_render(), çünkü diğer durumda ölümcül hata alırsınız.
Andrey Rudenko

3

Bunu ctools_ajax_samplemodülde (CTools paketinde) nasıl yapacağınıza dair harika ve basit bir örnek var .

Belirtildiği gibi, anahtar işlevi kullanmaktır ctools_content_render().

Örnek, işlevin bağımsız değişkenlerini nasıl dolduracağınızı gösterir, ancak açıkça ihtiyaçlarınıza göre özelleştirmeniz gerekir.

Drupal Gruplarındaki bu iş parçacığı , doğru içeriğin nasıl yükleneceği hakkında daha fazla bilgi verir.

Dosya 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

Gerekli dosyayı yüklerseniz, yapmanız gereken tek şey, hook_content_type_rendertıpkı bir standart sınıf nesnesini döndürecek olan render işlevini ( ) çağırmaktır hook_block_view.
Sadece ham çıktıyı doğrudan oluşturmak istemiyorsanız, tek ihtiyacınız olan bir tema işlevi.

Kodda şöyle görünebilir:

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
cevabın için teşekkürler. Render işlevini doğrudan çağırmak elbette bariz seçimdir. Ancak bu çözüm daha çok bir saldırı gibi geliyor. "Ctools_render_ctype ('ctype_name')" :)
roGi

@roGi Bu işlev mevcut değil, yukarıda gösterdiğim şey, nasıl görüneceğinin özüdür, ancak ctools içerik türleri bu olmadığı için muhtemelen önerdiğiniz kadar basit bir şey yapmak mümkün olmayacaktır. basit.
googletorp

0

Aşağıdaki kodu kullanarak panopoly panelli bir sayfa çekmeyi başardı:

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

Eklenti dosyası module_load_include()ekleyerek ctools eklentileri yükleme işlemini bozabilirsiniz. CTools require_onceyöntemi kullanır , bu nedenle dosya daha önce üçüncü taraf komut dosyası tarafından eklenmişse, ctools (ve ayrıştırma $plugindizisi) tarafından dahil edilmesi mümkün olmayacaktır . Sonuç olarak bölmeniz başka yerlerde çalışmaz.
Andrey Rudenko
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.