Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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 我能';似乎无法从codeigniter中的视图中加载视图_Php_Codeigniter - Fatal编程技术网

Php 我能';似乎无法从codeigniter中的视图中加载视图

Php 我能';似乎无法从codeigniter中的视图中加载视图,php,codeigniter,Php,Codeigniter,我正在尝试为我在CodeIgniter中的应用程序开发一个小部件系统。我有一个模板列的数据库表,可以循环使用。在该循环中,我然后循环该列的一个小部件表。加载小部件的DB信息后,我需要确定为当前小部件加载了哪个文件,并将其添加为小部件的主体。加载的视图文件存储在小部件数组的body变量中 问题是小部件内容在加载主视图文件之前显示。小部件的内容需要在主视图文件中。我做错了什么 我的控制器: $widget_types = $this->widget->type_array();

我正在尝试为我在CodeIgniter中的应用程序开发一个小部件系统。我有一个模板列的数据库表,可以循环使用。在该循环中,我然后循环该列的一个小部件表。加载小部件的DB信息后,我需要确定为当前小部件加载了哪个文件,并将其添加为小部件的主体。加载的视图文件存储在小部件数组的body变量中

问题是小部件内容在加载主视图文件之前显示。小部件的内容需要在主视图文件中。我做错了什么

我的控制器:

$widget_types = $this->widget->type_array();

        foreach($columns as $column){

            $column_results[$column['column_id']] = $column;

            $widgets = $this->widget->retrieve($column['column_id']);

          foreach($widgets as $widget){

            $widgets[$widget['id']]['body'] = $this->load->view('widgets/'.$widget_types[$widget['type']]['view'], array('widget' => $widget));

          }

            $column_results[$column['column_id']]['widgets'] = $widgets;


        }

        $data['column_results'] = $column_results;

        $this->load->view('index_body', $data);
小部件模型:

<?php

class Widget extends MY_Model {

    var $info = array();
    var $error = NULL;

    function __construct(){
        parent::__construct();
        $this->error = NULL;
    }

    function get_info($widget_id){

        $this->db->from('template_widgets')->where('widget_id', $widget_id)->limit(1);
        if($query = $this->db->get()){

            if($query->num_rows() > 0){

                $widget = $query->row_array();

                $info = array(
                    'id' => $widget['widget_id'],
                    'title' => $widget['title'],
                    'column_id' => $widget['column_id'],
                    'position' => $widget['position'],
                    'options' => unserialize($widget['options']),
                    'type' => $widget['type']
                );

                $this->info = $info;

            }

        }

    }

    function retrieve($column_id){

        $widget_results = array();

        $this->db->from('template_widgets')->where('column_id', $column_id)->order_by('position', 'asc');
        if($query = $this->db->get()){

            if($query->num_rows() > 0){

                foreach($query->result_array() as $widget){

                    if(empty($widget_results[$widget['widget_id']])){

                        $this->get_info($widget['widget_id']);
                        if($this->error == NULL){

                            $widget_results[$widget['widget_id']] = $this->info;

                        }

                    }

                }

            }

        }

        return $widget_results;

    }

    function type_array($type = ''){

        $widget_types = array(
            0 => array(
                'name' => 'Category Feed',
                'view' => 'category_feed'
            ),
            1 => array(
                'name' => 'Members Feed',
                'view' => 'members_feed'
            ),
            2 => array(
                'name' => 'Events Feed',
                'view' => 'events_feed'
            ),
            3 => array(
                'name' => 'Category List',
                'view' => 'category_list'
            ),
            4 => array(
                'name' => 'Testimonials',
                'view' => 'Testimonials'
            ),
            5 => array(
                'name' => 'Events Calendar',
                'view' => 'events_calendar'
            ),
            6 => array(
                'name' => 'Content',
                'view' => 'content'
            ),
            7 => array(
                'name' => 'Statistics Feed',
                'view' => 'statistics_feed'
            )
        );

        return ($type == '') ? $widget_types : $widget_types[(int) $type];

    }

}

因此,我没有将视图加载到变量中,而是使用输出缓冲区,然后将视图加载到ob内容中,就像这样

ob_start();
$this->load->view('inner_view_file', array());
$output = ob_get_contents();
ob_end_clean();

$data['inner_view'] = $output;
$this->load->view('outer_view_file', $data);

这很好用。有点不整洁,但完成了任务。

您使用输出缓冲区提供的答案是codeigniter在后台是如何完成的。唯一的区别是,您重复的过程可能会影响性能。最简单的解决方案是使用以下方法:

$data['inner_view'] = $this->load->view('inner_view_file', array(), TRUE);
作为第三个参数传递的
TRUE
告诉codeigniter您不想输出视图文件,并且希望以字符串形式返回

NB

在视图文件中,您应该能够访问
$this
,而不是使用
$CI=&get_instance()


最后,尽管您创建小部件的方式没有太大问题,但将HMVC与codeigniter结合使用可能值得一试。

Ah ok。我从未意识到视图加载器的第三个参数甚至存在。。。哈哈,谢谢你的提示。
ob_start();
$this->load->view('inner_view_file', array());
$output = ob_get_contents();
ob_end_clean();

$data['inner_view'] = $output;
$this->load->view('outer_view_file', $data);
$data['inner_view'] = $this->load->view('inner_view_file', array(), TRUE);