如何使用template_preprocess_page()根据节点类型隐藏页面标题


10

page.tpl.php如果当前页面是1)处于全屏显示的节点(与预告片模式相反),并且2)节点类型是Concertbio,我试图隐藏当前页面的标题(由印刷)。我直接在节点内容中打印这些内容类型的节点标题,所以我想隐藏page.tpl.php打印的重复项。我无法直接在page.tpl.php中使用它,我的阅读建议最佳实践是使用预处理和过程功能处理template.php中的模板逻辑。因此,我正在尝试使用来隐藏当前页面标题(具有以上两个条件)template_preprocess_page()。这是我的代码。

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

我阅读了如何测试节点类型以从template.php打印变量?以及的文档页面template_preprocess_page()以及其他各种网站,但我似乎无法使它正常工作。我看到isset()$variables['node']在测试节点类型之前必须调用的建议,但这也不起作用。我没有在任何地方发布明确的解决方案,而我已经不知所措了。

Answers:


9

我的阅读建议最佳实践是使用预处理和过程功能处理template.php中的模板逻辑。

将逻辑与渲染代码分离,仅意味着template.php中的代码设置了一个在模板文件中检查的变量。这样,逻辑全部包含在template.php文件中,而渲染代码全部包含在模板文件中。

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()不起作用,因为$variables['title']它是字符串,而不是渲染数组。hide()总是与渲染数组一起使用,并且对字符串没有任何影响,即使将字符串传递到也不起作用render()
实际上,传递一个字符串(或任何不是对包含数组的变量的引用的值)hide()会导致PHP错误,因为该函数使用此代码。

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

解封$variables['title']unset($variables['title'])没有工作过,因为template_process_page()会得到网页的标题drupal_get_title()

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

当然,您也可以使用来更改实际$title变量mytheme_process_page(&$variables) { $title = false; }
RobW 2012年

4
@RobW将会mytheme_process_page(&$variables) { $variables['title'] = false; }并且可以使用顺便说一句。
Duncanmoo

关于此的另一注;只要你的主题包装了<?php print $title; ?><?php if (!$title_hidden): ?>,你可以简单地设置$variables['title_hidden'] = TRUE;
Duncanmoo

2

您可以使用drupal_set_title()进行管理。

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

这对我不起作用。还有其他事情可以压倒一切template_preprocess_page()吗?我已使用Theme Developer模块检查重复的页面标题,并确认正在从中调用它page.tpl.php。我是否应该考虑删除标题page.tpl.php,然后使用所需的位置将其添加回去template_preprocess_page()?我希望标题呈现,例如,当页面包含节点视图时,而不是当页面是特定类型的单个节点时。
diekunstderfuge 2012年

1
这也可以使用屏幕阅读器从访客那里剥离重要信息。它还会在“用户”标签中剥离页面标题。从一开始就考虑可访问性。
里克(Rick)

1

假设您的条件是否正确,请尝试以下操作:)

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

它不起作用:template_process_page()$variables['title']使用从返回的值进行设置drupal_get_title()
kiamlaluno

0

不太复杂的方法是在您的page.tpl.php中打印

<?php hide($title); ?>

但是,如果您希望它是动态的,我建议使用preprocess_page其他人建议的。


1
没用 hide()用于渲染数组,而不是字符串。
kiamlaluno

0

在CSS中,我这样做是为了主题

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

按照http://www.alistapart.com/articles/now-you-see-me/的建议

为什么?因为您仍想让标题和h1对屏幕阅读器“可见”,以实现可访问性。如果仅剥夺H1的价值,您就在向盲人和弱视游客窃取一些潜在的重要信息。


这是行不通的。为什么?因为没有编程站点n的帮助,您就无法添加条件CSS
AyeshK 2012年

Drupal将类添加到上面使用的诸如“ front”之类的元素中。对于我自己,我需要将标题隐藏在首页上,但对屏幕阅读器保持“可见”状态。因此,我可以使用级联规则的逻辑来明确定义何时需要将其隐藏在有视力的用户中,何时不使用。
里克

0

mytheme_preprocess_page的建议对我有用,但如果使用$vars['title_hidden'] = TRUE;

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

0

正确的功能是

function mytheme_preprocess_node(&$vars) {
}

代替

function mytheme_preprocess_page(&$vars) {
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.