2017-10-11 75 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