0

在站点导航栏中,我有一些逻辑可以确定用户当前正在查看的页面,并为该菜单项提供一个.active类。

我想出的代码确实有效,但感觉不是很优雅。你能想出一个更好的方法吗?如何将逻辑移出视图并移入控制器?我怎样才能停止重复自己?

控制器:

<?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>
4

2 回答 2

1

也许更优雅?

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


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

这种方式取决于您的 uris 的复杂性。

于 2012-09-03T05:25:12.940 回答
1

您可以尝试使用 CSS。例如,如果您在“关于”页面上,它的正文标签将是<body id="about">. 你的 CSS:

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

这意味着您的每个 .nav li 都有一个与之相关的类名(在本例中为“about”)。您的 CSS 文件中会有一些重复(尽管这只是在属性声明之前用逗号分隔所有 li 类名的问题),但视图会保持干净。

于 2012-09-03T14:19:26.833 回答