Wie kann man Panels richtig thematisieren?

8

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.

Andre Baumeier
quelle

Antworten:

11

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 Caching geht, wird Drupal das Template-Caching für Sie wie einen normalen Seiten-Cache behandeln. 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;
}
?>
niksmac
quelle
Keiner dieser Haken funktionierte für meine Panel-Seite
AlxVallejo
Stellen Sie sicher, dass Panel aktiviert ist und Sie den richtigen Themenordner bearbeiten. Ich weiß heute nicht was noch.
Niksmac
Können Sie mit dem Entwicklungsmodul kpr $ vars in der Funktion preprocess_panels_pane kpr? Ich kann keine Ausgabe bekommen.
AlxVallejo
-2

Der beste und einfachste Weg, benutzerdefinierte Inhalte zu Bedienfeldern hinzuzufügen und nach Ihren Wünschen zu gestalten, besteht darin, benutzerdefinierte Inhaltsfenster zu erstellen, Ihren Code im Filtermodus als PHP-Filter hinzuzufügen und Ihre benutzerdefinierten PHP / HTML-Inhalte in benutzerdefinierte Div-Tags zu kapseln.

Um diesen benutzerdefinierten Inhaltsbereich zu thematisieren, müssen Sie lediglich Ihre benutzerdefinierten CSS-Regeln für dieses div-Tag in Ihre local.css einfügen

Wenn Sie spezielle Anforderungen haben, geben Sie diese bitte hier an.

user1153986
quelle
3
Ich bin kein wirklicher Fan von Code in der Datenbank und noch schlimmer: PHP-Code in Feldern, zu denen er nicht gehört. Diese Lösung ist weder wirklich zukunftssicher noch ordnungsgemäß zwischenspeicherbar und überarbeitbar (möglicherweise beim Exportieren des Panels, aber es wäre ein schreckliches Durcheinander, alle Dinge anzupassen).
Andre Baumeier