2012-07-10 35 views
0

我试图通过编程向所有主链接添加查询字符串“?device = mobile”。Drupal6:将查询字符串附加到主链接

在我试过下面我主题的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(),但是在这一点上,如果有人能指引我朝着正确的方向,并且让我知道我做错了什么,我会喜欢它。

谢谢。

回答

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属性可能稍后将由主题('链接')处理,而您的“?”和“=”将被编码,它会打破链接。

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

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

+0

谢谢亚历山大!这是一个很大的帮助! – SFox 2012-07-10 03:02:23