【freo】開いているページによってメニューを変化させる方法【Tips】

やっていることはsmartyの機能を使って現在のURLを取得して一致したらclassを与えているだけです。

ちなみに当サイトの上部にあるメニューで同様のことを行なっています。(※旧サイト時のため現在は違います)

実装方法

対象が単一ページのみ場合

http://host/hoge1\を表示していたらliclass="current"を加える。

<li<!--{if ($smarty.server.REQUEST_URI == '/hoge1')}--> class="current"<!--{/if}-->><a href="/hoge1">メニュー1</a></li>

対象が多階層の場合

http://host/hoge1もしくはhttp://host/hoge1/hogehogeを表示していたら以下略。

<li <!--{if ($smarty.server.REQUEST_URI|regex_replace:'/^/hoge1.*/i':'reg' eq 'reg')}--> class="current"<!--{/if}-->><a href="/hoge1">メニュー1</a></li>

複数のURLを対象にしたい場合

該当部分をこんな感じにする。

($smarty.server.REQUEST_URI == '/hoge1' || $smarty.server.REQUEST_URI == '/hoge2')

あとはcssで.currentに対してなにか記述すればいいと思います。

文字の色を変えるとかそこら辺好きなように。

余談

これはfreoの機能と言うよりも上記にも書きましたがsmartyの機能ですので他のCMSでもsmartyを採用していれば使えると思います。

以下ちょっとした解説もどき(ほぼ初心者向け?)

regex_replaceを指定することで正規表現での検索・検索が可能となります。

^は文字列の先頭を意味します。今回は使用していませんが逆の意味で末尾を意味する$もあります。

\//を文字列にしたい場合です。ちなみに/単体では文字列として認識しません。i^などの前に置いてこれらを機能させるものですので。

iは大文字小文字を区別なくマッチさせますので、認識URLが大文字でも小文字でも認識します。

.*.*で別々の意味合いですがこの組み合わせにすることで0ないし1以上の文字列となります。

eqとは正規表現の==と同様の意味合いですので==で記述しても問題ありません。

むしろ==で統一したほうがわかりやすいかも知れませんね。

regは最初のに読み取ったURLを代入し、2個目のに正規表現の文字列を代入しています。(文字列は確かなんでも良かったような気がします)

あとはその2つを先ほどのeqで一致するか確かめればifの判定が出せます。

なぜ多階層のほうでREQUEST_URI == '/hoge1.*'とせずに、わざわざこんな面倒な記述をしているのかというと。

ひとえに正規表現がその状態では機能しないからです(´・ω・`)

機能する方法があれば誰か教えてください(´;ω;`)

コメント
※コメントは承認制となっていますので、コメントを頂いても直ぐには表示されません。
※不適切な内容(スパムや悪意ある内容等)のコメントは公開されませんので、ご了承ください。
※返信が必要な場合などでコメントの公開を通知されたい場合はメールアドレスの入力をお願いします。
名もなき名無しさん
メールアドレス(例:コメントの公開通知が欲しい場合)
内容