Prestashop 1.6 – добавьте настраиваемое поле в категорию

Я хотел бы знать, как я могу добавить настраиваемое поле в категорию и как я могу редактировать в бэк-офисе (в поле описания). поле, которое я хотел бы добавить, – name description_long

Тип поля – TEXT

Я уже переписал свой фронт-офис, и мое поле хорошо отображается.

переопределить \ Classes \ category.php

 <?php class Category extends CategoryCore { public $description_long; /** * @see ObjectModel::$definition */ public static $definition = array( 'table' => 'category', 'primary' => 'id_category', 'multilang' => true, 'multilang_shop' => true, 'fields' => array( 'nleft' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 'nright' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 'level_depth' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 'active' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool', 'required' => true), 'id_parent' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedInt'), 'id_shop_default' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'is_root_category' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'position' => array('type' => self::TYPE_INT), 'date_add' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), 'date_upd' => array('type' => self::TYPE_DATE, 'validate' => 'isDate'), // Lang fields 'name' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isCatalogName', 'required' => true, 'size' => 128), 'link_rewrite' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isLinkRewrite', 'required' => true, 'size' => 128), 'description' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'), 'description_long' => array('type' => self::TYPE_HTML, 'lang' => true, 'validate' => 'isCleanHtml'), // CUSTOM FIELD 'meta_title' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 128), 'meta_description' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255), 'meta_keywords' => array('type' => self::TYPE_STRING, 'lang' => true, 'validate' => 'isGenericName', 'size' => 255), ), ); } 

Не нашли ни одного прохода, может ли кто-нибудь помочь?

для добавления поля в ваше backoffice вам нужно будет переопределить AdminCategoriesController, точно функцию renderForm () и добавить в нее новое поле. Для этого создайте новый файл AdminCategoriesController под / override / controller / admin /, затем объявите в нем расширение исходного контроллера и скопируйте его в функцию renderForm (полностью) из исходного файла ядра.

 class AdminCategoriesController extends AdminCategoriesControllerCore { public function renderForm() { ... } } 

теперь мы должны отредактировать его в паре мест, сначала нам нужно добавить новое поле в описание, поэтому выполните поиск в объявлении 'name' => 'description' внутри вашего renderForm (), вы увидите, что это список массив, и каждый из них описывает поле формы. Сразу после того, как массив описания добавит новое поле:

  array( 'type' => 'textarea', 'label' => $this->l('Description long'), 'name' => 'description_long', 'lang' => true, 'autoload_rte' => true, 'hint' => $this->l('Invalid characters:').' <>;=#{}', ), 

эта декларация просит Prestashop создать новое поле со следующей спецификацией:

  • поле textarea
  • многоязычное поле
  • плагин javascript для редактирования

  • имя "description_long"

Объявив поле таким образом, мы разрешим pretashop обрабатывать его точно так же, как любое другое свойство класса, поэтому от нашей части не потребуется никакой работы для добавления и обновления поля в базе данных.

Теперь в нашей функции renderForm () есть одна последняя вещь, теперь последняя инструкция – parent::renderForm() , который в исходном классе вызывал AdminController, чтобы попросить его отобразить форму, но прямо сейчас мы расширяем класс, который команда вызывает наш родитель AdminCategoriesControllerCore, переопределяя всю нашу работу и отображая форму по умолчанию. Чтобы избежать этого изменения, parent::renderForm в parent::renderForm AdminController::renderForm() , AdminController::renderForm() вызов интересующему классу.

Для всех, кто борется, это полный ответ:

Чтобы добавить новое поле description_long в категорию категории Prestashop, вам нужно 3 шага:

  1. Обновить БД

Добавьте свое поле с именем description_long в таблицу category_lang, вы можете имитировать характеристики столбца описания

  1. Класс переопределения категории

Создайте файл здесь /override/classes/Category.php с помощью этого кода:

 class Category extends CategoryCore { public $description_long; public function __construct($id_category = null, $id_lang = null, $id_shop = null){ self::$definition['fields']['description_long'] = array('type' => self::TYPE_HTML, 'lang' => true); parent::__construct($id_category, $id_lang, $id_shop); } } 
  1. Переопределить класс AdminCategoriesControllerCore

Создайте файл здесь /override/controllers/admin/AdminCategoriesController.php с помощью этого кода:

 class AdminCategoriesController extends AdminCategoriesControllerCore{ public function renderForm() { $this->fields_form_override =array( array( 'type' => 'textarea', 'label' => $this->l('Description long'), 'name' => 'description_long', 'lang' => true, 'autoload_rte' => true, 'hint' => $this->l('Invalid characters:').' <>;=#{}', ), ); return parent::renderForm(); } } 

Добавьте эту строку в свою функцию __construct переопределенного класса

 public function __construct($id_category = null, $id_lang = null, $id_shop = null) { self::$definition['fields']['description_long'] = array('type' => self::TYPE_HTML, 'lang' => true); parent::__construct($id_category, $id_lang, $id_shop); } 

где description_long – ваше новое имя поля.