2012-07-10 36 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