2015-08-07 4 views
1

Я пытаюсь добавить настраиваемое поле в группы клиентов в Prestashop 1.6, редактируемые из области администрирования. Я пробовал различные решения, но подход, который работал лучше всего, описан в этом руководстве: http://nemops.com/extending-prestashop-objects/. Я сделал то же самое, прежде чем читать, но, похоже, этот парень заработал так.Добавить новое поле в группу клиентов в Prestashop

Что я сделал, в основном, добавить новый столбец в таблице 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), 
    ), 
); 

ключ - мое дополнение.

Затем я отредактировал файл controllers/admin/AdminGroupsController.php, чтобы добавить новое поле в область администратора, чтобы оно было доступно для редактирования. В методе renderForm() я добавил новый дочерний элемент 'input' массива $this->fields_form. Моя модификация заключается в следующем:

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, тем не менее, отправляется правильно, и мои данные прошел просто отлично, как и остальные поля.

Есть ли что-то, что мне не хватает здесь? Я думаю, что это все необходимые шаги для добавления нового поля в любого объекта (кроме продуктов, которые работают по-разному).

Является ли мой код неправильным в какой-то момент? Или, как я могу добавить новое поле в группы клиентов?

Большое спасибо :)

ответ

2

Что вам не хватает, чтобы добавить свойство $provinces в classes/Group.php, смотрите пример ниже:

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(

Кроме того, вы можете найти ниже несколько способов оптимизации ваш код:

  • Используйте Integer как значение для провинций, если это возможно, это безопаснее и проще в использовании. Вам необходимо будет обновить свой код (определение, база данных, форма).
  • Не изменяйте напрямую файлы ядра PrestaShop. Это предотвратит дальнейшее обновление PrestaShop и его следует избегать. Вы можете легко переопределить поведение ядра, используя папку override в корне сайта PrestaShop, затем controllers, затем admin. Там создайте новый файл AdminGroupsController.php, так как это то, что вы хотите отредактировать.В этом файле вы можете переопределить поведение AdminGroupsController, создав новый класс; в вашем случае:

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

Затем копировать/вставить и редактировать методы, необходимые для редактирования. Это также место, где вы должны добавить свойство $provinces.

Не забудьте удалить файл class_index.php в папку cache, расположенную в корне вашего сайта PrestaShop после сохранения изменений.

+0

Добавление собственности решила проблему, спасибо. Поле должно быть строкой, так как в этом поле я сохраню кучу данных. Опубликованный код был упрощенным примером конечного результата. Благодарим также за инструкции по переопределению поведения ядра! – Berna

Смежные вопросы