ナビゲーションメニューの項目の中から、現在開いているページに飛ぶためのリンクが消えて、残りの項目だけを表示するようにしたい
何がしたいか
例えば、ナビゲーションメニューに表示させたいリストが、項目A、項目B、項目C、項目Dの4つあるとします。項目Aのページを開いたときはナビゲーションメニューには項目A以外の3つが表示され、項目Bのページを開いたときはナビゲーションメニューには項目B以外の3つが表示され、・・・ということをしたい。つまり、ナビゲーションメニューの項目の中から、現在開いているページに飛ぶためのリンクが消えて、残りの項目だけを表示するようにしたい。
これを、PHPを使って実装します。
まず前提として…
ナビゲーションメニューの部分のHTMLは次のような構造です(CSSは省略)。
<header>
<nav>
<!-- ナビゲーションメニューの項目をaタグを使って作成 -->
</nav>
</header>
これをinclude
を使って、ヘッダー部分に読み込みます
<?php include('header.php'); ?>
ナビゲーションメニューをうんぬんかんぬんする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>
次に、上のコードをいくつかのパートに分けて、軽く説明していきます。
ナビゲーションメニューの項目の名前と遷移先のページのパスを配列に格納
$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がどのファイルから呼ばれたのかを取得
$filename = debug_backtrace()[0]["file"];
ファイルのフルパスを返してくれるとかなんとか。上手く説明できないのでスルー。
PHP: debug_backtrace - Manual
header.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 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初学者なので、説明が間違っているところがあるかもしれません。
・もっとスマートなやり方があればぜひ教えてください。
Author And Source
この問題について(ナビゲーションメニューの項目の中から、現在開いているページに飛ぶためのリンクが消えて、残りの項目だけを表示するようにしたい), 我々は、より多くの情報をここで見つけました https://qiita.com/ryoo_ss/items/8120384bfdc12967a3ca著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .