2012-09-02 44 views
0

在網站導航欄中,我有一些邏輯來確定用戶當前正在查看哪個頁面,併爲該菜單項提供了一個.active類。CI活動導航項

我想出的代碼確實有用,儘管它不覺得很優雅。你能想出更好的方法嗎?我怎樣才能將邏輯從視圖中移出並進入控制器?我怎樣才能不再重複自己?

控制器:

<?php 

class Pages extends CI_Controller { 

    public function view ($page = 'home') { 

     if (!file_exists('application/views/pages/'.$page.'.php')) 
      show_404(); 

     $data['active'] = $page; 

     $this->load->view('templates/header', $data); 
     $this->load->view('pages/'.$page, $data); 
     $this->load->view('templates/footer', $data); 

    } 
} 

?> 

的觀點:

<ul class="nav"> 
    <li class="<?php echo($active=='home')?'active':''; ?>"><a href="./">blog</a></li> 
    <li class="<?php echo($active=='about')?'active':''; ?>"><a href="about">about</a></li> 
    <li class="<?php echo($active=='projects')?'active':''; ?>"><a href="projects">projects</a></li> 
    <li class="<?php echo($active=='lab')?'active':''; ?>"><a href="lab">lab</a></li> 
    <li class="<?php echo($active=='contact')?'active':''; ?>"><a href="contact">contact</a></li> 
</ul> 
+0

這應該是在http://codereview.stackexchange.com上。 –

+0

我應該在CR上創建一個新問題嗎?或者有人會提出這個問題? –

+0

個人而言,你得到的不是一個出價交易。有可能有更多的「優雅」的方式來做到這一點(將PHP切換到特定變量?onload Javascript?)。另一種方法是動態構建菜單列表,並在其中設置值。一半打... –

回答

1

也許更優雅?

function is_active($item) { 
     return strpos(uri_string(), $item)!==FALSE ? 'active':''; 
    } 


    <li class="<?=is_active('blog')?>"><a href="./">blog</a></li> 

這種方式取決於你的uris的複雜性。

1

你可以試試CSS。例如。如果你在'about'頁面上,它的正文標籤是<body id="about">。你的CSS:

#about .nav li.about, #contact .nav li.contact, /* etc */ { color: red; } 

這意味着每個.nav華里的有相關的給它的類名(在這種情況下,「約」)。在你的CSS文件中會有一些重複(儘管這只是逗號分隔屬性聲明前的所有li類名),但視圖將保持清潔。