for those who're looking for a way to tie products (let's say, `array( 1 => "12122", 2 => "12123", 3 => "12124");`) with a specific cart rule:
Since there is no class based implementation for the same, it has to be done manually by making entries to three database tables.
So, after you `$cartrule->add()` you get, `$cartRuleId = $cartrule->id`
(new Cart( $cart->id) )->addCartRule( (int) $cartRuleId); // apply the cart rule 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 ($action['product_ids'] 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));
}
Source: Admin controller for cart rule
Hope this helps.