CodeIgniter模板解析器将MY_Parser扩展为自动加载/解析页眉页脚

时间:2018-03-20 22:37:36

标签: php codeigniter templates parameters controller

我的模板解析器看起来像这样(p / s。' /&#39 ;.是为了便于阅读):

$this->parser->parse($this->settings['theme'].'/'.'header', $data);
$this->parser->parse($this->settings['theme'].'/'.'register', $data);
$this->parser->parse($this->settings['theme'].'/'.'footer', $data);

我不想每次都在我的控制器功能中声明$this->parser->parse($this->settings['theme'].'/'.'header', $data);$this->parser->parse($this->settings['theme'].'/'.'footer', $data);

如何扩展MY_Parser.php以便我可以像这样使用它:

$this->parser->parse($this->settings['theme'].'/'.'register', $data);会自动在register.phpheader.php之间加入footer.php

这样做的好处是节省了2行,如果我有20个功能,我可以节省40行。

2 个答案:

答案 0 :(得分:1)

只需创建一个函数(可以是帮助器,库扩展或模型):

function tpl($view, $data) {
    $this->parser->parse($this->settings['theme'].'/'.'header', $data);
    $this->parser->parse($this->settings['theme'].'/'.$view, $data);
    $this->parser->parse($this->settings['theme'].'/'.'footer', $data);
}

如果您愿意,可以扩展Parser并在库文件夹中创建MY_Parser并执行:

class MY_Parser extends CI_Parser {
    function tpl($view, $data) {
        $this->parse($this->settings['theme'].'/'.'header', $data);
        $this->parse($this->settings['theme'].'/'.$view, $data);
        $this->parse($this->settings['theme'].'/'.'footer', $data);
    }    
}

用法:

$this->parser->tpl($view, $data);

您可以使用$this->parser->parse()执行此操作,但在覆盖默认方法时需要更多代码,并且引入新方法同样容易。

<强>更新

使用MY_Parser方法,您可能必须通过$this->settings访问$this->CI->settings,从而根据此变量的来源,引用CI_Parser中的CI实例。

答案 1 :(得分:0)

在application / core文件夹中创建具有前缀类名称的类,并按照下面的代码进行操作。如果请求来自ajax,则$ this-&gt; input-&gt; is_ajax_request()将仅加载除页眉和页脚之外的视图。并且在每个控制器中,您需要扩展YOUR-PREFIX_Controller而不是CI_Controller

<?php
if (!defined('BASEPATH'))
    exit('No direct script access allowed');

class YOUR-PREFIX_Controller extends CI_Controller {

    protected $header_data;
    protected $footer_data;
    protected $header_view;
    protected $footer_view;

    public function __construct() {
        parent::__construct();
        $this->header_view = 'path-to-header';
        $this->footer_view = 'path-to-footer';
    }

    public function _output($output) {
        if ($this->input->is_ajax_request()) {
            echo ($output);
        } else {
            echo $this->load->view($this->header_view, $this->header_data, true);
            echo ($output);
            echo $this->load->view($this->footer_view, $this->footer_data, true);
        }

    }

}
?>