Jak programowo renderować typ zawartości ctools?

12

Mam wtyczkę Ctools aka. typ zawartości aka. panel panelu. Jak renderować to programowo?

roGi
źródło
+1, bardzo interesujące pytanie. Zastanawiam się jednak, czy wtyczka ctools może być renderowana poza stroną menedżera stron? Ponieważ byłoby to pozbawione kontekstu, czy renderowanie każdego typu treści nadal ma sens?
Letharion
Korzystanie z kontekstów nie jest obowiązkowe. Ręczne wymuszanie kontekstu jest zawsze możliwe. Jak tutaj - gist.github.com/3076130
roGi

Odpowiedzi:

4

ctools_content_render() jest rozwiązaniem.

roGi
źródło
2
Czy możesz podać przykład, jak to by działało? Czytam dokumenty i próbuję rzeczy, ale nigdzie się nie dostaję
Paul Sheldrake
W zależności od tego, gdzie wywołujesz ctools_content_render (), może być również konieczne wprowadzenie kodu ctools w zakres, w przeciwnym razie wystąpią krytyczne błędy. Można to osiągnąć za pomocą „module_load_include („ inc ”,„ ctools ”,„ include / content ”);”
alexkb
Nie zapomnij podać ctools_include('content');wcześniej ctools_content_render(), ponieważ w innym przypadku wystąpi błąd krytyczny.
Andrey Rudenko
3

Jest świetny i prosty przykład, jak to zrobić w ctools_ajax_samplemodule (w pakiecie CTools).

Jak już wspomniano, kluczem jest użycie funkcji ctools_content_render().

Przykład pokazuje, jak wypełnić argumenty funkcji, chociaż oczywiście musisz ją dostosować do swoich potrzeb.

Wątek w Grupach Drupal daje więcej informacji na temat ładowania właściwego kontekstu.

Plik 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
źródło
2

Jeśli załadujesz wymagany plik, wszystko, co naprawdę musisz zrobić, to wywołać funkcję renderowania ( hook_content_type_render), która zwróci obiekt klasy standardowej, podobnie jak hook_block_viewrobi to.
Wszystko, czego potrzebujesz, to funkcja motywu, chyba że chcesz tylko renderować nieprzetworzone dane wyjściowe bezpośrednio.

W kodzie może wyglądać mniej więcej tak:

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
źródło
1
dzięki za odpowiedź. Bezpośrednie wywołanie funkcji renderowania jest oczywiście oczywistym wyborem. Ale to rozwiązanie przypomina bardziej hack. Szukam czegoś w stylu „ctools_render_ctype ('ctype_name')” :)
roGi
@roGi Ta funkcja nie istnieje, to, co pokazałem powyżej, jest istotą jej wyglądu, ale prawdopodobnie nie będzie możliwe stworzenie czegoś tak prostego, jak sugerujesz, ponieważ typy zawartości ctools nie są takie prosty.
googletorp
0

Udało mi się wyciągnąć panelowaną stronę w panopolu przy użyciu następującego kodu:

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
źródło
module_load_include()Dołączając plik wtyczki, możesz przerwać proces ładowania wtyczek ctools. CTools używa require_oncemetody, więc jeśli plik został wcześniej dołączony przez skrypt innej firmy , nie będzie można go dołączyć za pomocą narzędzi ctools (i parsować $plugintablicę). W związku z tym okienko nie będzie działać w innych miejscach.
Andrey Rudenko,