【问题标题】:Codeigniter - if else inside viewCodeigniter - if else inside view
【发布时间】:2012-03-20 04:19:23
【问题描述】:

我正在为我的网络应用设计主题布局。

假设我有两个控制器,A 和 B。我希望 A 视图显示 div A 和 B 视图将显示 div B。

我知道如何使用if($this->router->fetch_class() == 'A') { //display div A }在控制器内设置它

但是,如何实现这一点呢?

【问题讨论】:

    标签: php model-view-controller codeigniter


    【解决方案1】:

    您可以在控制器中使用相同的逻辑,然后将值传递给您的视图:

    $class = $this->router->fetch_class();
    
    $this->load->view('myView', 
                      array('class' => $class));
    

    然后在您的视图中使用该变量:

    if ($class == 'A') ...
    

    【讨论】:

    • 哎呀,只是因为它不是一些常规字符串,我认为它不能像那样传递给视图..谢谢。会试一试
    • 是的,我知道没有任何限制;除了字符串之外,还可以将其他类型的对象传递给视图。
    【解决方案2】:

    不。不要那样做。 ;) 对这类事情进行硬编码字符串几乎总是一种不好的方法。你的视图会变得混乱,祝你重命名你的控制器类好运。

    首先,如果这段代码在你的控制器中,你不知道它是哪个控制器吗?

    这让我假设这是一个被多个控制器使用的继承方法,对吧?在这种情况下,有几种选择:

    1. 在每个孩子的基础上覆盖它,告诉 parent::some_action() 方法您要显示哪个 div。 (此处适当的“权限”委派将在以后为您省去一些解耦的麻烦......)

    2. 不要使用fetch_class(),而是使用instanceof(这样,如果您重命名类,IDE 将为您完成繁重的工作)。

      李>
    3. 考虑将这些内容拆分为子视图(即部分视图)。 真的 在视图中进行字符串比较会很麻烦。相信。我。

    以下是我的建议:

    <?php
    // Overridden core class
    class MY_Controller extends CI_Controller {
    
        public function some_action()
        {
            //...
            if ($this instanceof Controller_class_that_uses_div_a)
            {
                $this->load->view('view_for_div_A');
            }
            else
            {
                $this->load->view('view_for_div_B');
            }
            //...
        }
    }
    

    【讨论】:

    • 我自己也对这个问题感到困惑。我同意这里。您不想养成在视图中执行控制器操作的习惯。为了其他人活着,必须弄乱这段代码,请保持简单和包含。
    猜你喜欢
    • 1970-01-01
    • 2017-07-21
    • 2018-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2013-07-08
    • 2021-06-05
    相关资源
    最近更新 更多