如果您曾经在OpenCart中进行过模块开发,则可能已经遇到了在每个控制器中声明了两个通用元素的情况。 您不认为如果可以在某个地方声明通用代码并根据需要将其提取会很好! 因此,在本文中,我们将讨论如何设置通用控制器代码并在各个模块中使用它们。
对于那些熟悉OpenCart模块开发的人来说,在控制器类的index方法中设置诸如header,footer和sidebar列之类的通用元素是一种例程。 尽管可以使用多种方法来集中通用代码,但我们将研究一种OpenCart方法来实现这一点!
我假设您正在使用最新版本的OpenCart,并且熟悉模块开发过程,因为我们将更加专注于概念而不是讨论基本代码。
设置通用控制器代码
继续并创建catalog/controller/preactiondemo
目录。 在该目录下创建具有以下内容的文件common.php
。
<?php
class ControllerPreactiondemoCommon extends Controller {
public function setup($args) {
// do the pre-processing here
$data['header'] = $this->load->controller('common/header');
$data['footer'] = $this->load->controller('common/footer');
$data['preaction_text'] = "I've been set by the 'setup' method from 'common' controller file.";
$args['controller']->$args['method']($data, FALSE);
}
}
相当容易直接理解! 它只是初始化$data
数组中的几个变量,除了setup
方法的最后一行。 我们将在后面再讨论,因为它将揭示$args
数组的秘密。
了解发货流程
在我们创建任何其他代码之前,我将向您简要介绍如何在OpenCart中进行调度。
每当用户访问OpenCart中的任何URL时,都会根据路由查询字符串变量实例化相应的操作对象。 这是index.php
的片段。
// Router
if (isset($request->get['route'])) {
$action = new Action($request->get['route']);
} else {
$action = new Action('common/home');
}
然后,调用dispatch
方法。
$controller->dispatch($action, new Action('error/not_found'));
它会调用位于system/engine/front.php
文件中定义的dispatch
方法。 在该方法中,您将找到一个片段,该片段将执行while循环,直到将$action
值设置为false。
while ($action) {
$action = $this->execute($action);
}
如您所见,它将调用同一文件中定义的execute方法,直到$action
计算为false为止。 这意味着,如果控制器的方法返回一个动作对象,则OpenCart将在继续操作之前执行该动作。 我们可以利用这一优势,并从动作本身内部调用另一个动作。 让我们看看如何做到这一点!
呼叫通用控制器并查看设置
现在,让我们在preactiondemo
目录下创建一个具有以下内容的preaction_demo.php
文件。
<?php
class ControllerPreactiondemoPreactionDemo extends Controller {
public function index($data=array(), $flag=TRUE) {
if ($flag) {
return new Action('preactiondemo/common/setup', array('controller' => $this, 'method'=>'index'));
}
if (file_exists(DIR_TEMPLATE . $this->config->get('config_template') . '/template/preactiondemo/preaction_demo.tpl')) {
$this->response->setOutput($this->load->view($this->config->get('config_template') . '/template/preactiondemo/preaction_demo.tpl', $data));
} else {
$this->response->setOutput($this->load->view('default/template/preactiondemo/preaction_demo.tpl', $data));
}
}
}
如果$flag
为true,我们将返回操作类的实例,并且正如我们刚刚看到的,如果调度过程接收到一个操作对象,它将继续执行该操作。 因此,在这种情况下,它将调用common
控制器的setup
方法。 回想一下我们在上一节中创建的common.php
文件。
需要注意的重要一点是,我们将array('controller' => $this, 'method'=>'index')
作为参数传递,该参数最终将传递给common
方法中setup
方法的第一个参数控制器。 初始化变量后,它将帮助我们返回preaction_demo
控制器的index
方法。
此外,在setup
方法中,我们定义了一些通用变量,例如标头,页脚等。最后,我们将控制权转移回原始控制器,使用以下语句从该位置调用setup
方法。
$args['controller']->$args['method']($data, FALSE);
当然,我们需要通过$data
将在setup
方法中初始化的变量传递给原始控制器,以便可以在此处使用它,这是本文的主要目的。 它作为上述方法调用的第一个参数传递。 第二个参数非常重要,因为它将被初始化为$flag
变量。 我们故意这样做是为了避免无限循环。
最后,让我们继续,使用以下代码在catalog/view/theme/default/template/preactiondemo/preaction_demo.tpl
设置我们的视图文件。
<?php echo $header; ?>
<div class="container">
<div class="row">
<?php echo $preaction_text; ?>
</div>
</div>
<?php echo $footer; ?>
既然我们已经完成设置,请继续并在浏览器中打开URL http://youropencartstoreurl/index.php?route = preactiondemo / preaction_demo 。 您应该看到消息“我已经由'common'控制器文件中的'setup'方法设置了”。 在那个页面!
因此,通过这种方式,您可以在一个地方设置通用代码,然后从其他控制器调用该动作。 当然,它将避免代码重复,并且更容易更改模块之间通用的代码。
结论
今天,您已经在OpenCart中学习了一个很酷的技巧:如何从动作中调用动作! 当然,还有其他方法可以实现这一目标,但这是我最近想到的,并认为我应该与您分享并获得您的反馈!
翻译自: https://code.tutsplus.com/tutorials/set-up-common-controller-code-in-opencart--cms-25208