在prestshop的Customer Group中添加新字段


Add new field to Customer Group in Prestashop

我试图在Prestashop 1.6中添加一个自定义字段,可从管理区域编辑。我尝试了各种解决方案,但最有效的方法是本指南中描述的方法:http://nemops.com/extending-prestashop-objects/。在阅读它之前,我也做过同样的工作,但似乎这个家伙是这样做的。

我所做的基本上是在ps_group表中添加一个新列,使其不为空(新字段对所有组都是强制性的)。

然后,在文件classes/Group.php中,我编辑了$definition数组。(我知道我不应该编辑核心。一旦我检查它是否有效,我将具体化所有这些)。

public static $definition = array(
    'table' => 'group',
    'primary' => 'id_group',
    'multilang' => true,
    'fields' => array(
        'reduction' =>              array('type' => self::TYPE_FLOAT, 'validate' => 'isFloat'),
        'price_display_method' =>   array('type' => self::TYPE_INT, 'validate' => 'isPriceDisplayMethod', 'required' => true),
        'show_prices' =>            array('type' => self::TYPE_BOOL, 'validate' => 'isBool'),
        'date_add' =>               array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
        'date_upd' =>               array('type' => self::TYPE_DATE, 'validate' => 'isDate'),
        'provinces' =>              array('type' => self::TYPE_STRING, 'required' => true, 'size' => 200),
        // Lang fields
        'name' =>                   array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'required' => true, 'size' => 32),
    ),
);

'provinces'键是我添加的。

然后我编辑了文件controllers/admin/AdminGroupsController.php,在管理区域添加了新的字段,所以它是可编辑的。在方法renderForm()中,我添加了$this->fields_form数组的'input'的新子元素。我的修改如下:

array(
    'type' => 'select',
    'label' => $this->l('Provinces'),
    'name' => 'provinces',
    'required' => 'true',
    'col' => 3,
    'hint' => $this->l('The provinces belonging to this customer group.'),
    'options' => array(
        'query' => array(
            array(
                'id_method' => '1',
                'name' => 'Option 1'
            ),
            array(
                'id_method' => '2',
                'name' => 'Option 2'
            )
        ),
        'id' => 'id_method',
        'name' => 'name'
    )
),

我明白,同样地命名数据库列和字段将导致该字段中的值被保存,就像其他字段一样。但这并没有发生。当我编辑组,做一些更改并保存它时,在窗口顶部的感叹号附近出现以下错误:

Property Group->provinces is empty

然而,POST表单被正确发送,并且我的数据被正常传递,就像其他字段一样。

我在这里错过了什么吗?我认为这些都是向任何对象添加新字段的必要步骤(product除外,其工作方式不同)。

我的代码在某些地方是错误的吗?否则,如何向客户组添加新字段?

您缺少的是在classes/Group.php中添加属性$provinces,参见下面的示例:

class GroupCore extends ObjectModel
{
    public $id;
    /** @var string Lastname */
    public $name;
    /** @var string Reduction */
    public $reduction;
    /** @var int Price display method (tax inc/tax exc) */
    public $price_display_method;
    /** @var bool Show prices */
    public $show_prices = 1;
    /** @var string Object creation date */
    public $date_add;
    /** @var string Object last modification date */
    public $date_upd;
    /** @var string Province */
    public $provinces;
    /**
     * @see ObjectModel::$definition
     */
    public static $definition = array(

此外,您可以找到以下几种优化代码的方法:

  • 如果可能的话,使用整数作为省份值,这样更安全,更容易使用。您需要相应地更新代码(定义、数据库、表单)。
  • 请勿直接修改PrestaShop核心文件。这将阻止PrestaShop的任何进一步更新,应该避免。您可以通过使用PrestaShop站点根目录下的override文件夹,然后是controllers,然后是admin,轻松地覆盖核心行为。在那里,创建一个新文件AdminGroupsController.php,因为这是你想要编辑的。在这个文件中,您可以通过创建一个新类来覆盖AdminGroupsController行为;在你的例子中:

     class AdminGroupsController extends AdminGroupsControllerCore
     {
         /* Your code here */
     }
    

然后复制/粘贴并编辑需要编辑的方法。这也是您应该添加属性$provinces的地方。

保存修改后,不要忘记删除PrestaShop站点根目录下cache文件夹中的class_index.php文件。