0

我正在尝试以编程方式将查询字符串“?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(),但此时我希望有人能指出我正确的方向,并让我知道我做错了什么。

谢谢。

4

1 回答 1

1

您放入 page.tpl.php 的代码有正确的想法,但您缺少一些东西:

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

所以,解决这三个问题,我会说你应该修改你的 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()函数的文档)。

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

于 2012-07-10T02:11:42.270 回答