2011-09-17 11 views
1

だから、前のCakePHPに導入されることに、私は私が書いた以下の(というずさんな)コード(FYI absolute_urlが、私は絶対パスを取得するために書いた関数であった)で、URLに応じて適切なナビゲーションタブをハイライトしたい:CakePHPを使っているページに従ってタブをハイライトする最も良い方法は?

$page = $_SERVER['PHP_SELF']; 
// add all possible states for the navigation to an array 
$checkNav = array(
    "index" => "index", 
    "new" => "new", 
    "random" => "random", 
    "submit" => "submit" 
); 
$compareAgainst = strpos($page, $checkNav['index']); 
if ($compareAgainst == 0) { 
    echo "<li><a href=\"" . absolute_url("index") . "\"><span class=\"navBorder\">Popular</span></a></li>\n"; 
} else { 
    echo "<li><a href=\"" . absolute_url("index") . "\" id=\"current\">Popular</a></li>\n"; 
} 
$compareAgainst = strpos($page, $checkNav['new']); 
if ($compareAgainst == 0) { 
    echo "<li><a href=\"" . absolute_url("new") . "\"><span class=\"navBorder\">New</span></a></li>\n"; 
} else { 
    echo "<li><a href=\"" . absolute_url("new") . "\" id=\"current\">New</a></li>\n"; 
} 
$compareAgainst = strpos($page, $checkNav['random']); 
if ($compareAgainst == 0) { 
    echo "<li><a href=\"" . absolute_url("random") . "\"><span class=\"navBorder\">Random</span></a></li>\n"; 
} else { 
    echo "<li><a href=\"" . absolute_url("random") . "\" id=\"current\">Random</a></li>\n"; 
} 
$compareAgainst = strpos($page, $checkNav['submit']); 
if ($compareAgainst == 0) { 
    echo "<li><a href=\"" . absolute_url("submit") . "\"><span class=\"navBorder\">+ Submit a Link</span></a></li>\n"; 
} else { 
    echo "<li><a href=\"" . absolute_url("submit") . "\" id=\"current\">+ Submit a Link</a></li>\n"; 
} 

さて、私は相対パスを決定するために、そのケーキに気づいた、私は行くことができます:

<?= $this->here; ?> 

はこれを行うには良い方法はありますか、私はこの(新しい)を実装する必要があります古いコードのメソッド?

答えて

3

あなたは、次の

は、あなたが複数のページでそれを必要とする場合app_helper.phpするためにこれを追加行うことができます。この機能には、コントローラーと、比較したいと思うアクションを入力します。この関数は現在のページと比較し、一致した場合にtrueを返します。その後、

function isActive($controller, $actions = array()) 
    { 
     foreach ($actions as $action) 
     { 
     if ($controller == $this->params['controller'] && $action == $this->params['action']) 
     { 
      return true; 
     } 
     } 
     return false; 
    } 

そしてそうのようなあなたのリンクを生成:関数がtrueを返した場合

<ul class="left"> 
    <li <?php if($html->isActive('controller_name', array('index'))) { echo 'class="active"'; } ?>><?php echo $html->link('Index', '/index'); ?></li> 
    <li <?php if($html->isActive('controller_name', array('new'))) { echo 'class="active"'; } ?>><?php echo $html->link('New', '/new'); ?></li> 
    <li <?php if($html->isActive('controller_name', array('random'))) { echo 'class="active"'; } ?>><?php echo $html->link('Random', '/random'); ?></li> 
    <li <?php if($html->isActive('controller_name', array('submit'))) { echo 'class="active"'; } ?>><?php echo $html->link('Submit', '/submit'); ?></li> 
</ul> 

、リンクは= "アクティブ" クラスを持つことになります。それをあなたのニーズに合わせてください。

2

私がいつもやったことは、あなたのボディタグにIDを与え、それをターゲットにするためにCSSを使うことです。ビューがすべて別の場合は、ボディIDをハードコードすることができます。ヘッダー、コンテンツ、フッターなどに追加する何らかの種類のテンプレートを使用している場合は、ヘッダービューまたはbodyタグのいずれかの変数としてIDを渡してください(本当にすべての外部コンテナ/ divナビゲーションタブを表示して含む)。また、ナビゲーションタブのIDをそれぞれに割り当てる必要があります。ただ、いくつかのCSSこのようなその後

#homepage a#hometab, 
#aboutpage a#abouttab, 
#productpage a#productstab, 
#contactpage a#contacttab 
         {  
         special active styling here 
         } 
+0

本当にきれいなアイデア。 – maiko

関連する問題