タイトルなげぇ……
やっていることはsmartyの機能を使って現在のURLを取得して一致したらclassを与えているだけです。
ちなみに当サイトの上部にあるメニューで同様のことを行なっています。
実装方法
対象が単一ページのみ場合
http://host/hoge1を表示していたらliにclass="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.*'とせずに、わざわざこんな面倒な記述をしているのかというと。
ひとえに正規表現がその状態では機能しないからです(´・ω・`)
機能する方法があれば誰か教えてください(´;ω;`)
関連エントリー
コメント
- コメントはまだありません。