Я хотел бы знать, как я могу добавить настраиваемое поле в категорию и как я могу редактировать в бэк-офисе (в поле описания). поле, которое я хотел бы добавить, – 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 создать новое поле со следующей спецификацией:
плагин javascript для редактирования
имя "description_long"
Объявив поле таким образом, мы разрешим pretashop обрабатывать его точно так же, как любое другое свойство класса, поэтому от нашей части не потребуется никакой работы для добавления и обновления поля в базе данных.
Теперь в нашей функции renderForm () есть одна последняя вещь, теперь последняя инструкция – parent::renderForm()
, который в исходном классе вызывал AdminController, чтобы попросить его отобразить форму, но прямо сейчас мы расширяем класс, который команда вызывает наш родитель AdminCategoriesControllerCore, переопределяя всю нашу работу и отображая форму по умолчанию. Чтобы избежать этого изменения, parent::renderForm
в parent::renderForm
AdminController::renderForm()
, AdminController::renderForm()
вызов интересующему классу.
Для всех, кто борется, это полный ответ:
Чтобы добавить новое поле description_long в категорию категории Prestashop, вам нужно 3 шага:
Добавьте свое поле с именем description_long в таблицу category_lang, вы можете имитировать характеристики столбца описания
Создайте файл здесь /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); } }
Создайте файл здесь /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
– ваше новое имя поля.