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

Posted

技术标签:

【中文标题】在 CI 模板加载器类中加载一个或多个视图【英文标题】:Load one or more views within a CI Template loader class 【发布时间】:2014-03-04 01:55:39 【问题描述】:

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

Header and footer in CodeIgniter

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

例如有时会在页眉和页脚模板之间加载两个或多个视图...

提前致谢:)

【问题讨论】:

变量呢?每个视图应该有一组不同的变量还是所有视图都有相同的变量? 如果这就是你的意思,他们可能有不同的变量,如果不是,对不起:) 【参考方案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);

【讨论】:

感谢您的回答 - 我几乎遇到了这样的事情 :) P.S 感谢 Hashem Qolami 也提供了解决方案。我最终选择了萨穆茨。 @Random 不客气,我尝试实现一个更复杂的算法。这为您提供了更好的功能。【参考方案2】:

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

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,反之亦然。

【讨论】:

以上是关于在 CI 模板加载器类中加载一个或多个视图的主要内容,如果未能解决你的问题,请参考以下文章

在一个单元格中加载多个 Xib 视图

在 Freemarker 模板中加载模板而不为模板加载设置目录或类

如何在codeigniter ci中加载javascript css文件

在 WPF 中加载的控件上显示焦点元素

Flex中加载的SWF文件的帧率不同?

在本机 IOS 应用程序中加载多个 Cordova 微应用程序