Como painéis de tema corretamente?

8

Estou usando o Page Manager and Panels , fornecendo painéis de nós personalizados com regras de seleção por tipo (por exemplo, uma variante de painel para artigo - e uma variante de painel para tipo de conteúdo de blog). Até agora, isso funciona sem problemas, o estilo também é elegante. Mas como posso obter mais poder sobre a renderização de elementos?

Existem várias maneiras de renderizar elementos específicos: adicionar campos, usar token, usar uma exibição personalizada, renderizar apenas campos específicos, usar entidade de nó renderizada com modo de exibição. usando o conteúdo do painel personalizado com espaços reservados etc.

Qual é a melhor abordagem aqui? Seria ótimo ter a capacidade de adicionar um elemento de painel personalizado (algo) que pode ser estilizado em um * .tpl.php.

Minha abordagem atual seria usar o conjunto de exibição, criar modos de exibição para diferentes regiões de peças / painéis e usar sugestões de gancho de tema para adicionar node.tpl.php personalizado para cada modo de exibição. Não seria necessário invocar visualizações, o que é um exagero ?! processamento, consultas adicionais ...) e pode usar entidades já armazenadas em 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';
  }
}

Não tenho certeza de quão bem isso será armazenado em cache e quantos recursos consumirá. Qualquer conselho seria grato.

Andre Baumeier
fonte

Respostas:

11

Como o documento oficial diz, você pode fazer algo como

panels-pane_node-title.tpl.php

panels-pane_panel_node_title.tpl.php

painéis-painel-nó-título.tpl.php

panels-pane-node_title.tpl.php

Após alguma pesquisa, descobri que as sugestões não são detectadas pelos painéis e acabo nessa função de pré-processo.

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

Depois de uma longa pesquisa nos fóruns, encontrei isso também,

<?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 e cache.

Quando se trata de armazenamento em cache, acredito que o Drupal manipulará o armazenamento em cache de modelo para você como cache de página normal. Se você não acha que funciona, você pode fazer 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
fonte
Nenhum desses ganchos trabalhou para a minha página do painel
AlxVallejo
Verifique se o Painel está ativado e se você está editando a pasta de temas correta. Não sei mais o que fazer hoje.
Niksmac 29/05
Com o módulo devel, você pode kpr $ vars na função preprocess_panels_pane? Não consigo obter nenhuma saída.
AlxVallejo
-2

A melhor e mais fácil maneira de adicionar conteúdo personalizado aos painéis e colocar o tema à sua maneira, criar painéis de conteúdo personalizados, adicionar seu código usando o modo de filtro como filtro php e encapsular seu conteúdo php / html personalizado em tags div personalizadas.

Agora, para colocar um tema nesse painel de conteúdo personalizado, tudo o que você precisa fazer é adicionar suas regras CSS personalizadas para essa tag div em seu local.css

Se você tiver requisitos específicos, indique-os aqui.

user1153986
fonte
3
Eu não sou um verdadeiro fã de código no banco de dados e, pior ainda: código php em campos onde não pertence. Essa solução não é realmente à prova do futuro, nem pode ser alterada e revisada (pode ser durante a exportação do painel, mas seria uma bagunça terrível ajustar todas as coisas).
21813 Andre Baumeier #