Come tema pannelli correttamente?


8

Sto usando Page Manager e Panels , fornendo pannelli di nodi personalizzati con regole di selezione per tipo (ad esempio una variante di pannello per l'articolo, una variante di pannello per il tipo di contenuto del blog). Finora funziona perfettamente, anche lo stile è pulito. Ma come posso ottenere più potere sul rendering degli elementi?

Esistono diversi modi per eseguire il rendering di elementi specifici: aggiunta di campi, utilizzo di token, utilizzo di una vista personalizzata solo rendering di campi specifici, utilizzo dell'entità nodo renderizzata con modalità di visualizzazione. utilizzando il contenuto del pannello personalizzato con segnaposto, ecc.

Qual è l'approccio migliore qui? Sarebbe bello poter aggiungere un elemento del riquadro personalizzato (qualcosa) che può essere disegnato in un * .tpl.php.

Il mio approccio attuale sarebbe utilizzare la suite di visualizzazione, la creazione di modalità di visualizzazione per diverse parti / aree del pannello e l'utilizzo di suggerimenti di hook del tema per l'aggiunta di node.tpl.php personalizzato per ciascuna modalità di visualizzazione. Non avrebbe bisogno di invocare le opinioni, il che è praticamente eccessivo ?! rendering, query aggiuntive ...) e può utilizzare entità già memorizzate nella 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';
  }
}

Non sono sicuro di quanto bene verrà memorizzato nella cache e di quante risorse consumerà. Qualsiasi consiglio sarebbe grato.

Risposte:


11

Come dice il documento ufficiale, puoi fare qualcosa del genere

Pannelli-pane_node-title.tpl.php

pannelli a pane_panel_node_title.tpl.php

Pannelli-pane-node-title.tpl.php

Pannelli-pane-node_title.tpl.php

Dopo alcune ricerche ho scoperto che i suggerimenti non vengono rilevati dai pannelli e finisco con questa funzione di preelaborazione.

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

Dopo una lunga ricerca nei forum ho trovato anche questo,

<?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 si tratta di memorizzazione nella cache, credo che Drupal gestirà la cache dei modelli per te come normale cache di pagina. Se non pensi che funzioni, puoi fare qualcosa del genere

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

Nessuno di questi ganci ha funzionato per la mia pagina del pannello
AlxVallejo,

Assicurati che Panel sia abilitato e stai modificando la cartella dei temi corretta. Non so cos'altro oggi.
niksmac,

Con il modulo di sviluppo, puoi kpr $ vars nella funzione preprocess_panels_pane? Non riesco a ottenere alcun output.
AlxVallejo,

-2

Il modo migliore e più semplice per aggiungere contenuti personalizzati ai pannelli e temi a modo tuo è, creare riquadri di contenuto personalizzati, aggiungere il codice utilizzando la modalità filtro come filtro php e incapsulare il contenuto php / html personalizzato in tag div personalizzati.

Ora, per tema questo riquadro di contenuti personalizzati, tutto ciò che devi fare è aggiungere le tue regole css personalizzate per questo tag div nel tuo local.css

Se hai dei requisiti specifici, ti preghiamo di indicarli qui.


3
Non sono un vero fan del codice nel database e peggio ancora: codice php nei campi a cui non appartiene. Quella soluzione non è realmente a prova di futuro, né è opportunamente sostituibile e modificabile (potrebbe essere durante l'esportazione del pannello, ma sarebbe un disastro terribile regolare tutte le cose).
Andre Baumeier,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.