我试图在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
文件。