基本上,我有两个模块aos_products和fsubscriptions,我想做的是在aos_products模块中的价格发生更改或更新时更新fsubscription模块中的产品价格。
我在中尝试使用逻辑钩子将一些示例代码组合在一起以实现此目的,但仍然无法正常工作。我在这里想念什么?
已更新
class UpdateProductPrices
{
function do_UpdateProductPrices($bean, $events, $args)
{
global $db;
$package_price = "SELECT price FROM aos_products WHERE deleted = 0 AND parent_type = 'FSUBSCRIPTIONS' AND parent_id = '{$this->bean->id}'";
$GLOBALS['log']->fatal($package_price);
$package_price = is_numeric($package_price) ? (float)$package_price : 0;
if(!empty($package_price)){
$bean->product_product_unit_price0 = $package_price->price;
$bean->product_product_unit_price1 = $package_price->price;
} else {
$GLOBALS['log']->fatal('Product not found.');
}
}
}
答案 0 :(得分:1)
第一个$package_price
是一个永远不会执行的查询定义,因此不会有任何数据。
第二,您应该真正考虑将suitecrm pQuery
与准备好的语句数组作为参数,而不是直接在查询中使用它(sql注入)。松开类似pQuery($query, ["arg1", "arg2"])
之类的内容,查询将包含?
个符号,您需要在其中替换参数(遵守顺序)。
如果要在aos_products更新上启动,则需要为aos_products
模块添加一个after_save逻辑钩子,因为该钩子正在被编辑。
这意味着do_UpdateProductPrices($bean, $events, $args)
在此行中的$ bean参数将代表PRODUCT而不是fsubscription
。
第三,您需要先验证价格是否已更新if($bean->fetched_row['price']!=$bean->price){
,然后再进行更新。
最后,让我们尝试一下此代码(请编辑,因为我不知道bean名称)
function do_UpdateProductPrices($bean, $events, $args)
{
global $db;
if($bean->fetched_row['price']!=$bean->price){
//means that the price has changed
$fsubscriptionBean = new fsubscription();
$fsubscriptionBean->retrieve($bean->parent_id);
$fsubscriptionBean->product_product_unit_price0 = $bean->price;
$fsubscriptionBean->product_product_unit_price1 = $bean->price;
}