0

经过这里和 CI 用户指南的大量研究(数小时),我已经走到了尽头。

我结合了几个答案来实现我想要的,它按预期工作,但没有设置<li>为活动。

看法

<ul class="nav">
              <?php
              $query = $this->db->query('SELECT menu_title, menu_url FROM menus');
               foreach($query->result_array() as $row): ?>
                <li <?php if ( $this->uri->uri_string() == $row['menu_url'] ): ?> class="active"<?php endif; ?>><a href="<?=$row['menu_url'] ?>"><?=$row['menu_title']?></a></li>
                <?php endforeach ?>

            </ul> 

当它读取时,它会从表格中提取一组导航选项并将它们布置出来(有效),但不会让 css 变为活动状态。

4

3 回答 3

0

让我试着为你充实一下:

模型:

class Menu_model extends CI_Model{
 public function get_title_and_url ()
 {
  $query = $this->db->query('SELECT menu_title, menu_url FROM menus');
  return $query->result_array();
 }
}

控制器:

您可以通过不同的方式访问它,但现在我只是将菜单设置为自己的控制器。通常我会将菜单逻辑放入一个扩展 CI_Controller 的类中,这样我就可以在其他地方访问它

class Menu extends CI_Controller{
 public function __construct ()
 {
   parent::__construct();
   $this->load->model('menu_model','menu');
 }
 public function index ()
 {
   $view['menu_items'] = $this->menu->get_title_and_url();
   $view['current'] = $this->uri->uri_string();
   $this->load->view('menu_view',$view);
 }
}

看法:

<ul class='nav'>
 <?php foreach($menu_items as $m):?>
   <li <?php echo ($m['menu_url'] == $current ? "class='active'" : "");?>>
     <a href='<?php echo $m['menu_url'];?>'><?php echo $m['menu_title'];?></a>
   </li>
 <?php endforeach;?>
</ul>

我实现这样的方法是创建一个MY_Controller类来扩展 CI_Controller,在其中我将有这个用于创建菜单 HTML 的逻辑,然后将其传递给使用菜单的所有页面的母版页模板。这样我就不必在每个视图和控制器中重复自己。

值得一看。Phil Sturgeon 有一篇关于这类事情的精彩博客文章。

于 2013-02-17T05:56:17.670 回答
0

如果您在 if 条件中打印两个变量并检查该条件是否为真,那将很容易..

我认为在你的情况下/会给你带来麻烦,因为......$this->uri->uri_string()home像你/home在桌子上一样返回......

试试这个

<?php if ( '/'.$this->uri->uri_string() == $row['menu_url'] ): ?> class="active"<?php endif; ?>
于 2013-02-17T06:47:28.040 回答
0

如果您的 $row['menu_url'] 返回 /home 它将不匹配,因为 uri_string 将在没有 / 的情况下返回它

试试这个:

<?php
    $query = $this->db->query('SELECT menu_title, menu_url FROM menus');
    foreach($query->result_array() as $row): ?>
    $url = trim($row['menu_url'],"/");
    <li <?php if ( $this->uri->uri_string() == $url): ?> class="active"<?php endif; ?>><a href="<?=$row['menu_url'] ?>"><?=$row['menu_title']?></a></li>
<?php endforeach ?>

就我个人而言,我会打破它并使用三元 if 来使其更清洁但个人喜好。

<?php
    $query = $this->db->query('SELECT menu_title, menu_url FROM menus');        
    $uri = $this->uri->uri_string();
    foreach($query->result_array() as $row): ?>
    $url = trim($row['menu_url'],"/");
    <li <?php echo ($uri== $url) ? 'class="active"' : ''; ?>><a href="<?=$row['menu_url'] ?>"><?=$row['menu_title']?></a></li>
<?php endforeach ?>
于 2013-02-17T15:41:18.770 回答