incool 发表于 2011-12-24 10:36:20

关于ci是如何加载视图的?


protected function _ci_load($_ci_data)
        {
                // Set the default data variables
                foreach (array('_ci_view', '_ci_vars', '_ci_path', '_ci_return') as $_ci_val)
                {
                        $$_ci_val = ( ! isset($_ci_data[$_ci_val])) ? FALSE : $_ci_data[$_ci_val];
                }
               
                $file_exists = FALSE;

                // Set the path to the requested file
                if ($_ci_path != '')
                {
                        $_ci_x = explode('/', $_ci_path);
                        $_ci_file = end($_ci_x);
                }
                else
                {
                        $_ci_ext = pathinfo($_ci_view, PATHINFO_EXTENSION);
                        $_ci_file = ($_ci_ext == '') ? $_ci_view.'.php' : $_ci_view;

                        foreach ($this->_ci_view_paths as $view_file => $cascade)
                        {
                                if (file_exists($view_file.$_ci_file))
                                {
                                        $_ci_path = $view_file.$_ci_file;
                                        $file_exists = TRUE;
                                        break;
                                }
                               
                                if ( ! $cascade)
                                {
                                        break;
                                }                               
                        }
                }

                if ( ! $file_exists && ! file_exists($_ci_path))
                {
                        show_error('Unable to load the requested file: '.$_ci_file);
                }

                // This allows anything loaded using $this->load (views, files, etc.)
                // to become accessible from within the Controller and Model functions.

                $_ci_CI =& get_instance();
                foreach (get_object_vars($_ci_CI) as $_ci_key => $_ci_var)
                {
                        if ( ! isset($this->$_ci_key))
                        {
                                $this->$_ci_key =& $_ci_CI->$_ci_key;
                        }
                }

                /*
               * Extract and cache variables
               *
               * You can either set variables using the dedicated $this->load_vars()
               * function or via the second parameter of this function. We'll merge
               * the two types and cache them so that views that are embedded within
               * other views can have access to these variables.
               */
                if (is_array($_ci_vars))
                {
                        $this->_ci_cached_vars = array_merge($this->_ci_cached_vars, $_ci_vars);
                }
                extract($this->_ci_cached_vars);

                /*
               * Buffer the output
               *
               * We buffer the output for two reasons:
               * 1. Speed. You get a significant speed boost.
               * 2. So that the final rendered template can be
               * post-processed by the output class.Why do we
               * need post processing?For one thing, in order to
               * show the elapsed page load time.Unless we
               * can intercept the content right before it's sent to
               * the browser and then stop the timer it won't be accurate.
               */
                ob_start();

                // If the PHP installation does not support short tags we'll
                // do a little string replacement, changing the short tags
                // to standard PHP echo statements.

                if ((bool) @ini_get('short_open_tag') === FALSE AND config_item('rewrite_short_tags') == TRUE)
                {
                        echo eval('?>'.preg_replace("/;*\s*\?>/", "; ?>", str_replace('<?=', '<?php echo ', file_get_contents($_ci_path))));
                }
                else
                {
                        include($_ci_path); // include() vs include_once() allows for multiple views with the same name
                }

                log_message('debug', 'File loaded: '.$_ci_path);

                // Return the file data if requested
                if ($_ci_return === TRUE)
                {
                        $buffer = ob_get_contents();
                        @ob_end_clean();
                        return $buffer;
                }

                /*
               * Flush the buffer... or buff the flusher?
               *
               * In order to permit views to be nested within
               * other views, we need to flush the content back out whenever
               * we are beyond the first level of output buffering so that
               * it can be seen and included properly by the first included
               * template and any subsequent ones. Oy!
               *
               */
                if (ob_get_level() > $this->_ci_ob_level + 1)
                {
                        ob_end_flush();
                }
                else
                {
                        $_ci_CI->output->append_output(ob_get_contents());
                        @ob_end_clean();
                }
        }

如果有短标签的话,就把它替换掉,然后include,已经include了,后面为啥还用ob_get_contents()?不是很明白,求高人指点。。。

Hex 发表于 2011-12-24 18:36:01

为什么要 ob_get_contents();
那就要看前面有一个 ob_start();
这个 include 是 include 到 output buffer 中,所以要 ob_get_contents();
要深刻理解 output buffer,很有用的东西。
页: [1]
查看完整版本: 关于ci是如何加载视图的?