【问题标题】:CodeIgniter Template Parser Extends MY_Parser To Auto Load/Parse Header FooterCodeIgniter 模板解析器将 MY_Parser 扩展为自动加载/解析页眉页脚
【发布时间】:2018-03-20 22:37:36
【问题描述】:

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

$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); 将在我的header.phpfooter.php 之间自动包含register.php

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

【问题讨论】:

    标签: php codeigniter templates parameters controller


    【解决方案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->CI->settings 访问$this->settings,从而根据该变量的来源来引用CI_Parser 中的CI 实例。

    【讨论】:

    • 谢谢,这正是我想要实现的。现在,我在 MY_Controller(它扩展了 CI_Controller)中创建了一个函数 $this->render('register');,其中 register 是要包含的文件,并且 render(); 函数自动包含要解析的页眉和页脚 + 数据。这比扩展 CI_Parser 更好吗?
    • 我倾向于只在控制器中保留设置逻辑和变量。我认为扩展解析器很好。
    【解决方案2】:

    在 application/core 文件夹中使用您的前缀类名称的名称创建类,并遵循以下代码。如果请求来自 ajax,$this->input->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);
            }
    
        }
    
    }
    ?>
    

    【讨论】:

    • 我目前正在使用模板解析器来解析{title}。为什么$this-&gt;parser-&gt;parse 上没有任何参考,而这种方法使用的是 ajax?我如何调用你的函数?谢谢!
    • 如果您只想通过 ajax 在弹出窗口中加载视图,这将仅加载视图文件,这将忽略页眉和页脚文件。您只需要在每个控制器中扩展此类而不是 CI_Controller
    • 将 YOUR-PREFIX_ 替换为您在 application/config/config.php 中定义的 subclass_prefix
    • 我认为这实际上不是我想要的,但我可以尝试将 $this-&gt;load-&gt;view 更改为 $this-&gt;parser-&gt;parse 以查看数据是否可解析。我明白了,现在……
    • 如果这不起作用请发表评论,我将删除此答案,以免其他人感到困惑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-19
    • 2012-12-30
    • 2014-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多