Come nascondere il titolo della pagina in base al tipo di nodo usando template_preprocess_page ()


10

Sto cercando di nascondere il titolo della pagina corrente (come stampato da page.tpl.php) se la pagina corrente è 1) un nodo in piena visualizzazione (al contrario della modalità teaser), E 2) il tipo di nodo è o concert o bio . Stampo il titolo del nodo per questi tipi di contenuto direttamente nel contenuto del nodo, quindi voglio nascondere il duplicato stampato da page.tpl.php. Non riesco a farlo funzionare direttamente in page.tpl.php e la mia lettura suggerisce che la migliore pratica è quella di gestire la logica dei modelli in template.php usando le funzioni di preelaborazione e processo. Quindi, sto cercando di nascondere il titolo della pagina corrente (con le 2 condizioni sopra) utilizzando template_preprocess_page(). Questo è il mio codice

<?php
    function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            hide($variables['title']);
        }
    }
?>

Ho letto Come testare il tipo di nodo per stampare una variabile da template.php? e la pagina della documentazione per template_preprocess_page(), e vari altri siti, ma non riesco proprio a farlo funzionare. Ho visto i suggerimenti che si deve chiamare isset()il $variables['node']prima del test per il tipo di nodo, ma che non ha funzionato neanche. Non ho visto una soluzione chiara pubblicata da nessuna parte, e sono alla fine del mio ingegno.

Risposte:


9

e la mia lettura suggerisce che la migliore pratica è quella di gestire la logica dei template in template.php usando le funzioni di pre-elaborazione e processo.

Il disaccoppiamento della logica dal codice di rendering significa semplicemente che il codice in template.php imposta una variabile che viene controllata nel file modello. In questo modo, la logica è tutta contenuta nel file template.php, mentre il codice di rendering è tutto nei file template.

template.php

function mytheme_preprocess_page(&$variables) {
  if (!empty($variables['node']) && $variables['node']->type == 'concert') {
    $variables['show_title'] = FALSE;
  }
}

page.tpl.php

<?php if ($show_title && $title): ?><h1 class="title" id="page-title"><?php print $title; ?></h1><?php endif; ?>

hide()non funziona perché $variables['title']è una stringa, non un array di rendering. hide()viene sempre utilizzato con un array di rendering e non ha alcun effetto con una stringa, nemmeno quando viene passata la stringa render().
In realtà, il passaggio di una stringa (o qualsiasi valore che non è un riferimento a una variabile contenente un array) hide()causerebbe un errore PHP, poiché la funzione utilizza questo codice.

function hide(&$element) {
  $element['#printed'] = TRUE;
  return $element;
}

Disattivare $variables['title']con unset($variables['title'])non funziona anche, come template_process_page()otterrebbe il titolo della pagina da drupal_get_title().

if (!isset($variables['title'])) {
  $variables['title'] = drupal_get_title();
}

Naturalmente puoi anche cambiare la $titlevariabile attuale con mytheme_process_page(&$variables) { $title = false; }.
RobW,

4
@RobW che sarebbe mytheme_process_page(&$variables) { $variables['title'] = false; }e che funziona BTW.
Duncanmoo,

Un'altra nota su questo; a patto che il tema avvolge l' <?php print $title; ?>in <?php if (!$title_hidden): ?>si può semplicemente impostare$variables['title_hidden'] = TRUE;
Duncanmoo

2

Puoi gestirlo usando drupal_set_title ().

function mytheme_preprocess_page(&$vars){
    if (isset($vars['node']) && $vars['node']->type == 'news'){
        drupal_set_title('');
    }
}

Questo non ha funzionato per me. Qualcos'altro potrebbe avere la precedenza template_preprocess_page()? Ho usato il modulo Tema sviluppatore per ispezionare il titolo della pagina duplicata e ho confermato che è stato chiamato page.tpl.php. Dovrei pensare di eliminare il titolo da page.tpl.phpe quindi AGGIUNGERLO nel punto in cui lo voglio usare template_preprocess_page()? Voglio che il titolo venga visualizzato, ad esempio, quando la pagina contiene una vista di nodi, ma non quando la pagina è un singolo nodo di un certo tipo / tipi.
diekunstderfuge,

1
Questo potrebbe anche togliere informazioni importanti ai visitatori che usano gli screen reader. Elimina anche il titolo della pagina nella scheda utenti. Pensa all'accessibilità fin dall'inizio.
Rick,

1

Prova questo assumendo che la tua condizione sia corretta :)

 function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            unset($variables['title']);
        }
    }

Non funziona: template_process_page () verrebbe impostato $variables['title']con il valore restituito da drupal_get_title().
kiamlaluno

0

Il modo meno complicato è quello di stampare questo nel tuo page.tpl.php

<?php hide($title); ?>

Ma se vuoi che sia dinamico, suggerirei di usare il preprocess_pagemetodo suggerito da altri.


1
Non funziona hide()viene utilizzato con le matrici di rendering, non con le stringhe.
kiamlaluno

0

In CSS, ho fatto questo per il mio tema

/*    Front Page - hide title  */
body.front header h1 {
 position: absolute; 
 left: -999em;    
}

Come raccomandato da http://www.alistapart.com/articles/now-you-see-me/

Perché? Perché vuoi ancora avere l'intestazione e h1 'visibili' per i lettori di schermo per l'accessibilità. Se togli semplicemente il valore di H1, stai derubando i visitatori non vedenti e ipovedenti di alcune informazioni potenzialmente importanti.


Questo non funzionerà. Perché? Perché non è possibile aggiungere CSS condizionali senza l'aiuto del sito di programmazione n
AyeshK,

Drupal aggiunge classi ad elementi come 'front' usato sopra. Per quanto mi riguarda, devo nascondere il titolo sulla prima pagina ma lasciarlo "visibile" agli screen reader. Pertanto, posso usare la logica delle regole a cascata per definire chiaramente quando ne ho bisogno nascosto agli utenti vedenti e quando non lo faccio.
Rick,

0

il suggerimento di mytheme_preprocess_page funziona per me ma se viene utilizzato$vars['title_hidden'] = TRUE;

function mytheme_preprocess_page(&$vars) {
  if (isset($vars['node']->type) && $vars['node']->type == 'type') {
    $vars['title_hidden'] = TRUE;
  }
}

0

La funzione corretta è

function mytheme_preprocess_node(&$vars) {
}

invece di

function mytheme_preprocess_page(&$vars) {
}
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.