Cómo ocultar el título de la página según el tipo de nodo usando template_preprocess_page ()


10

Estoy tratando de ocultar el título de la página actual (como se imprime page.tpl.php) si la página actual es 1) un nodo en pantalla completa (en oposición al modo de avance), Y 2) el tipo de nodo es concierto o bio . Imprimo el título del nodo para estos tipos de contenido directamente en el contenido del nodo, por lo que quiero ocultar el duplicado que imprime page.tpl.php. No puedo hacer que esto funcione directamente en page.tpl.php, y mi lectura sugiere que la mejor práctica es manejar la lógica de plantilla en template.php usando las funciones de preproceso y proceso. Entonces, estoy tratando de ocultar el título de la página actual (con las 2 condiciones anteriores) usando template_preprocess_page(). Este es mi codigo.

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

Leí ¿Cómo pruebo el tipo de nodo para imprimir una variable desde template.php? y la página de documentación para template_preprocess_page(), y varios otros sitios, pero parece que no puedo hacer que esto funcione. Vi sugerencias que usted tiene que llamar isset()en $variables['node']antes de la prueba para el tipo de nodo, pero que no funcionó bien. No vi una solución clara publicada en ningún lado, y estoy al final de mi ingenio.

Respuestas:


9

y mi lectura sugiere que la mejor práctica es manejar la lógica de la plantilla en template.php usando las funciones de preproceso y proceso.

Desacoplar la lógica del código de representación simplemente significa que el código en template.php establece una variable que se verifica en el archivo de plantilla. De esta manera, la lógica está contenida en el archivo template.php, mientras que el código de representación está en los archivos de plantilla.

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()no funciona porque $variables['title']es una cadena, no una matriz de representación. hide()siempre se usa con una matriz de representación, y no tiene ningún efecto con una cadena, ni siquiera cuando se pasa la cadena render().
En realidad, pasar una cadena (o cualquier valor que no sea una referencia a una variable que contenga una matriz) hide()provocaría un error de PHP, ya que la función usa este código.

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

Unsetting $variables['title']con unset($variables['title'])no funciona demasiado, ya que template_process_page()obtendría el título de la página de drupal_get_title().

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

Por supuesto, también puede cambiar la $titlevariable real con mytheme_process_page(&$variables) { $title = false; }.
RobW

44
@RobW que sería mytheme_process_page(&$variables) { $variables['title'] = false; }y eso funciona por cierto.
Duncanmoo

Otra nota sobre esto; siempre y cuando su tema envuelve la <?php print $title; ?>de <?php if (!$title_hidden): ?>simplemente puede establecer$variables['title_hidden'] = TRUE;
Duncanmoo

2

Puede administrar esto usando drupal_set_title ().

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

Esto no funcionó para mí. ¿Podría otra cosa estar anulando template_preprocess_page()? He utilizado el módulo de desarrollador de temas para inspeccionar el título de la página duplicada y he confirmado que se está llamando desde page.tpl.php. ¿Debería pensar en eliminar el título page.tpl.phpy luego AGREGARlo de nuevo donde lo quiero usar template_preprocess_page()? Quiero que se muestre el título, por ejemplo, cuando la página contiene una vista de nodos, pero no cuando la página es un nodo único de cierto tipo / tipos.
diekunstderfuge

1
Esto también podría eliminar información importante de los visitantes que usan lectores de pantalla. También elimina el título de la página en la pestaña de usuarios. Piensa en la accesibilidad desde el principio.
Rick

1

Pruebe esto suponiendo que su condición sea correcta :)

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

No funciona: template_process_page () se establecería $variables['title']con el valor devuelto por drupal_get_title().
kiamlaluno

0

La forma menos complicada es imprimiendo esto en su page.tpl.php

<?php hide($title); ?>

Pero si quieres que sea dinámico, te sugiero que uses el que sugieran preprocess_pageotros.


1
No funciona hide()se usa con matrices de representación, no cadenas.
kiamlaluno

0

En CSS, hice esto a mi tema

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

Según lo recomendado por http://www.alistapart.com/articles/now-you-see-me/

¿Por qué? Porque aún desea tener el encabezado y h1 'visibles' para los lectores de pantalla para accesibilidad. Si simplemente quita el valor del H1, está robando a sus visitantes ciegos y de baja visión alguna información potencialmente importante.


Esto no funcionará. ¿Por qué? Porque no puede agregar CSS condicional sin la ayuda del sitio de programación n
AyeshK

Drupal agrega clases a elementos como 'frontal' utilizado anteriormente. Para mí, necesito ocultar el título en la página principal pero dejarlo "visible" para los lectores de pantalla. Por lo tanto, puedo usar la lógica de las reglas en cascada para definir claramente cuándo lo necesito oculto para los usuarios videntes y cuándo no.
Rick

0

la sugerencia de mytheme_preprocess_page funciona para mí pero si se usa$vars['title_hidden'] = TRUE;

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

0

La función correcta es

function mytheme_preprocess_node(&$vars) {
}

en lugar de

function mytheme_preprocess_page(&$vars) {
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.