2017-10-11 76 views
1

我的基於Prestashop的站點目前正在爲AdminOrdersController.php覆蓋,我已將它放置在覆蓋文件夾中。Prestashop 1.6創建模塊以顯示載體過濾器

從下面提供的鏈接中,可以很好地添加Carrier目前在Prestashop 1.6中不可用的Carrier過濾器。我已經嘗試過這個解決方案,並且工作完美。

參考:Adding carrier filter in Orders page.

不幸的是,對生產現場,我不得不核心文件,無法實現這樣的訪問權限。因此,我需要創建一個自定義模塊。請注意,我已經爲AdminOrdersController.php設置了覆蓋。我想點擊這個覆蓋並插入過濾器。

我設法創建了一個模塊,並嘗試在載體過濾器功能的mymodule /覆蓋/控制器/管理/ AdminOrdersController.php中放置覆蓋(使用URL中提供的代碼)。

沒有變化/效果,我很困惑。我是否需要生成或複製任何.tpl文件?

任何指導非常感謝。

謝謝。

回答

1

雖然鏈接問題的答案很好,但單獨模塊可以實現同樣的事情(不需要覆蓋)。

管理員控制器有一個用於列表字段修改的掛鉤。有兩個具有相同的名稱,但他們在params陣列中有不同的數據。

actionControllernameListingFieldsModifier在將過濾器應用於列表之前執行。

actionControllernameListingFieldsModifier在從數據庫中提取數據並呈現列表之前執行。

所以,你可以在你的模塊文件添加到這樣的現有控制器列表定義字段:

public function hookActionAdminOrdersListingFieldsModifier($params) { 
    if (isset($params['select'])) { 
     $params['select'] .= ', cr.name'; 
     $params['join'] .= ' LEFT JOIN `'._DB_PREFIX_.'carrier` cr ON (cr.`id_carrier` = a.`id_carrier`)'; 
    } 
    $params['fields']['carrier'] = array(
     'title' => $this->l('Carrier'), 
     'align' => 'text-center', 
     'filter_key' => 'cr!name' 
    ); 
} 

由於陣列中的數據被傳遞到$params數組引用您可以修改它們在你的鉤子和變化持續回到控制器。這將在列表末尾添加載體列。

這是prestashop的最佳實踐,試圖通過模塊鉤子來解決問題,並且只有在沒有辦法用鉤子來完成時,才用覆蓋來完成。

+0

已記錄。感謝您的建議。我已經設法根據您建議的鉤子編輯頁面。您的代碼返回錯誤,但無法執行。 – Enthu

+0

$ params ['select']。=' ,cr.name as carrier'; $ params ['join']。='LEFT JOIN''._DB_PREFIX _。'carrier' cr ON(cr.'id_carrier' = a。'id_carrier')'; $ params ['fields'] ['carrier'] = array( 'title'=> $ this-> l('Carrier'), 'align'=>'text-center' ); 這是返回一個錯誤:'where子句'中的未知列'載體' – Enthu

+0

它顯示了帶有載波過濾器的命令顯示,但是當我在搜索框中鍵入時會引發錯誤。 – Enthu

0

您是否刪除了/cache/class_index.php?如果你想讓你的覆蓋生效,你必須這樣做。 如果它仍然不起作用,也許你可以用你的新模塊在AdminOrderControllers方法中調用鉤子來處理。

+0

注意到,如果掛鉤無法爲我工作,我會嘗試此方法。最好不要重寫,但我一直在努力重寫一天。 :( – Enthu