扩展Prestashop 1.7的正确方法

扩展Prestashop 1.7的正确方法,prestashop,Prestashop,在PS 1.7文档中,我们可以多次阅读不建议使用PS覆盖系统的内容,即不允许在PS市场中发布模块 我们只需要使用钩子,并扩展现有的类,我明白为什么 但是如何在自定义主题中使用扩展类而不是核心类呢 让我们举一个例子: 我想为类别添加一个自定义字段 在一个模块中,我扩展了CategoryCore类: class Category extend CategoryCore{ private $bottom_description ... } 然后,为了在类别的管理页面中添加字段,

在PS 1.7文档中,我们可以多次阅读不建议使用PS覆盖系统的内容,即不允许在PS市场中发布模块

我们只需要使用钩子,并扩展现有的类,我明白为什么

但是如何在自定义主题中使用扩展类而不是核心类呢

让我们举一个例子:

我想为类别添加一个自定义字段

在一个模块中,我扩展了CategoryCore类:

class Category extend CategoryCore{

     private $bottom_description
     ...
}
然后,为了在类别的管理页面中添加字段,我可以使用一些钩子,比如displayBackOfficeCategory和actionBeforeAddCategory

但我不确定前面的说法:新变量必须在一些主题模板文件中可以访问

在我的自定义主题中,category.tpl模板中,$category->bottom\u description未定义

通过重写CategoryController来解决这个问题很容易,但是如何仅使用钩子来解决这个问题呢

我找到的唯一方法是使用actionFrontControllerSetMedia挂钩,如下所示:

function HookActionFrontControllerSetMedia(){
      // get my custom Category object base on url
      this->context->smarty->assign(["category_bottom_description"=>$category->buttom_description]);
   }
这看起来很棘手,我的新字段在其他上下文中仍然无法访问

那么,在我的自定义文件中使用此属性的正确方法是什么


理想情况下,每次我们找到一个category对象时,新属性都应该可用,如:$category->bottom\u description

不要忘记在category类中定义一个新字段,因为在前面,您没有类实例,而是在
ObjectPresenter
类中转换的数组。所以请沿着这条路走。扩展您的
类别
类并添加所有必要的定义

class Category extends CategoryCore
{
    public $bottom_description;

    public function __construct($idCategory = null, $idLang = null, $idShop = null)
    {
        Category::$definition['fields']['bottom_description'] = array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml');
        $this->bottom_description = 'bottom_description'; // just to add demo data
        parent::__construct($idCategory, $idLang, $idShop);
    }
}

然后字段
bottom\u description
将在
category.tpl
中可用,但类似于数组{$category.bottom\u description}。希望对您有所帮助。

我不知道,谢谢!但在核心表数据库中添加字段不是问题吗?(例如更新核心时)创建一个单独的表不是更好吗?这部分帮助:如何向主题tpl注入数据,如果我在其他任何地方需要它,就在某个主题tpl中钩住它?如果我完全理解了,我将尝试回答。我认为最好使用您自己的表,而不是修改默认值(我自己的意见),但正是在这个新类中,您可以将新功能与旧类别的功能关联起来,然后在{$category}变量可用的每个页面中都可以得到它。此外,您还可以在扩展默认类方法add、update、delete的过程中在此类中添加/更新/删除它。要了解更多信息,请查看类ObjectModel,它是Category类的基类。希望我能回答你的问题。是的,我的英语需要再提高一点。对不起。好的,我会朝这个方向看。感谢确定一下:您的示例不是覆盖?这只是模块中的一个扩展?”因为我不能让它工作…基本上,它不是一个覆盖,但它仍然有后果,你仍然不能扩展一个类两次。但是在这种方法中,您的模块将被允许通过管理面板安装它。因此,作为结论,我想说的是,没有一种安全的方法来进行重写,所有的方法都是绕过的,最好只在某些环境中使用它们。要使扩展正常工作,请使用include_once PS_module_DIR将新类文件包含在模块的主要类文件中您的_模块/路径_到_php_clas';