it-swarm.com.de

Wie kann man Panels richtig thematisieren?

Ich verwende Page Manager und Panels und versorge benutzerdefinierte Knoten-Panels mit Auswahlregeln nach Typ (z. B. eine Panel-Variante für Artikel-, eine Panel-Variante für Blog-Inhaltstyp). Dies funktioniert bisher reibungslos, das Styling ist auch ordentlich. Aber wie kann ich mehr Macht über das Rendern von Elementen bekommen?

Es gibt mehrere Möglichkeiten, bestimmte Elemente zu rendern: Hinzufügen von Feldern mithilfe eines Tokens, Verwenden einer benutzerdefinierten Ansicht, nur Rendern bestimmter Felder, Verwenden einer gerenderten Knotenentität mit Ansichtsmodus. Verwenden von benutzerdefinierten Bedienfeldinhalten mit Platzhaltern usw.

Was ist hier der beste Ansatz? Es wäre großartig, die Möglichkeit zu haben, ein benutzerdefiniertes (etwas) Fensterelement hinzuzufügen, das in einer * .tpl.php gestaltet werden kann.

Mein aktueller Ansatz wäre die Verwendung der Anzeigesuite, das Erstellen von Ansichtsmodi für verschiedene Teile/Bedienfeldbereiche und das Verwenden von Themen-Hook-Vorschlägen zum Hinzufügen einer benutzerdefinierten node.tpl.php für jeden Ansichtsmodus. Es müsste keine Ansichten aufrufen, was so ziemlich ein Overkill ist?! Rendern, zusätzliche Abfragen ...) und können bereits zwischengespeicherte Entitäten verwenden.

function mytheme_preprocess_node(&$vars) {
  if ($vars['node']->type == 'my_content_type' && $vars['view_mode'] == 'panel_region_left') {
    $vars['theme_hook_suggestions'][] = 'node__my_content_type__panel_region_left';
  }

  if ($vars['node']->type == 'my_content_type' && $vars['view_mode'] == 'panel_region_right') {
    $vars['theme_hook_suggestions'][] = 'node__my_content_type__panel_region_right';
  }
}

Ich bin nicht sicher, wie gut dies zwischengespeichert wird und wie viel Ressourcen es verbrauchen wird. Jeder Rat wäre dankbar.

8
Andre Baumeier

Wie der offizielle Arzt sagt, können Sie so etwas tun

panel-pane_node-title.tpl.php

panel-pane_panel_node_title.tpl.php

panel-pane-node-title.tpl.php

panel-pane-node_title.tpl.php

Nach einiger Suche habe ich festgestellt, dass die Vorschläge nicht von Panels erkannt werden, und ich lande in dieser Vorverarbeitungsfunktion.

function MYTHEME_preprocess_panels_pane(&$vars) {
// get the subtype
$subtype = $vars['pane']->subtype;

// Add the subtype to the panel theme suggestions list
$vars['theme_hook_suggestions'][] = 'panels_pane__'.$subtype;

return $vars;
}

Nach langer Suche in Foren habe ich das auch gefunden,

<?php
function THEMENAME_preprocess_page(&$vars) {
    global $theme_path;
    if($panel_page = page_manager_get_current_page()){

        $target_menu = 'menu-sixth-form-college';
        $current_path = menu_get_item();

        $target_menu_links = menu_load_links($target_menu);
        foreach($target_menu_links as $links) {
            $link_paths[] = $links['link_path'];
        }
        $preferred_link_paths = $link_paths;
        // if the current link is inside menu_load_link
        if(in_array($current_path['href'], $preferred_link_paths)) {
            $vars['theme_hook_suggestions'][] = 'page__sixthform';
        }
        if($panel_page['name'] == 'page-sixth_form_college') {
            $vars['theme_hook_suggestions'][] = 'page__sixthform';
        }
    }
?>

Thema und Cache.

Wenn es um das Zwischenspeichern geht, glaube ich, dass Drupal das Vorlagen-Caching für Sie als normalen Seiten-Cache behandelt. Wenn Sie nicht glauben, dass es funktioniert, können Sie so etwas tun

<?php
function my_module_function() {
  $my_data = &drupal_static(__FUNCTION__);
  if (!isset($my_data)) {
    if ($cache = cache_get('my_module_data')) {
      $my_data = $cache->data;
    }
    else {
      // Do your expensive calculations here, and populate $my_data
      // with the correct stuff..
      cache_set('my_module_data', $my_data, 'cache');
    }
  }
  return $my_data;
}
?>
11
niksmac