Drupal6:将查询字符串附加到主链接


Drupal6: Append query string to primary links

我正在尝试以编程方式将查询字符串"?device=mobile"添加到所有主链接中。

在我主题的page.tpl.php文件中,我尝试了以下操作,

<?php if (is_array($primary_links)) : ?>
    <?php foreach ($primary_links as $link): ?>
             $link['href'] = $link['href'].'?device=mobile';
    <?php endforeach; ?>
<?php endif; ?>

然而,这只是将代码打印到页面上。目前我正在尝试使用hook_menu_link_alter,但到目前为止我还没有成功。为了只在一个主要链接项目上测试我的代码,我尝试了下面的代码:

myModule_menu_link_alter(&$item, $map){
    $items['photo_gallery']['href'] = 'photo_gallery?device=mobile';
}

不幸的是,链接没有更改。我还将从template.php文件中调查hook_menu_item_link(),但在这一点上,我希望有人能给我指明正确的方向,让我知道我做错了什么。

谢谢。

您放入页面.tpl.php中的代码有正确的想法,但您缺少了以下几点:

  1. foreach循环的主体应该被PHP标记包围,以便PHP解释和执行代码。这就是为什么你会看到Drupal只是"打印出代码":因为你把它放在PHP的"世界"之外,所以它只是你模板HTML的一部分
  2. 即使正确执行了代码,也不会看到任何更改,因为默认情况下,foreach循环中的$link变量是数组中原始项的副本,因此执行$link['href'] = 'stuff'不会修改原始项。要修改原始文件,可以使用引用语法,如:foreach ($primary_links as &$link)。(Ampersand前缀为变量名,请参阅PHP文档中的参考资料)
  3. 最后,即使修复了前两个问题,它也可能仍然不起作用,因为链接的HREF属性稍后可能会由主题('links')处理,并且您的"?"answers"="将被编码,这将破坏链接

所以,为了解决这三个问题,我认为你应该修改你的page.tpl.php代码,使其看起来像:

<?php if (is_array($primary_links)) : ?>
  <?php foreach ($primary_links as &$link): ?>                           
  <?php $link['query'] = array('device' => 'mobile'); ?>
  <?php endforeach; ?>                                                   
<?php endif; ?>                                                          

或者,如果每一行都必须打开/关闭PHP,这让你很恼火,只需使用一个普通的块,比如:

<?php 
  if (is_array($primary_links)) {
    foreach ($primary_links as &$link) {
      $link['query'] = array('device' => 'mobile');
    }
  }
?>

注1。&$link语法(使用引用而不是复制)和2。$link数组的查询数组键,这是Drupal将搜索的"特殊"数组键之一,如果找到,可以用来构建一个适当的URL查询,以附加到最终链接(请参阅Drupal的URL()函数的文档)。

此外,当您看到"没有任何变化"时,请记住清除缓存,尤其是在处理主题时。