MVC,CodeIgniter,在视图中使用锥形语句


MVC, CodeIgniter , Using conitional statements in a view?

在我的视图中使用条件块会破坏MVC体系结构的目的吗?

我有一个加载视图的控制器方法,并且我希望基于作为参数传递给该方法的页面id有一个不同的按钮组。

一切都很好,但在我看来,我有几个:

<?php if($pageID == n) : ?>
    html content...
<?php endif; ?>

这是一个坏习惯吗?如果是,有什么更好的解决方案?在我看来,调用库方法似乎也是错误的。

有几种方法可以避免这种解决方案,但这实际上取决于问题的规模。

一个更好的解决方案可能是如下所示。

查看

<?php echo $conditional_html; ?>

控制器

switch($pageID)
{
  case 1:
        $data['conditional_html'] = $this->load->view('the_first_id_html', TRUE);
        break;
  case 4:
  case 7:
  case 8:
        $data['conditional_html'] = $this->load->view('some_special_html', TRUE);
        break;
  case 13:
  case 18:
        $data['conditional_html'] = $this->load->view('the_secret_menu_html', TRUE);
        break;
  default:
    $data['conditional_html'] = $this->load->view('the_default_html', TRUE);
}
$this->load->vars($data);

如果你不介意在你的视图中加载视图,另一种更简单的方法可能是这样的:

查看

<?php $this->load->view($conditional_html); ?>

控制器

switch($pageID)
{
  case 1:
        $data['conditional_html'] = 'the_first_id_html';
        break;
  case 4:
  case 7:
  case 8:
        $data['conditional_html'] = 'some_special_html';
        break;
  case 13:
  case 18:
        $data['conditional_html'] = 'the_secret_menu_html';
        break;
  default:
    $data['conditional_html'] = 'the_default_html':
}
$this->load->vars($data);

最后,你可以用很多不同的方法来做这件事,但我希望这能为你提供一些替代方法

不,不是真的。视图应该包含MVC设计模式中的表示逻辑。

问题是,在CodeIgniter中,您没有真正的仅视图模板。这与CodeIgniter最初的目的是模仿RubyOnRails,而不是实现MVC有关。

如果有人强迫我使用CodeIgniter,我会在"视图"中使用这样的东西:

<?php
$pagelist = array(
   1 => 'foo/b',
   2 => 'foo/a',
   3 => 'foo/r',
   4 => 'lorem/ipsum'
);
$pageID = isset( $pagelist[ $pageId ]) ? $pageID : 1;
?>
<!DOCTYPE html>
<html>
    <!-- some stuff here -->
    <?php include '/path/to/views/' . $pagelist[ $pageId ]; ?>
    <!-- a bit more HTML -->
</html>

(CI称之为)控制器中的$this->load->view()基本上只是一个美化的include/require。这种方法没有什么神奇之处。

此外,您可能会发现以下内容很有趣:http://codeigniter.com/forums/viewthread/62366/