Переопределить AdminProductsController
У меня есть проблема с моим пользовательским модулем presta shop. Мой модуль добавляет новое поле в продукт, имя поля-продвижение, это строка. Если я добавляю новый продукт или редактирую существующий, у меня нет проблем, я вижу свое новое поле. Но когда я добавляю это поле в список продуктов, я не вижу этого поля.
Мой модуль:
<?php
if (!defined('_PS_VERSION_'))
exit;
class OverrideTraining extends Module
{
private $_html = '';
public function __construct()
{
$this->name = 'overridetraining';
$this->tab = 'front_office_features';
$this->version = '1.0';
$this->author = 'Pawel Cyrklaf';
$this->ps_versions_compliancy = array('min' => '1.6', 'max' => '1.7.9.9');
$this->need_instance = 0;
$this->bootstrap = true;
$this->displayName = $this->l('Override Training');
$this->description = $this->l('Task to learn override');
parent::__construct();
}
public function install()
{
if (!parent::install() OR
!$this->alterProductTable() OR
!$this->registerHook('displayAdminProductsExtra'))
return false;
return true;
}
public function uninstall()
{
if (!parent::uninstall() OR
!$this->alterProductTable('remove'))
return false;
return true;
}
/**
* @param string $method
* @return bool
*/
public function alterProductTable($method = 'add')
{
if ($method == 'add')
$sql = 'ALTER TABLE ' . _DB_PREFIX_ . 'product ADD `promotion` VARCHAR (255) NOT NULL';
else
$sql = 'ALTER TABLE ' . _DB_PREFIX_ . 'product DROP COLUMN `promotion`';
if (!Db::getInstance()->Execute($sql))
return false;
return true;
}
public function hookDisplayAdminProductsExtra($params)
{
$promotion = Db::getInstance()->getValue('SELECT promotion FROM ' . _DB_PREFIX_ . 'product WHERE id_product = ' . (int)Tools::getValue('id_product'));
$this->context->smarty->assign('promotion', $promotion);
return $this->display(__FILE__, 'adminProductsExtra.tpl');
}
}
и AdminProductsController, который я переопределить
<?php
class AdminProductsController extends AdminProductsControllerCore
{
public function __construct()
{
parent::__construct();
$this->fields_list['promotion'] = array(
'title' => $this->l('Promotion'),
'align' => 'text-center',
'class' => 'fixed-width-sm',
'orderby' => false
);
}
}
Что я делаю не так? У меня есть курс Немо, на его видео все работает нормально, но у меня не работает этот самый код.



Ответы - Переопределить AdminProductsController / Override AdminProductsController

03.10.2019 12:04:20
У меня была такая же проблема на adminOrdersController, и я решил, передав calback для печати значения попробуйте отредактировать переопределение, добавив "filter_key" и "calback"
public function __construct()
{
parent::__construct();
$this->fields_list['promotion'] = array(
'title' => $this->l('Promotion'),
'align' => 'text-center',
'class' => 'fixed-width-sm',
'filter_key' => 'a!promotion', // syntax: table_alias!field_name
'callback' => 'displayPromotion'
);
}
public function displayPromotion($value) {
return $value ;
}
ключ фильтра должен быть заполнен псевдонимом таблицы и именем поля, которое вы хотите отобразить.
Чтобы узнать, что вы должны передать как строку в filter_key, вы должны проверить выполненный запрос, который показывает продукты в backoffice.
в функцию обратного вызова вы можете управлять или делать все, что вы хотите со значением, прежде чем он будет напечатан.
Чтобы Prestashop знал, что есть новые поля в таблице product, вы также должны переопределить основной класс Product в /classes / product.РНР
в этом файле вы должны добавить этот public $promotion;
чуть ниже строки 293
затем вам нужно отредактировать the public static $definition = array()
таблицы product, вводящей определение вашего нового поля, поэтому вы должны поместить в массив определения это
'promotion' => array(
'type' => self::TYPE_STRING,
'lang' => true, // or false if don't need to translate this field
'validate' => 'isCleanHtml',
'size' => 255
),
теперь ваше поле должно быть видно в списке продуктов backoffice






