2015-11-16 105 views
0

我正在嘗試重寫Prestashop中的模塊。我已經成功地重寫了模塊的模板,但是我無法成功覆蓋模塊的控制器。覆蓋Prestashop模塊控制器:放置php文件的位置?

應該在哪裏放置新的控制器類文件?

我曾嘗試以下的位置,但他們不增加新的行爲(改變任何東西):

〜/重寫/模塊/ blockwishlist /控制器/正面/ mywishlist.php
〜/主題/ MY_THEME /模塊/ blockwishlist /控制器/正面/ mywishlist.php

據我previous question我可以通過編輯核心類(通過U /謝爾蓋·P好心建議)做,但我肯定有做一個標準的方法這不涉及編輯核心c lasses?

僅供參考;這裏是mywishlist.php內容:

<?php 

if (!defined('_CAN_LOAD_FILES_')) 
    exit; 

//class BlockWishListMyWishListModuleFrontController extends BlockWishListMyWishListModuleFrontControllerCore // extends ModuleFrontController 
class BlockWishListMyWishListModuleFrontControllerOverride extends BlockWishListMyWishListModuleFrontController 
{ 

    public function __construct() 
    { 
     parent::__construct(); 
    } 

    /** 
    * Assign wishlist template 
    */ 
    public function assign() 
    { 
     $errors = array(); 

     .... 

     $this->setTemplate('mywishlist.tpl'); 
    } 

} 

編輯:我已經不能夠覆蓋ModuleFrontController類可能的解決方法。目標是在「我的願望清單」頁面添加一個「導出爲CSV」按鈕,點擊該按鈕後,服務器將生成一個包含該願望清單中所有產品的CSV文件。之前,我做了所有的工作,你能對這個是否有可能提供建議......在模板文件

  • 將掛鉤,將調用自定義掛鉤,並鏈接到自定義模塊{hook h='displayExportToCsvColumn' mod='myCustomModule'}
  • 創建自定義註冊新鉤子的模塊具有呈現表列和按鈕的方法,並具有生成CSV文件的方法。
  • 大問題:你可以有一個模塊內的模塊?我正在編輯的模板文件位於模塊BlockWishlist〜/ themes/MY_THEME/modules/blockwishlist/controllers/front/mywishlist.php)內,然後我的鉤子將調用我的自定義模塊。這可能嗎?
+0

它可能取決於你有什麼PS版本。一些覆蓋只在最近的版本中添加。 – gskema

+0

@gskema感謝您的評論。我有版本1.6.1.2。控制器文件應該放在這個版本的PS中? –

回答

1

據我所知,目前無法覆蓋ModuleFrontController(抱歉說)。線索在於內Dispatcher::dispatch()

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; 

它只檢查/modules/?/controllers/目錄。您無法覆蓋ModuleFrontController課程,但如果您足夠聰明,則可以覆蓋Dispatcher課程並使其掃描覆蓋ModuleFrontController

通常有一種方法來改變你想要的東西與鉤子,最糟糕的情況 - 通過鉤子和改變內容注入JavaScript。

+0

感謝您的回答。我可以使用鉤子實現以下功能...我想要做的是在wishlist表中添加一個新列。此欄中有一個按鈕「導出爲CSV」。所以我需要回發到PHP文件來生成csv文件。鉤在這裏是一個選項? –

+0

我很抱歉地說我沒有太多wishlist模塊的經驗。如果你的意思是HTML表格中的一列,那麼是的,你當然可以用鉤子來做,通過在'HookCore :: exec'中執行'error_log($ hook_name)'來檢查鉤子是否執行,選擇一個鉤子,如果'瞄準一個特定的頁面。爲了生成CSV,您可能需要調用您自己的PHP腳本 – gskema

相關問題