0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ナビゲーションメニューの項目の中から、現在開いているページに飛ぶためのリンクが消えて、残りの項目だけを表示するようにしたい

Posted at

何がしたいか

例えば、ナビゲーションメニューに表示させたいリストが、項目A、項目B、項目C、項目Dの4つあるとします。項目Aのページを開いたときはナビゲーションメニューには項目A以外の3つが表示され、項目Bのページを開いたときはナビゲーションメニューには項目B以外の3つが表示され、・・・ということをしたい。つまり、ナビゲーションメニューの項目の中から、現在開いているページに飛ぶためのリンクが消えて、残りの項目だけを表示するようにしたい。
sihteicon.png
これを、PHPを使って実装します。

まず前提として…

ナビゲーションメニューの部分のHTMLは次のような構造です(CSSは省略)。

header.php
<header>
  <nav>
    <!-- ナビゲーションメニューの項目をaタグを使って作成 -->
  </nav>
</header>

これをincludeを使って、ヘッダー部分に読み込みます

〇〇.php
<?php include('header.php'); ?>

ナビゲーションメニューをうんぬんかんぬんするPHPのコード

まずは、すべてのコードを載せます。

header.php
<?php
  $navlist = [
    ['href' => 'itemA.php', 'name' => '項目A'],
    ['href' => 'itemB.php', 'name' => '項目B'],
    ['href' => 'itemC.php', 'name' => '項目C'],
    ['href' => 'itemD.php', 'name' => '項目D']
  ];
  $filename = debug_backtrace()[0]["file"];

  switch ($filename) {
    case '・・・/itemA.php':
      array_splice($navlist, 0, 1);
      break;
    case '・・・/itemB.php':
      array_splice($navlist, 1, 1);
      break;
    case '・・・/itemC.php':
      array_splice($navlist, 2, 1);
      break;
    case '・・・/itemD.php':
      array_splice($navlist, 3, 1);
      break;
  }
?>

<header>
  <nav>
    <?php foreach ($navlist as $key => $value) : ?>
      <a href="<?php echo $value['href']; ?>"><?php echo $value['name']; ?></a>
    <?php endforeach; ?>
  </nav>
</header>

次に、上のコードをいくつかのパートに分けて、軽く説明していきます。

ナビゲーションメニューの項目の名前と遷移先のページのパスを配列に格納

PHP
  $navlist = [
    ['href' => 'itemA.php', 'name' => '項目A'],
    ['href' => 'itemB.php', 'name' => '項目B'],
    ['href' => 'itemC.php', 'name' => '項目C'],
    ['href' => 'itemD.php', 'name' => '項目D']
  ];

あとで、この配列をループでまわして、navタグの中にaタグ<a href="〇〇">△△</a>を作っていきます。hrefキーの値は〇〇に、nameキーの値は△△に入ります。

header.phpがどのファイルから呼ばれたのかを取得

PHP
  $filename = debug_backtrace()[0]["file"];

ファイルのフルパスを返してくれるとかなんとか。上手く説明できないのでスルー。
PHP: debug_backtrace - Manual

header.phpの呼び出し先によって条件分岐

PHP
  switch ($filename) {
    case '・・・/itemA.php':
      array_splice($navlist, 0, 1);
      break;
    case '・・・/itemB.php':
      array_splice($navlist, 1, 1);
      break;
    case '・・・/itemC.php':
      array_splice($navlist, 2, 1);
      break;
    case '・・・/itemD.php':
      array_splice($navlist, 3, 1);
      break;
  }

$filename・・・/itemA.phpなら(=header.phpがitemA.phpから呼び出されたのなら)、$navlist配列の中のitemA.phpと関連したデータ( ['href' => 'itemA.php', 'name' => '項目A'])を削除する、というような処理をしています。

この処理を経ることで、配列には、呼び出し先のページ以外のページの情報だけが残ります。

配列をループ処理してaタグを作成

PHP
    <?php foreach ($navlist as $key => $value) : ?>
      <a href="<?php echo $value['href']; ?>"><?php echo $value['name']; ?></a>
    <?php endforeach; ?>

例えば、header.phpがitemA.phpから呼び出されたとしたら、前のswitch文の処理のおかげで、配列からitemA.phpに関するデータは消えました。このループ処理によって、itemB.php・itemC.php・itemD.phpのデータを使ってaタグが作成されます。

これで、ナビゲーションメニューの項目を動的に変化させることができます。

注意

・PHP初学者なので、説明が間違っているところがあるかもしれません。
・もっとスマートなやり方があればぜひ教えてください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?