Comment masquer le titre de la page en fonction du type de nœud à l'aide de template_preprocess_page ()

10

J'essaie de masquer le titre de la page actuelle (tel qu'imprimé par page.tpl.php) si la page actuelle est 1) un nœud en plein affichage (par opposition au mode teaser) ET 2) le type de nœud est soit concert, soit bio . J'imprime le titre du nœud pour ces types de contenu directement dans le contenu du nœud, donc je veux masquer le doublon en cours d'impression par page.tpl.php. Je ne suis pas en mesure de faire fonctionner cela directement dans page.tpl.php, et ma lecture suggère que la meilleure pratique consiste à gérer la logique du modèle dans template.php en utilisant des fonctions de prétraitement et de traitement. Donc, j'essaie de masquer le titre de la page actuelle (avec les 2 conditions ci-dessus) en utilisant template_preprocess_page(). Ceci est mon code.

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

Je lis Comment puis-je tester le type de nœud pour imprimer une variable à partir de template.php? et la page de documentation pour template_preprocess_page(), et divers autres sites, mais je n'arrive pas à faire fonctionner cela. J'ai vu des suggestions que vous devez appeler isset()sur $variables['node']avant de tester pour le type de noeud, mais cela ne fonctionne pas non plus . Je n'ai vu aucune solution claire affichée nulle part, et je suis à bout de souffle.

diekunstderfuge
la source

Réponses:

9

et ma lecture suggère que la meilleure pratique est de gérer la logique du modèle dans template.php en utilisant des fonctions de prétraitement et de traitement.

Le découplage de la logique du code de rendu signifie simplement que le code dans template.php définit une variable qui est vérifiée dans le fichier de modèle. De cette façon, la logique est entièrement contenue dans le fichier template.php, tandis que le code de rendu est tout dans les fichiers de modèle.

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()ne fonctionne pas car $variables['title']est une chaîne, pas un tableau de rendu. hide()est toujours utilisé avec un tableau de rendu, et il n'a aucun effet avec une chaîne, pas même lorsque la chaîne est passée à render().
En fait, passer une chaîne (ou toute valeur qui n'est pas une référence à une variable contenant un tableau) hide()provoquerait une erreur PHP, car la fonction utilise ce code.

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

Désinstaller $variables['title']avec unset($variables['title'])ne fonctionne pas trop, comme le template_process_page()ferait le titre de la page drupal_get_title().

if (!isset($variables['title'])) {
  $variables['title'] = drupal_get_title();
}
kiamlaluno
la source
Bien sûr, vous pouvez également modifier la $titlevariable réelle avec mytheme_process_page(&$variables) { $title = false; }.
RobW
4
@RobW ce serait mytheme_process_page(&$variables) { $variables['title'] = false; }et cela fonctionne BTW.
Duncanmoo
Une autre note à ce sujet; aussi longtemps que votre thème enveloppe le <?php print $title; ?>en <?php if (!$title_hidden): ?>vous pouvez simplement mettre$variables['title_hidden'] = TRUE;
Duncanmoo
2

Vous pouvez gérer cela en utilisant drupal_set_title ().

function mytheme_preprocess_page(&$vars){
    if (isset($vars['node']) && $vars['node']->type == 'news'){
        drupal_set_title('');
    }
}
mohit_rocks
la source
Ça n'a pas marché pour moi. Quelque chose d'autre pourrait-il être prioritaire template_preprocess_page()? J'ai utilisé le module Theme Developer pour inspecter le titre de la page en double et confirmé qu'il est appelé depuis page.tpl.php. Dois-je penser à supprimer le titre page.tpl.phpet à l'ajouter ensuite là où je veux qu'il soit utilisé template_preprocess_page()? Je veux que le titre s'affiche, par exemple, lorsque la page contient une vue des nœuds, mais pas lorsque la page est un nœud unique d'un certain type / types.
diekunstderfuge
1
Cela pourrait également supprimer des informations importantes des visiteurs utilisant des lecteurs d'écran. Il supprime également le titre de la page dans l'onglet utilisateurs. Pensez à l'accessibilité dès le départ.
Rick
1

Essayez ceci en supposant que votre condition est correcte :)

 function MYTHEME_preprocess_page(&$variables) {
        if (!empty($variables['node']) && $variables['node']->type == 'concert') {
            unset($variables['title']);
        }
    }
junedkazi
la source
Cela ne fonctionne pas: template_process_page () serait défini $variables['title']avec la valeur renvoyée par drupal_get_title().
kiamlaluno
0

La manière la moins compliquée consiste à l'imprimer dans votre page.tpl.php

<?php hide($title); ?>

Mais si vous voulez qu'il soit dynamique, je suggère d'utiliser le preprocess_pagecomme suggéré par d'autres.

ninjascorner
la source
1
Ça ne marche pas. hide()est utilisé avec des tableaux de rendu, pas des chaînes.
kiamlaluno
0

En CSS, je l'ai fait pour mon thème

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

Tel que recommandé par http://www.alistapart.com/articles/now-you-see-me/

Pourquoi? Parce que vous voulez toujours que l'en-tête et h1 soient «visibles» pour filtrer l'accessibilité des lecteurs. Si vous supprimez simplement la valeur du H1, vous volez à vos visiteurs aveugles et malvoyants des informations potentiellement importantes.

Meule
la source
Cela ne fonctionnera pas. Pourquoi? Parce que vous ne pouvez pas ajouter de CSS conditionnel sans l'aide du site de programmation n
AyeshK
Drupal ajoute des classes à des éléments tels que «front» utilisé ci-dessus. Pour ma part, je dois cacher le titre sur la première page mais le laisser «visible» aux lecteurs d'écran. Par conséquent, je peux utiliser la logique des règles en cascade pour définir clairement quand j'en ai besoin caché aux utilisateurs voyants et quand je n'en ai pas.
Rick
0

la suggestion de mytheme_preprocess_page fonctionne pour moi mais si elle est utilisée$vars['title_hidden'] = TRUE;

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

La fonction correcte est

function mytheme_preprocess_node(&$vars) {
}

au lieu de

function mytheme_preprocess_page(&$vars) {
}
Paolo Marcolli
la source