javascript - 将新变量添加到 Prestashop Cart 对象

标签 javascript php ajax prestashop cart

在购物车(我使用 5 步购物车)中,我添加了单选框“stock_action”,并且我需要将此值发送到购物车对象,因为我想根据该值添加一些额外的订购费用。

在购物车覆盖中,我添加了 $stock_action 变量:

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'),
        ),
    );

但是在单击购物车中的下一步按钮后,stock_action 单选按钮的值并未发送。

然后我尝试使用 AJAX 发送该值,但我不确定如何正确发送它并在另一侧捕获它以分配给 Cart 对象。我在 cart-summary.js 中尝试了其他函数的各种组合,我想出了这样的结果:

function setStockAction() {
  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=cart'
    + '&ajax=true'
    + '&stock_action=' + val
    + '&token=' + static_token
    + '&allow_refresh=1',
    success: function(jsonData) {
      alert('ok!');
    }
  });
}

我是否走在正确的道路上,或者在 Prestashop 中有更简单的方法吗? 谢谢。

最佳答案

您需要将'stock_action'字段添加到数据库中的cart表中。然后这个属性将在您的购物车类实例以及其他属性中可用。如果不这样做,您将在所有与购物车相关的事件中收到错误'field list'中的未知列'stock_action',只需打开开发模式即可查看它在 config/defines.inc.php 中将 define('_PS_MODE_DEV_', false); 设置为 true。

UPD: 要使您的 AJAX 正常工作,请执行以下步骤(除了前面的步骤之外) 1.覆盖/修改controllers/front/OrderController.php方法initContent()并添加下一个代码
if (工具::isSubmit('ajax') && 工具::getValue('方法') == 'updateStockAction') { $this->context->cart->stock_action = (int)Tools::getValue('stock_action'); $this->上下文->购物车->save(); }
紧接着
if (Tools::isSubmit('ajax') && Tools::getValue('method') == 'updateExtraCarrier') { .... } block
2. 转到主题 js 文件夹并将 AJAX 代码添加到 global.js

$(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!');
        }
    });
});

3.转到您的主题模板文件 shopping-cart.tpl 并在其中添加您的 radio 输入

<input type="radio" name="stock_action" value="1" />
<input type="radio" name="stock_action" value="0" />

我检查了一下,它有效!在接下来的所有页面上,您将获得 stock_action 的正确值,并且它将一直相关,直到您的购物车存在或您将其更改为不同的

关于javascript - 将新变量添加到 Prestashop Cart 对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57053774/

相关文章:

javascript - 如何向 slider 添加项目符号导航

javascript - 带有 Vue.js 的 ASP.NET Core 不接受我的纯 js 组件

javascript - 在不同的作用域中重新声明变量

php - laravel 中的 mysqli_connect() 错误,次要版本错误

javascript - 通过 ajax 将变量从表单 (POST) 发送到另一个 PHP 脚本 (GET)

ajax - 尝试测试异步Dart Ajax HttpRequest时出错

javascript - AJAX 内部 HTML。更改链接。可能是 "or ' 问题

javascript - Firebase 警告 : Using an unspecified index when search data with Firebase Cloud Function

php - Symfony2 - 如何执行外部请求

PHP exec fork 一个进程,使其崩溃返回代码仍然为 0