Переопределить AdminProductsController

Переопределить AdminProductsController

03.10.2019 12:11:26 Просмотров 42 Источник

У меня есть проблема с моим пользовательским модулем 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
        );
    }
}

Что я делаю не так? У меня есть курс Немо, на его видео все работает нормально, но у меня не работает этот самый код.

У вопроса есть решение - Посмотреть?

https://stackoverflow.com/questions/58209417/override-adminproductscontroller#comment102805873_58209417
Вы пытались удалить var\cache\dev\class_index.php-файл?
https://stackoverflow.com/questions/58209417/override-adminproductscontroller#comment102809235_58209417
@AlexanderGrosul Привет:) Нет, я не сделал, я всегда удалить и переустановить модуль, но я постараюсь удалить этот файл.
https://stackoverflow.com/questions/58209417/override-adminproductscontroller#comment102826252_58209417
@AlexanderGrosul я пытался удалить, но все еще не работает

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

Является ответом!
Sim1-81

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

https://stackoverflow.com/questions/58209417/override-adminproductscontroller/58215738#comment102835867_58215738
Привет:) все отлично работает для prestashop 1.6, но я использую 1.7: D конечно, ваш ответ хорош для presta 1.6
https://stackoverflow.com/questions/58209417/override-adminproductscontroller/58215738#comment102840196_58215738
У меня 1:1 с вашим кодом, а у моего меня не работает. т. е. поле продвижения не отображается
https://stackoverflow.com/questions/58209417/override-adminproductscontroller/58215738#comment102840535_58215738
Ваши поля продвижения находятся в таблице ps_product или в другой таблице, которая запрашивается для отображения списка продуктов в backoffice? или это часть вашей пользовательской таблицы? включите режим отладки, чтобы увидеть все ошибки
https://stackoverflow.com/questions/58209417/override-adminproductscontroller/58215738#comment102840972_58215738
хорошо, попробуйте также переопределить класс продукта, добавив общедоступную переменную с именем $promotion и обновите определение, добавив новые спецификации полей. вы можете найти класс продукта в //классы продукции.РНР
https://stackoverflow.com/questions/58209417/override-adminproductscontroller/58215738#comment102844367_58215738
Да, поле продвижения находится на ps_product, я могу сохранить и обновить это поле для всех продуктов. Но я не могу показать gim в списке продуктов. На моем первом посте вы видите мой полный код модуля.
https://stackoverflow.com/questions/58209417/override-adminproductscontroller/58215738#comment102845923_58215738
прочитайте еще раз мой ответ Я обновляю его с тем, как переопределить класс ядра продукта, чтобы позволить Prestashop добавить свой пользовательский файл в его структуру ps_product
https://stackoverflow.com/questions/58209417/override-adminproductscontroller/58215738#comment102853986_58215738
Это мой полный исходный код github.com/PawelCyrklaf/presta-override я переопределил класс продукта и остальную часть вашего кода.
Закрыть X