Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php CI活动导航项_Php_Codeigniter - Fatal编程技术网

Php CI活动导航项

Php CI活动导航项,php,codeigniter,Php,Codeigniter,在站点导航栏中,我有一些逻辑来确定用户当前查看的页面,并为该菜单项提供一个.active类 我提出的代码确实有效,尽管感觉不是很优雅。你能想出一个更好的办法吗?如何将逻辑移出视图并移入控制器?我怎样才能停止重复我自己 控制器: <?php class Pages extends CI_Controller { public function view ($page = 'home') { if (!file_exists('application/views/

在站点导航栏中,我有一些逻辑来确定用户当前查看的页面,并为该菜单项提供一个
.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>

视图:

<?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>
    也许更优雅些

        function is_active($item) {
            return strpos(uri_string(), $item)!==FALSE ? 'active':'';
        }
    
    
        <li class="<?=is_active('blog')?>"><a href="./">blog</a></li>
    
    功能处于活动状态($item){
    返回strpos(uri_string(),$item)!==FALSE?'active':'';
    }
    
    你可以试试CSS。例如,如果您在“关于”页面上,其正文标签将是
    。您的CSS:

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

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

    这应该是打开的。我是否要创建一个关于CR的新问题?或者有人会提出这个问题吗?就个人而言,你得到的不是出价交易。可能还有更“优雅”的方法(在PHP中切换到特定变量?
    onload
    Javascript?)。另一种方法是动态构建菜单列表,并在该列表中设置值。半打……我不会用JS来做这个。也许你是对的;毕竟它可能没那么难看。使用JS有它的优点和缺点。我建议的一件事是扔掉无用的三元组;只要
    ,如果
    更具描述性,就没有理由回显空白和
    。另外,您可以使用PHP模板函数,正如我用Handlebar演示的那样(这只是演示您可以使用专门构建的函数,不建议您为此使用Handlebar)。