【问题标题】:drupal_set_title not setting $title variabledrupal_set_title 没有设置 $title 变量
【发布时间】:2012-01-10 19:41:07
【问题描述】:

我试图在我的 node.tpl.php 中使用 drupal_set_title 但我设置标题的文本只显示在 $head_title 变量中,而不是 $title 变量中。 $title 变量仍然设置为节点的标题。

这是在 Drupal 7 中。我在 Drupal 6 中多次使用过这样的 drupal_set_title 并且效果很好。

【问题讨论】:

  • $head_title 不是node.tpl.php 的标准变量,您是说html.tpl.php 吗? (有关可用变量的列表,请参阅node.tpl.php docs
  • $head_title 正在 html.tpl.php 中使用,并且设置正确,但 node.tpl.php 中的 $title 设置不正确。
  • 知道了,你在哪里使用drupal_set_title?它在主题/模块中吗?如果是,是哪个功能?
  • 它正在我的主题的 node.tpl.php 中使用

标签: php drupal drupal-7


【解决方案1】:

我认为这不起作用的原因是因为您从哪里调用它。 Drupal 的模板系统通过构建变量($title 是其中之一)并将它们传递给模板文件来工作。

当您到达node.tpl.php 时,仅在该文件范围内可用的$title 变量已经一成不变。因此,虽然调用drupal_set_title 可以将$head_title 更改为html.tpl.php(它的调用晚于node.tpl.php,但它无法更改您从中调用代码的模板文件的变量。

最好的办法是在主题的template.php 中放置一个预处理函数,它会在处理模板文件之前设置标题:

function MYTHEME_preprocess_node(&$vars) {
  drupal_set_title('A new title');
}

如果这仍然不起作用,请尝试在同一预处理函数中显式设置 $vars['title'] = 'A new title';`。

最好的选择是编写一个非常小的自定义模块并实现hook_node_view(),它在模板文件进入进程之前被调用并且应该始终有效:

function MYMODULE_node_view($node, $view_mode, $lang_code) {
  drupal_set_title('A new title');
}

【讨论】:

    【解决方案2】:

    Clive 让我指出了正确的方向,但我无法让 preprocess_node 工作,所以我不得不改用 preprocess_page。这是有效的代码:

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

    【讨论】:

      猜你喜欢
      • 2018-12-24
      • 1970-01-01
      • 2014-01-29
      • 1970-01-01
      • 2021-06-21
      • 2016-04-06
      • 2017-01-16
      • 2016-03-20
      • 1970-01-01
      相关资源
      最近更新 更多