PrestaShop:使用自定义代码创建新的购物车规则


PrestaShop: Create new cart rule using custom code

我创建了一个代码来创建新的购物车规则,它工作得很好,但有一个问题,产品的限制不起作用…希望有人能帮忙,我试着看PrestaShop类和控制器,我试着复制,但这是我得到的,没有工作。

    $coupon = new Discount();
    $coupon->quantity = 1;
    $coupon->quantity_per_user = 1;
    $coupon->id_discount_type = 2;// reduction amount
    $coupon->value = '10';
    $coupon->id_customer = 1;
    $coupon->minimum_amount = 0;
    $coupon->minimum_amount_currency = 1;
    $coupon->minimum_amount_tax = 0;
    $coupon->minimum_amount_shipping = 0;
    $coupon->quantity = 1;
    $coupon->quantity_per_user = 1;
    $coupon->product_restriction = 1;
    $coupon->product_rule_group[] = 1;
    $coupon->product_rule_group_1_quantity = 1;
    $coupon->product_rule_1[] = 1;
    $coupon->product_rule_1_1_type = 'products';
    $coupon->product_rule_select_1_1[] = 9;
    $coupon->reduction_percent = 100;
    $coupon->reduction_amount = 0;
    $coupon->reduction_currency = 1;
    $coupon->reduction_tax = 0;
    $coupon->apply_discount_to = 'specific';
    $coupon->reductionProductFilter = '191072 Air Freshener Refill';
    $coupon->reduction_product = 6;
    $coupon->free_gift = 0;

    $start_date = date('Y-m-d H:i:s');
    $coupon->date_from = $start_date;
    $end_date = date('Y-m-d H:i:s'); //some end date
    $coupon->date_to = $end_date;
    $gen_pass = strtoupper(Tools::passwdGen(8));
    $vouchercode = 'somecode';
    $name_v = $vouchercode.'-'.$gen_pass;
    $namelang = array();
    $namelang[1] = $name_v;
    $namelang[2] = $name_v;;

    //Add Name array
    $coupon->name = $namelang;

    $current_language = 1;
    $coupon->id_customer = 1;

    // fixed bug for currency
    $coupon->reduction_currency = 1;
    $coupon->minimum_amount_currency = 1;
    $code_v = $vouchercode.'-'.$gen_pass;
    $coupon->code = $code_v;
    //$coupon->minimal = $coupon->value;
    $coupon->active = 1;
    //$coupon->cart_display = 1;
    //$coupon->cart_rule_restriction = 0;
    $coupon->description = '';
    $coupon->highlight = 1;

    $coupon->add();

我们建议您使用以下代码来创建购物车规则:

Db::getInstance()->execute('INSERT INTO ' . _DB_PREFIX_ . 'cart_rule_shop
                set id_cart_rule = ' . (int) $cart_rule_id . ', id_shop = ' . (int) $this->context->shop->id);
        Db::getInstance()->execute('INSERT INTO ' . _DB_PREFIX_ . 'cart_rule_lang
            set id_cart_rule = ' . (int) $cart_rule_id . ', id_lang = ' . (int) $this->context->language->id . ', 
            name = "' . strip_tags($coupon_name) . '"');
        Db::getInstance()->execute('INSERT INTO ' . _DB_PREFIX_ . 'cart_rule_product_rule_group
            set id_product_rule_group = NULL, id_cart_rule = ' . (int) $cart_rule_id . ', 
            quantity = 1');
        $product_rule_group_id = Db::getInstance()->Insert_ID();
        Db::getInstance()->execute('INSERT INTO ' . _DB_PREFIX_ . 'cart_rule_product_rule
            set id_product_rule = NULL, id_product_rule_group = ' . (int) $product_rule_group_id . ', 
            type = "products"');
        $product_rule_id = Db::getInstance()->Insert_ID();
        Db::getInstance()->execute('INSERT INTO ' . _DB_PREFIX_ . 'cart_rule_product_rule_value
            set id_product_rule =' . (int) $product_rule_id . ', id_item = ' . (int) $id_product . '');

我知道这现在并不重要,但是,无论如何,如果你正在寻找一种方法来绑定或添加产品到特定的购物车规则,这可能会有帮助

$products = [1 => "32232", 2 => "23232", 3 => "45343"];

$cartrule->add()之后得到$cartRuleId = $cartrule->id

    $coupon->product_restriction = 1; //enable product restriction
    $coupon->reduction_product = -2; // write this only if you want the discount to be applied on the products in the cart and not the whole cart
    (new Cart( $cart->id) )->addCartRule( (int) $cartRuleId); // apply the cart rule to this existing cart
    # first, save `id_cart_rule` & `quantity` and get id_product_rule_group
    Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'cart_rule_product_rule_group` (`id_cart_rule`, `quantity`)
    VALUES ('.(int)$cartRuleId.', "'.(int)$qty.'")');
    $id_product_rule_group = Db::getInstance()->Insert_ID();
    # second, save `id_product_rule_group` & `type` and get id_product_rule
    Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'cart_rule_product_rule` (`id_product_rule_group`, `type`)
    VALUES ('.(int)$id_product_rule_group.', "'.$type.'")');
    $id_product_rule = Db::getInstance()->Insert_ID();
    # finally, using id_product_rule assign products
    foreach ($products as $id) {
        $values[] = '('.(int)$id_product_rule.','.(int)$id.')';
    }
    $values = array_unique($values);
    if (count($values)) {
        Db::getInstance()->execute('INSERT INTO `'._DB_PREFIX_.'cart_rule_product_rule_value` (`id_product_rule`, `id_item`) VALUES '.implode(',', $values));
    }

如果您不想参与复杂的代码,这个方法可能会对您有所帮助:

  1. 在php文件中创建优惠券样本对象

  2. 克隆对象newObject

  3. 更改(代码和活动等),然后从中添加新的优惠券