覆盖Prestashop模块更改不可见

时间:2015-11-15 23:18:50

标签: php smarty prestashop

我试图覆盖Prestashop中的模块,但是没有出现更改。

我已经覆盖了模板文件和控制器,因此我添加了以下文件:

  

\倍率\模块\ blockwishlist \视图\模板\前\ mywishlist.tpl
  \倍率\模块\ blockwishlist \控制器\前\ mywishlist.php

这些是非常简单的更改,我将另一列添加到包含按钮的表中。单击该按钮时,控制器将生成CSV文件。

知道为什么这些变化没有显示出来?

注意:我已打开“强制编译”并转为缓存。

修改: 重新覆盖控制器是:

class BlockWishListMyWishListModuleFrontController extends BlockWishListMyWishListModuleFrontControllerCore // extends ModuleFrontController

class BlockWishListMyWishListModuleFrontControllerOverride extends BlockWishListMyWishListModuleFrontController

2 个答案:

答案 0 :(得分:1)

好吧,我做了一些代码研究(也许是最简单的方式,不确定),所以:

我们在代码Dispatcher中的

// Dispatch module controller for front office
            case self::FC_MODULE :
                $module_name = Validate::isModuleName(Tools::getValue('module')) ? Tools::getValue('module') : '';
                $module = Module::getInstanceByName($module_name);
                $controller_class = 'PageNotFoundController';
                if (Validate::isLoadedObject($module) && $module->active) {
                    $controllers = Dispatcher::getControllers(_PS_MODULE_DIR_.$module_name.'/controllers/front/');
                    if (isset($controllers[strtolower($this->controller)])) {
                        include_once(_PS_MODULE_DIR_.$module_name.'/controllers/front/'.$this->controller.'.php');
                        $controller_class = $module_name.$this->controller.'ModuleFrontController';
                    }
                }
                $params_hook_action_dispatcher = array('controller_type' => self::FC_FRONT, 'controller_class' => $controller_class, 'is_module' => 1);
            break;

我们看到控制器在没有覆盖的情况下加载,但是从代码下面的另一端我们看到钩子执行:

// Loading controller
            $controller = Controller::getController($controller_class);

            // Execute hook dispatcher
            if (isset($params_hook_action_dispatcher)) {
                Hook::exec('actionDispatcher', $params_hook_action_dispatcher);
            }

所以一个可能的解决方案(没有覆盖核心类):

  1. how to override module并希望您拥有核心版本> = 1.6.0.11

  2. {li}

    blockwishlist.php方法的install()方法中添加

    this->registerHook('actionDispatcher')

    使用其他钩子进行调整,因此它看起来像... !this->registerHook('actionDispatcher') || ...,因为默认情况下此挂钩未注册,我们无法将模块放在那里。

    1. 创建方法(不能在这里美化代码)

      public function hookActionDispatcher($params) { if ('blockwishlistmywishlistModuleFrontController' == $params['controller_class']) { include_once(_PS_OVERRIDE_DIR_ . 'modules/' . $this->name . '/controllers/front/mywishlist.php'); $controller = Controller::getController('BlockWishListMyWishListModuleFrontControllerOverride'); } }

    2. 您已通过此路径获得override/modules/blockwishlist/controllers/front/mywishlist.php个文件

    3. 重新安装模块。

    4. 它有效!

    5. 更多关于覆盖docs

      中的某些行为

答案 1 :(得分:0)

原来,要覆盖您不放置文件的模块:

  

〜/重写/模块/ MODULE_NAME

而是将其放入:

  

〜/主题/ MY_THEME /模块/ MODULE_NAME

现在变化正在展现出来。

有人知道模块是否/何时自动更新,我的更改是否会丢失/覆盖?