Comment thématiser correctement les panneaux?

8

J'utilise Page Manager et Panels , fournissant des panneaux de nœuds personnalisés avec des règles de sélection par type (par exemple, une variante de panneau pour l'article, une variante de panneau pour le type de contenu de blog). Cela fonctionne bien jusqu'à présent, le style est également soigné. Mais, comment puis-je obtenir plus de pouvoir sur le rendu des éléments?

Il existe plusieurs façons de rendre des éléments spécifiques: en ajoutant des champs, en utilisant un jeton, en utilisant une vue personnalisée uniquement en rendant des champs spécifiques, en utilisant une entité de noeud rendue avec le mode d'affichage. en utilisant un contenu de panneau personnalisé avec des espaces réservés, etc.

Quelle est la meilleure approche ici? Ce serait formidable d'avoir la possibilité d'ajouter un élément de volet personnalisé (quelque chose) qui peut être stylisé dans un * .tpl.php.

Mon approche actuelle consisterait à utiliser la suite d'affichage, à créer des modes d'affichage pour différentes parties / régions de panneau et à utiliser des suggestions de crochets de thème pour ajouter un node.tpl.php personnalisé pour chaque mode d'affichage. Il n'aurait pas besoin d'invoquer des vues, ce qui est à peu près exagéré?! rendu, requêtes supplémentaires ...) et peut utiliser des entités déjà mises en cache.

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';
  }
}

Je ne sais pas dans quelle mesure cela sera mis en cache et combien de ressources cela consommera. Tout conseil serait reconnaissant.

Andre Baumeier
la source

Réponses:

11

Comme le dit le doc officiel, vous pouvez faire quelque chose comme

panels-pane_node-title.tpl.php

panels-pane_panel_node_title.tpl.php

panels-pane-node-title.tpl.php

panels-pane-node_title.tpl.php

Après quelques recherches, j'ai constaté que les suggestions ne sont pas détectées par les panneaux, et je me retrouve dans cette fonction de prétraitement.

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

Après une longue recherche dans les forums, j'ai trouvé cela aussi,

<?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';
        }
    }
?>

Thème et cache.

En ce qui concerne la mise en cache, je pense que Drupal gérera la mise en cache des modèles pour vous en tant que cache de page normal. Si vous ne pensez pas que cela fonctionne, vous pouvez faire quelque chose comme

<?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
la source
Aucun de ces crochets n'a fonctionné pour ma page de panneau
AlxVallejo
Assurez-vous que le panneau est activé et que vous modifiez le dossier de thème correct. Je ne sais pas quoi d'autre aujourd'hui.
niksmac
Avec le module devel, pouvez-vous kpr $ vars dans la fonction preprocess_panels_pane? Je ne peux obtenir aucune sortie.
AlxVallejo
-2

Le moyen le plus simple et le plus simple d'ajouter du contenu personnalisé aux panneaux et de le thème à votre façon est de créer des volets de contenu personnalisé, d'ajouter votre code en utilisant le mode de filtre comme filtre php et d'encapsuler votre contenu php / html personnalisé dans des balises div personnalisées.

Maintenant, pour thème ce volet de contenu personnalisé, tout ce que vous avez à faire est d'ajouter vos règles css personnalisées pour cette balise div dans votre local.css

Si vous avez des exigences spécifiques, veuillez les indiquer ici.

user1153986
la source
3
Je ne suis pas un vrai fan de code en base de données et pire encore: du code php dans des domaines où il n'appartient pas. Cette solution n'est pas vraiment à l'épreuve du temps ni correctement cachable et révisable (ce pourrait être lors de l'exportation du panneau, mais ce serait un gâchis terrible d'ajuster toutes les choses).
Andre Baumeier