在OpenCart中设置通用控制器代码

如果您曾经在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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值