在CI模板加载器类中加载一个或多个视图

时间:2014-02-06 21:30:06

标签: php codeigniter codeigniter-2

参考这篇文章的最佳答案:

Header and footer in CodeIgniter

如果需要,您如何更新此类以支持多个视图?

e.g。有时在页眉和页脚模板之间加载两个或多个视图...

提前致谢:)

2 个答案:

答案 0 :(得分:1)

如果您希望每个视图都拥有自己的变量:

public function template($template_names = array(), $vars = array(), $return = FALSE)
{
    $content  = $this->view('templates/header', $vars, $return);
    foreach ($template_names as $template_name -> $template_vars)
    {
        $content .= $this->view($template_name, $template_vars, $return);
    }
    $content .= $this->view('templates/footer', $vars, $return);

    if ($return)
    {
        return $content;
    }
}

$this->load->template(array(
    'body' => $vars_for_body,
    'body2' => $vars_for_body2,
    'body3' => $vars_for_body3
), $headerfooter_vars);

答案 1 :(得分:1)

嗯,这是我尝试改进模板功能的功能:

class MY_Loader extends CI_Loader {
    public function template($template_name = array(), $vars = array(), $return = FALSE)
    {
        $content  = $this->view('templates/header', $vars, $return);

        if (is_array($template_name)) {
            foreach ($template_name as $view => $viewVar) {
                // Whether the view has different variables
                if (is_array($var) && ! is_numeric($view)) {
                    // Load the view with its own variables
                    $content .= $this->view($temp, $viewVar, $return);
                } else {
                    // Load the view whith the general variables $vars
                    // viewVar would be the view name in this case
                    $content .= $this->view($viewVar, $vars, $return);
                }  
            }
        } else {
            $content .= $this->view($template_name, $vars, $return);
        }

        $content .= $this->view('templates/footer', $vars, $return);

        if ($return)
        {
            return $content;
        }
    }
}

使用此功能,您可以使用以下格式加载视图:

$this->load->template(array(
    'first/view' => array('name' => 'value'),
    'second/view',
    'third/view'
), $generalData);

每个视图都有自己的变量。

在这种情况下,通过传递array('name' => 'value')作为变量来加载第一个视图。并且第二/第三视图加载了$generalData作为变量。

如果您需要在第一个视图中访问$generalData,可以使用+运算符将变量合并为:array('name' => 'value') + $generalData,反之亦然。