web-dev-qa-db-fra.com

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

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 ou 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 à l'aide de fonctions de prétraitement et de traitement. Donc, j'essaie de cacher 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']);
        }
    }
?>

J'ai lu 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 ça. J'ai vu des suggestions selon lesquelles vous devez appeler isset() sur $variables['node'] Avant de tester le type de nœud, mais cela n'a pas fonctionné non plus. Je n'ai vu aucune solution claire affichée nulle part, et je suis à bout de souffle.

10
diekunstderfuge

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() entraînerait une erreur PHP, car la fonction utilise ce code.

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

La suppression de $variables['title'] Avec unset($variables['title']) ne fonctionne pas non plus, car template_process_page() obtiendrait le titre de la page de drupal_get_title() .

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

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('');
    }
}
2
mohit_rocks

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']);
        }
    }
1
junedkazi

La fonction correcte est

function mytheme_preprocess_node(&$vars) {
}

au lieu de

function mytheme_preprocess_page(&$vars) {
}
0
Paolo Marcolli

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 vous suggère d'utiliser le preprocess_page comme suggéré par d'autres.

0
ninjascorner

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

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.

0
Rick