我的所有产品都与一些"Magazine"内容类型对象相关-即每个产品都有对Magazine对象的节点引用。此外,我还为优惠券添加了相同的节点引用字段,再次引用"杂志"内容类型的节点。我想实现的是有优惠券,将只与一些杂志工作。也就是说,如果优惠券杂志匹配产品杂志优惠券有效。换句话说,它不是。我不能用规则来做,因为我不能以任何方式接近产品的杂志字段。我能看到的都是单品,不能再看产品了。我希望我能从代码中做到。是否有一种方法可以程序化地设置优惠券是否有效?
我只是想检查一下所有的行项,看看其中是否有一些像优惠券一样有相同的杂志设置。
我还想知道,将优惠券与单个产品/系列产品联系起来是否有意义?
我不完全确定我是否遵循这个解释,但如果它是一个产品线项目,您应该能够访问产品id,并加载产品并检查有效杂志
或者,您可以做的是为允许的杂志添加一个字段到优惠券类型,并为杂志节点/产品添加一个实体引用字段。然后,通过代码或规则,对照行项目的产品,检查该特定优惠券的可接受杂志列表。通过您自己的验证或计算方法调用此代码。ie。您可以在代码中创建自定义优惠券,也可以添加一个规则来验证"magazine coupon"类型的优惠券,并在规则中调用一些自定义PHP代码。
// ** note: this is totally untested/rough code **
// Just to give you an idea of how it *could* work
// assuming we have a $coupon and a $line_item at this point
// some basic set up
$coupon_wrapper = entity_metadata_wrapper('commerce_coupon', $coupon);
$line_item_wrapper = entity_metadata_wrapper('commerce_line_item', $line_item);
$product_id = $line_item_wrapper->product_id->raw();
$product = commerce_product_load($product_id);
$product_wrapper = entity_metadata_wrapper('commerce_product', $product);
$magazine_id = $product_wrapper->magazine->nid->raw();
$eligible_magazines = $coupon_wrapper->coupon_magazines->value();
// for each eligible product on the list from the coupon
for($i = 0; $i < count($eligible_products); $i++) {
// compare our product's magazine value to the eligible magazine id
if($eligible_magazines[$i]->nid == $magazine_id) {
// do stuff here, whether return true for the validation etc
}
}
或者,如果您只有订单,您可以做一些非常类似的事情,循环遍历订单上的行项。我相信订单只有id,所以您必须使用commerce_line_item_load函数。
在评论中回答你的问题-是的,你可以在模块中添加一个钩子来完成这些代码,也可以创建一个规则来完成。你可以为你的优惠券添加一个验证规则,比如
(未测试)
{ "rules_coupon_check_magazine" : {
"LABEL" : "Coupon: Check Magazine",
"PLUGIN" : "reaction rule",
"REQUIRES" : [ "rules", "php", "commerce_coupon" ],
"ON" : [ "commerce_coupon_validate" ],
"IF" : [
{"entity_has_field" : {
"entity" : [ "commerce-order" ],
"field" : "commerce_coupon_order_reference"
}
},
{ "NOT data_is_empty" : { "data" : [ "commerce-order:commerce-coupon-order-reference" ] } },
{ "php_eval" : { "code" : "// my validation code here - either return true or falsernreturn true;" } }
],
"DO" : [
{ "drupal_message" : {
"message" : "Sorry, you cannot apply this coupon to the order",
"type" : "error"
}
},
{ "commerce_coupon_action_is_invalid_coupon" : [] }
]
}
}