Drupal6: добавить строку запроса к основным ссылкам

Я пытаюсь программно добавить строку запроса "? 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';
}

К сожалению, в ссылке не было никаких изменений. Я также собираюсь исследовать hook_menu_item_link() из моего файла template.php, но на этом этапе мне бы хотелось, чтобы кто-то мог указать мне правильное направление и сообщить, что я сделал неправильно.

Благодарю.

1 ответ

Решение

Код, который вы помещаете в свой page.tpl.php, имеет правильную идею, но вы упускаете пару вещей:

  1. Тело цикла foreach должно быть окружено тегами PHP, чтобы PHP интерпретировал и выполнял код. Вот почему вы видите, что Drupal просто "печатает код": потому что вы выводите его из PHP-мира, поэтому он просто становится частью HTML вашего шаблона.
  2. Даже если вы правильно выполните код, вы не увидите никаких изменений, потому что по умолчанию $link переменная в ваших циклах foreach является копией исходного элемента в массиве, поэтому $link['href'] = 'stuff' не будет изменять оригинал. Чтобы изменить оригинал, вы можете использовать синтаксис ссылки, например: foreach ($primary_links as &$link), (Амперсанд с префиксом к имени переменной см. В документации PHP по ссылкам).
  3. И, наконец, даже если вы исправите две предыдущие проблемы, они все равно могут не работать, потому что атрибут HREF ссылки, вероятно, будет обработан темой ('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-запроса для присоединения к окончательной ссылке (см. документацию по функции url() в Drupal).

Также не забывайте очищать кеши всякий раз, когда вы видите, что "ничего не меняется", особенно при работе над темой.

Другие вопросы по тегам