¿Cómo tema los paneles correctamente?

8

Estoy usando Page Manager y Panels , proporcionando paneles de nodo personalizados con reglas de selección por tipo (por ejemplo, una variante de panel para artículo, una variante de panel para tipo de contenido de blog). Esto funciona sin problemas hasta ahora, el estilo también es ordenado. Pero, ¿cómo puedo obtener más poder sobre la representación de elementos?

Hay varias formas de representar elementos específicos: agregar campos, usar token, usar una vista personalizada solo representar campos específicos, usar entidad de nodo renderizada con modo de vista. utilizando contenido de panel personalizado con marcadores de posición, etc.

¿Cuál es el mejor enfoque aquí? Sería genial tener la capacidad de agregar un elemento de panel personalizado (algo) que se pueda diseñar en un * .tpl.php.

Mi enfoque actual sería usar el conjunto de pantallas, crear modos de vista para diferentes partes / regiones de panel y usar sugerencias de enlace de tema para agregar node.tpl.php personalizado para cada modo de vista. ¡No necesitaría invocar vistas, lo cual es una exageración! renderizado, consultas adicionales ...) y puede usar entidades ya almacenadas en caché.

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

No estoy seguro de qué tan bien se almacenará en caché y cuántos recursos consumirá. Cualquier consejo sería agradecido.

Andre Baumeier
fuente

Respuestas:

11

Como dice el documento oficial, puedes hacer algo como

paneles-pane_node-title.tpl.php

paneles-pane_panel_node_title.tpl.php

paneles-pane-node-title.tpl.php

paneles-pane-node_title.tpl.php

Después de algunas búsquedas, descubrí que los paneles no detectan las sugerencias y termino en esta función de preproceso.

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

Después de una larga búsqueda en foros, encontré esto también,

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

Tema y caché.

Cuando se trata de almacenamiento en caché, creo que Drupal se encargará del almacenamiento en caché de plantillas como caché de página normal. Si no crees que funciona, puedes hacer algo como

<?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
fuente
Ninguno de estos ganchos funcionó para mi página de panel
AlxVallejo
Asegúrese de que el Panel esté habilitado y que esté editando la carpeta de temas correcta. No sé qué más hacer hoy.
niksmac
Con el módulo de desarrollo, ¿puede kpr $ vars en la función preprocess_panels_pane? No puedo obtener ninguna salida.
AlxVallejo
-2

La manera mejor y más fácil de agregar contenido personalizado a los paneles y crear temas a su manera es crear paneles de contenido personalizados, agregar su código utilizando el modo de filtro como filtro php y encapsular su contenido php / html personalizado en etiquetas div personalizadas.

Ahora, para crear un tema en este panel de contenido personalizado, todo lo que tiene que hacer es agregar sus reglas css personalizadas para esta etiqueta div en su local.css

Si tiene algún requisito específico, indíquelo aquí.

usuario1153986
fuente
3
No soy un verdadero fanático del código en la base de datos y, lo que es peor: código PHP en campos donde no pertenece. Esa solución no está realmente preparada para el futuro ni se puede almacenar en caché y revisar adecuadamente (podría serlo al exportar el panel, pero sería un desastre terrible ajustar todas las cosas).
Andre Baumeier