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

时间:2012-07-10 01:33:21

标签: php drupal-6 navigation drupal-hooks

我正在尝试以编程方式将查询字符串“?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(),但是在这一点上,如果有人能指出我正确的方向,我会喜欢它,让我知道我做错了什么。

感谢。

1 个答案:

答案 0 :(得分:2)

你在page.tpl.php中放置的代码有正确的想法,但你遗漏了一些东西:

  1. foreach 循环的主体应该被PHP标记包围,以便PHP将解释并执行代码。这就是为什么你看到Drupal只是“打印掉代码”的原因:因为你把它从PHP“世界”中删除了,所以它只是你模板HTML的一部分。
  2. 即使您正确执行了代码,也不会看到任何更改,因为默认情况下, foreach 循环中的$link变量是副本数组中的原始项目,因此$link['href'] = 'stuff'不会修改原始项目。要修改原始文件,您可以使用参考语法,例如:foreach ($primary_links as &$link)。 (前缀为变量名称的&符号,请参阅PHP docs on references)。
  3. 最后,即使您修复了前两个问题,它仍可能无法正常工作,因为链接的HREF属性可能会在稍后由主题(“链接”)处理,而您的“?”并且“=”将被编码,它将破坏链接。
  4. 所以,解决这三个问题,我会说你应该修改你的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()函数的文档)。

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