【问题标题】:Override and use front controller features in a prestashop module [1.6.x.x]在 prestashop 模块中覆盖和使用前端控制器功能 [1.6.x.x]
【发布时间】:2016-05-27 14:26:32
【问题描述】:

我想编辑和添加功能到 prestashop 商店定位器页面。 Prestashop 的文档不是很清楚,我想知道是否可以在自定义模块中实现控制器。 我想创建一个能够扩展 StoreFrontController 及其功能的模块,而无需从头开始。 可能吗 ?你有一些文件给我吗?

初学者, 最好的。

【问题讨论】:

  • 对不起,我的 prestashop 版本是 1.6.1.5。
  • 您想添加什么样的功能?
  • 如果您想添加更多信息,过程将不同于您想更改数据。
  • 我想添加两个功能: * 第一个也是最重要的,获取所有商店信息,为每个商店创建一个专用页面。例如:您找到最近的商店,然后可以单击名称以重定向到 cms 页面。 * 第二个功能,为商店分配一个或多个类别。示例:搜索最近销售该类别产品的商店是什么

标签: module controller extends prestashop-1.6


【解决方案1】:

由于您有许多要求,您将不得不覆盖 StoresController.php 类。

您的模块文件夹应如下所示:

/mymodule
    /mymodule.php
    /config.xml
    /override
         /controllers
              /front
                   StoresController.php
    /views
         /templates
              /front
                   stores.tpl

StoresController.php 中,您必须覆盖initContent()

<?php

class StoresController extends StoresControllerCore
{

    /**
     * Assign template vars related to page content
     * @see FrontController::initContent()
     */
    public function initContent()
    {
        parent::initContent();

        // here add any smarty variables you want

        $this->setTemplate(_PS_MODULE_DIR_.'mymodule/views/templates/front/stores.tpl');
    }
}

现在您可以在此控制器中添加任意数量的变量,并在您自己的模块中自定义其模板。


我们在模块中创建了一个覆盖,它只会在安装时被解析一次。如果您的模块已安装,则必须将其卸载并重新安装。然后您的覆盖文件将被复制到根目录/override 文件夹中。

在您的模块覆盖中所做的任何更改都不会反映到根覆盖文件夹中。因此,每次您想要进行更改时,您都必须卸载并安装您的模块。

所以我建议您直接在根覆盖文件夹中进行所有更改,并在完成后将此文件复制回您的模块文件夹中。而如果你不想卸载你的模块并重新安装它来声明这个文件,你可以直接把它放在根覆盖文件夹中并删除文件/cache/class_index.php,这样Prestashop就知道添加了一个覆盖。

如果您有任何问题:)

【讨论】:

  • 感谢您的宝贵时间和建议。实在是太难理解了。我还有一个问题,我对 prestashop 不熟悉,所以我想了解一下。如果我在我的模块中覆盖这个控制器,它会正常工作吗?我的意思是,只有我的更改会修改控制器的行为,其余的会像我什么都没改变一样工作?!
  • 正常是​​什么意思?您的覆盖扩展了 Core StoresControllerCore。当 Prestashop 加载 StoresController 时,它会首先查找覆盖并找到你的。然后它会像处理任何 Controller 类一样处理它。
  • “我的意思是,只有我的更改会修改控制器的行为,其余的会像我什么都没改变一样工作?!”而已。您可以在覆盖中按照您想要的方式更改控制器,但您未更改的任何方法都将正常运行。
  • 在我的例子中,我只声明了一个新的模板文件。因此,不是在您的主题文件夹中加载默认的“stores.tpl”,而是在您的模块文件夹中加载stores.tpl。因此,您需要复制默认的 stores.tpl 并在您的模块中对其进行修改。稍后如果您想与其他商店共享此模块,他们将能够在/themes/thetheme/modules/your_module/stores.tpl 中更改您的模板文件。默认的/themes/thetheme/stores.tpl 将永远不会被再次使用。
  • 如果您有任何其他问题,请随时将其发布在标记为 Prestashop 的新问题中,我很乐意再次为您提供帮助。
【解决方案2】:

您可以从覆盖前端控制器开始,例如

`"/modules/mymodule/override/controllers/front/StoresController.php" and in this fine add class "class StoresControllerCore extends FrontController {
public function initContent()
    {
        parent::initContent();
//here do whatever you like
}
}"

尽管您必须了解编码才能继续进行。

【讨论】:

  • 谢谢! Florian 给了我一个解决方案,效果很好!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-02
  • 2017-03-28
  • 1970-01-01
  • 2016-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多