[Migliorato] Usare il $node da node.tpl.php in page.tpl.php - con eleganza

7 contenuti / 0 new
Ultimo contenuto
[Migliorato] Usare il $node da node.tpl.php in page.tpl.php - con eleganza

[Migliorato] Vedi il commento di Mavimo per una soluzione 'elegante' ed funzionale.

Ho visto di recente la domanda (riguardava i titoli) ma che in realtà necessitava di sapere il nodo usato da node.tpl.php ma in page.tpl.php. Guarda caso, adesso ho anch'io questo necessità, per certi nodi devo usare il template page completo, ma per altri devo usare uno molto ridotto (niente header, logo, blocchi, ecc).

Quindi dovevo sapere il nodo (anzi il tipo di nodo) anche nella pagina. Ci saranno metodi molto elegante per fare questo, ma non l'ho trovato. Ma dato che sono molto bravo a creare dei pasticci, ho usato un semplice hack, con dei global. Non elegante, ma funziona - oh, se qualcuno ha una soluzione elegante, ben venga.

La soluzione sta nel fatto che big D elabora il contenuto del nodo prima della pagina (http://www.drupalitalia.org/node/9714). Quindi in node.tpl.php aggiungo:

<?php
 
global $page_node;
  if (!isset(
$page_node)) {
   
$page_node = $node;
  }
?>

Se hai più di un template node, bisogna aggiungerlo in tutti.

Per vedere questo nodo nella pagina, basta aggiungere in page.tpl.php:

<?php
 
global $page_node;
?>

Per poi testare gli varie valori tipo $page_node->type dove ti piace e pare - una volta testato che $page_node ha un valore, s'intende. Un ovvio esempio e di cambiare il 'look' della pagina secondo il nodo visualizzato - il che era il mio problema.

Come esempio (pagina normale, pagina ridotto) la nuova page.tpl.php è:

<?php
 
global $page_node;
  if (isset(
$page_node) && $page_node->type == 'ridotto') {
    include_once(
'page-ridotto.tpl.php');
  }
  else {
    include_once(
'page-normale.tpl.php');
  }
?>

(dove page-normale.tpl.php e l'originale page.tpl.php, e page-ridotto.tpl.php è la versione lobotomizzato)

Le viste (views) può creare problemi, questo hack prenderà la prima della lista, e basta. Per il momento non vedo altri contro-indicazioni...

Idee migliori?

John

io per fare questa cosa (dipende dalle esigenze, ovvimente), preferisco nel preprocess page aggiungere la chiamata ad un template di un certo tipo processando il nodetype del nodo che devo visualizzare, a questo punto poi il template del nodo viene rielaborato nella pagina che ha un tpl differente e quindi può essere senza header, footer & c.

In pratica:

<?php
/**
 * Implementation of template_preprocess_page().
 *
 * @param &$variables
 *   Array containing various page elements.
 */
function NOMETEMA_preprocess_page(&$variables) {
 
/*
   * Se questa funzione non funziona correttamente controllare che sia stata
   * svuotata la cache almeno una volta dalla sua attivazione, quindi se non se
   * ne è sicuri accedere alla pagina ?q=admin/settings/performance e cliccare su
   *
   *   Clear cached data
   */
 
if ($node = menu_get_object()) {
   
$variables['node'] = $node; // Aggiungo la variabile $node nella pagina
    // Genero il nome del file da cercare per il template
   
$template_filename = 'page-' . $variables['node']->type;
   
// Aggiungo all'elenco il possibile file da cercare (se non lo trova ava a ritroso)
   
$variables['template_files'][] = $template_filename;
  }
}
?>

A questo punto creando il file page-NODETYPE.tpl.php (controllate che il node-type non abbia un nome che può conflittuare con il resto, mi raccomando!) mi trovo dentro l'oggetto $node. Non è nemmeno questa pulitissima, ma almeno ci evitiamo le global ;)

Ciao
Marco
--
My blog
Working at @agavee

si faccio anche io come Mavimo, al massimo si può usare "phptemplate_ preprocess()" che vale per tutti i tpl? ... o sbaglio?

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits

Grazie ragazzi, venduto in pieno. Quel 'menu_get_object' mi ha confuso per un momento. Guardando il codice, non ricarica il nodo, quindi va benissimo. Qui 'menu' non significa quelle cose con i link, ma il router di Drupal - sigh. E avevo anche scritto: http://www.drupalitalia.org/node/9352

@mavimo per curiosità quanto tempo hai impiegato a capire/trovare quel 'menu_get_object'? Senza di voi, io avrò impiegato un'eternità...

[Edit] Appena provato - works like a charm - a buon rendere [/edit]

Più imparo, più dubito.

@jhl.verona: non lo so, forse al'inizio un pò, ma poi lo riciclo in n-mila situazioni, quindi il tempo medio è molto basso :D

Ciao
Marco
--
My blog
Working at @agavee

Ho fatto un piccolo modifica per non cambiare il tipo di pagina quando stiamo editando il nono:

<?php
 
if ($node = menu_get_object()) {
   
$vars['node'] = $node;
    if (
arg(2) != 'edit') {
     
$template_filename = 'page-'. $node->type;
     
$vars['template_files'][] = $template_filename;
    }
  }
?>

Più imparo, più dubito.

nel realizzare un modulo mi sto chiedendo se è possibile aggiungere "variabili" al $node in hook_nodeapi() ??oppure tramite hook_nodeapi(); è possibile solo maneggiare il $node che stiamo visualizzando,modificando, inviando ... ecc, ma per aggiungere una variabile come per esempio $node->newvar bisogna sempre in ogni caso hook_preprocess_node() ???

Al momento ci ho provato, ma hook_preprocess_node() sembra l'unica soluzione....

Slice2Theme Servizio per la conversione di Design in markup HTML e/o temi.

WeBrain Solution | Pillsofbits Of Bits