Php 使用Codeigniter的复合视图?

Php 使用Codeigniter的复合视图?,php,codeigniter,Php,Codeigniter,对于我的Codeigniter站点,我首先为每个控制器情况创建一个视图。这是不切实际的,因为这需要返回到代码中进行更改。所以我改变了方法,在带有可选字段的“默认”控制器上操作。然后我想我可以根据需要在其中加载特殊视图 我将此视图与可选字段组合在一起,这些字段用于$title,$search\u bar打开/关闭等。但是,现在出现了内容区域。我可以使用以下方法将更多视图加载到此默认视图中: $data['content_views'][]='blocks/login';

对于我的Codeigniter站点,我首先为每个控制器情况创建一个视图。这是不切实际的,因为这需要返回到代码中进行更改。所以我改变了方法,在带有可选字段的“默认”控制器上操作。然后我想我可以根据需要在其中加载特殊视图

我将此视图与可选字段组合在一起,这些字段用于
$title
$search\u bar
打开/关闭等。但是,现在出现了内容区域。我可以使用以下方法将更多视图加载到此默认视图中:

        $data['content_views'][]='blocks/login';

        $this->load->view('default/a', $data);
在“默认”视图中:

if(isset($content_views)&& (is_array($content_views)))
    {
        foreach($content_views as $content_view)
        {
            $this->load->view(&$content_view);
        }
    }
(这很好用) 两个问题:

  • 我把事情弄复杂了吗?这是公认的做法吗?或者我是否误解了视图的功能以及它们是如何工作的

  • 我想要一种混合
    $content\u视图的方法,即先是一块文本,然后是一个视图。我不太清楚该如何进行。先说我想要一条消息,然后是一个视图,然后是更多的文本。此方法将只接受视图


  • 有人能帮我创建这种灵活的方法吗?

    是的,我想说你让事情变得有点复杂了。虽然我可能没有很好地理解您的描述,无法准确地知道如何回应,但我可以告诉您我是如何做到的:

    首先,整个网站通过模板运行,因此页眉和页脚是容器文件,网站内需要的所有视图都呈现为页面类型视图,如文章页面、图库页面等。组件以字符串形式加载并传递给视图:

    $content['sidebar'] = $this->load->view('components/sidebar', $data, true);
    
    最后一个true表示渲染为字符串

    本质上,这意味着页面视图基本上是html,php呼应出必要的元素。没有视图调用其他视图,这就是我阅读示例的方式

    CI逐步加载视图,因此控制器可以这样输出:

    $this->load->view('header', $header_data);
    
    $view_data['sidebar'] = $this->load->view('components/sidebar', $sidebar_data, true);
    $this->load->view('content', $view_data);
    
    $this->load->view('footer', $footer_data);
    
    在内容视图中,按如下方式处理侧栏:

    <?php if(isset($sidebar)): ?>
    <nav>
        <?php echo $sidebar; ?>
    </nav>
    <?php endif; ?>
    
    
    
    并且,假设您为每个视图填充这些数组,它将呈现页眉、内容和页脚。如果有侧边栏,也可以渲染侧边栏


    因此,结合所有内容,我基本上是说,您可以在控制器中逐步加载分区,将子视图作为字符串传递给任何有意义的分区。这样,视图就可以在它所属的控制器中控制,而不是在视图文件本身中控制。根据我的经验,我从来没有写过一个如此复杂的网站,如果网站规划得好的话,这个结构就不太合适。

    是的,我想说你让事情变得有点复杂。虽然我可能没有很好地理解您的描述,无法准确地知道如何回应,但我可以告诉您我是如何做到的:

    首先,整个网站通过模板运行,因此页眉和页脚是容器文件,网站内需要的所有视图都呈现为页面类型视图,如文章页面、图库页面等。组件以字符串形式加载并传递给视图:

    $content['sidebar'] = $this->load->view('components/sidebar', $data, true);
    
    最后一个true表示渲染为字符串

    本质上,这意味着页面视图基本上是html,php呼应出必要的元素。没有视图调用其他视图,这就是我阅读示例的方式

    CI逐步加载视图,因此控制器可以这样输出:

    $this->load->view('header', $header_data);
    
    $view_data['sidebar'] = $this->load->view('components/sidebar', $sidebar_data, true);
    $this->load->view('content', $view_data);
    
    $this->load->view('footer', $footer_data);
    
    在内容视图中,按如下方式处理侧栏:

    <?php if(isset($sidebar)): ?>
    <nav>
        <?php echo $sidebar; ?>
    </nav>
    <?php endif; ?>
    
    
    
    并且,假设您为每个视图填充这些数组,它将呈现页眉、内容和页脚。如果有侧边栏,也可以渲染侧边栏


    因此,结合所有内容,我基本上是说,您可以在控制器中逐步加载分区,将子视图作为字符串传递给任何有意义的分区。这样,视图就可以在它所属的控制器中控制,而不是在视图文件本身中控制。根据我的经验,我没有写过一个如此复杂的网站,如果网站规划得好,这个结构就不完全合适。

    谢谢!你说得对,我把事情弄得比我应该做的复杂得多。我现在有了一个清晰的想法我应该怎么做…:D如果我需要在一个字段中附加多于一个区域,我可以使用您的第一行,并使用
    =
    为我需要的每一项添加:)如果您想要附加,即使是串联也可能过多。我会将任何添加作为它们自己的变量传递。不过话说回来,你可能有理由按照你说的去做。谢谢!你说得对,我把事情弄得比我应该做的复杂得多。我现在有了一个清晰的想法我应该怎么做…:D如果我需要在一个字段中附加多于一个区域,我可以使用您的第一行,并使用
    =
    为我需要的每一项添加:)如果您想要附加,即使是串联也可能过多。我会将任何添加作为它们自己的变量传递。但话说回来,你可能有理由按照你说的去做。