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