Добавить новую переменную в объект Prestashop Cart

Добавить новую переменную в объект Prestashop Cart

16.07.2019 12:07:17 Просмотров 122 Источник

В корзине (я использую 5-ступенчатую корзину) я добавил radiobox "stock_action", и мне нужно отправить это значение в объект корзины, потому что на основе значения я хотел бы добавить некоторые дополнительные расходы на заказ.

В переопределении корзины я добавил $stock_action

Но значение радио stock_action не отправляется после нажатия кнопки на следующий шаг в корзине.

Затем я попытался отправить это значение с помощью AJAX, но я не уверен,как правильно отправить его и поймать его с другой стороны, чтобы назначить объект Cart. Я пробовал различные комбинации других функций в public $stock_action; /** * @see ObjectModel::$definition */ public static $definition = array( 'table' => 'cart', 'primary' => 'id_cart', 'fields' => array( 'id_shop_group' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_shop' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_address_delivery' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_address_invoice' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_carrier' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_currency' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'id_customer' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_guest' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'stock_action' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId'), 'id_lang' => array('type' => self::TYPE_INT, 'validate' => 'isUnsignedId', 'required' => true), 'recyclable' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'gift' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'gift_message' => array('type' => self::TYPE_STRING, 'validate' => 'isMessage'), 'mobile_theme' => array('type' => self::TYPE_BOOL, 'validate' => 'isBool'), 'delivery_option' => array('type' => self::TYPE_STRING), 'secure_key' => array('type' => self::TYPE_STRING, 'size' => 32), 'allow_seperated_package' =>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'), ), ); и я придумали что-то вроде этого:

cart-summary.js

Я на правильном пути или есть более простой способ сделать это в PrestaShop? Спасибо.

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

https://stackoverflow.com/questions/57053774/add-new-variable-to-prestashop-cart-object#comment100645006_57053774
Вы добавили это поле "stock_action" в схему БД?
https://stackoverflow.com/questions/57053774/add-new-variable-to-prestashop-cart-object#comment100663595_57053774
Пока нет, но имеет ли это значение, если сейчас мне нужно только иметь это значение в контроллере, чтобы сделать еще несколько вещей, пока процесс заказа не закончился?
https://stackoverflow.com/questions/57053774/add-new-variable-to-prestashop-cart-object#comment100664898_57053774
В принципе, вы должны это сделать. Потому что в режиме отладки вы получите ошибку в этом неизвестном столбце "stock_action" в "списке полей" во время добавления продукта в корзину и других событий. Я бы посоветовал вам включить режим отладки и проверить его

Ответы - Добавить новую переменную в объект Prestashop Cart / Add new variable to Prestashop Cart object

Является ответом!
Alexander Grosul

17.07.2019 10:44:31

Вам нужно 'stock_action'cart, чтобы увидеть его, просто включите режим Dev в Unknown column 'stock_action' in 'field list' установить config/defines.inc.php значение true.

UPD: Чтобы сделать ваш AJAX работает выполните следующие действия(в дополнение к предыдущим) 1. Переопределение / изменение контроллеров / фронт / OrderController.php метод initContent () и добавить следующий код
define('_PS_MODE_DEV_', false);
сразу после этого
if (Tools::isSubmit('ajax') && Tools::getValue('method') == 'updateStockAction') { $this->context->cart->stock_action = (int)Tools::getValue('stock_action'); $this->context->cart->save(); } блок
2. Перейдите в папку вашей темы js и добавьте в global.в JS кода AJAX

if (Tools::isSubmit('ajax') && Tools::getValue('method') == 'updateExtraCarrier') {
    ....
}

3. Перейдите в файл шаблона темы shopping-cart.tpl и добавить где-то ваш вход радио

$(document).on('change', 'input[name="stock_action"]', function() {
    var val = $('input[name=stock_action]:checked').val();
    $.ajax({
        type: 'POST',
        headers: {'cache-control': 'no-cache'},
        url: baseUri + '?rand=' + new Date().getTime(),
        async: true,
        cache: false,
        dataType: 'json',
        data: 'controller=order'
        + '&ajax=true'
        + '&stock_action=' + val
        + '&method=updateStockAction'
        + '&token=' + static_token
        + '&allow_refresh=1',
        success: function(jsonData) {
            alert('ok!');
        }
    });
});

Я проверил его и он работает! На всех следующих страницах у вас будет правильное значение <input type="radio" name="stock_action" value="1" /> <input type="radio" name="stock_action" value="0" /> , и оно будет актуально до тех пор, пока ваша корзина не будет существовать или вы не измените ее на другую

https://stackoverflow.com/questions/57053774/add-new-variable-to-prestashop-cart-object/57070896#comment100670656_57070896
Без него я не получал unknown column... ошибка, но я добавил stock_action в любом случае и до сих пор значение не передается в корзину объект у меня 0 (и не знаю, почему string так я поставил int), которая по умолчанию в БД object(Cart)[17] public 'stock_action' => string '0' (length=1). Должен ли он работать с кодом AJAX, который у меня есть или без этого кода?
https://stackoverflow.com/questions/57053774/add-new-variable-to-prestashop-cart-object/57070896#comment100673591_57070896
Он показывает вам то значение, которое находится в вашей БД. Что же вы ожидаете, что это показывает? Да, вы можете использовать его с вашим ajax, но вам нужно реализовать обработчик в вашем контроллере переднего порядка OrderController.РНР. Но я бы посоветовал вам изменить / переопределить этот контроллер и настроить метод initContent() в соответствии с вашими требованиями на соответствующем шаге. Кстати ваша реализация AJAX также лучше создать здесь как с updateExtraCarrier пример
https://stackoverflow.com/questions/57053774/add-new-variable-to-prestashop-cart-object/57070896#comment100673981_57070896
Я ожидал, что там будет значение проверенного радиобокса, в этом весь смысл этого. Клиент проверяет один из двух вариантов на первом шаге корзины, и у меня есть его выбор в контроллере на шаге № 1 или, по крайней мере, на Шаге № 2, и на основе этого я могу что-то сделать
https://stackoverflow.com/questions/57053774/add-new-variable-to-prestashop-cart-object/57070896#comment100676702_57070896
Большое спасибо! Он отлично работает.
Закрыть X