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を使用しようとしていますが、これまでのところ成功していません。1つのプライマリリンクアイテムでコードをテストするために、以下のコードを試しました。

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. PHPがコードを解釈して実行できるように、 foreachループの本体はPHPタグで囲む必要があります。これが、Drupalが単に「コードを出力する」ことがわかる理由です。PHPの「世界」からコードを出力しているため、テンプレートのHTMLの一部になります。
  2. コードを正しく実行しても、変更は表示されません。デフォルトでは、 foreachループの$link変数は配列内の元の項目のコピーであるため、元の項目は変更されません。オリジナルを変更するには、次のような参照構文を使用できます。(変数名の前に付けられたアンパサンド。参照に関するPHPドキュメントを参照してください)。$link['href'] = 'stuff'foreach ($primary_links as &$link)
  3. そして最後に、前の2つの問題を修正しても、リンクのHREF属性は後でtheme('links')と「?」によって処理される可能性があるため、機能しない可能性があります。および「=」はエンコードされ、リンクが切断されます。

したがって、これら3つの問題を修正するには、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が検索し、見つかった場合は適切な配列を構築するために使用する「特別な」配列キーの1つです。最終リンクに添付するURLクエリ(Drupalのurl()関数のドキュメントを参照)。

また、特にテーマで作業しているときは、「何も変わらない」ことがわかったら、必ずキャッシュをクリアしてください。

于 2012-07-10T02:11:42.270 に答える