如果我使用model
的{{1}}函数根据其GEO位置调整数据,请执行以下操作:
afterFind
如果在某个区域内,这将使模型返回的数据的价格字段高出20%。
问题是:
让我们说价格是100.管理员在GEO区域并去编辑产品 #app/models/product.php
function afterFind($results)
{
if( $userInArea)
{
if(!isset($results[0]['Product']['price']))
{
return $results;
}
foreach ($results as $key => $val)
{
$results[$key]['Product']['price'] = $this->priceAdjustAfterFind($val['Product']['price']);
}
return $results;
}
}
function priceAdjustAfterFind($price)
{
return $price * 1.2;
}
。从admin/product/edit/4
提供给edit view
的数据将使价格增加到120,因为她在GEO区域并将触发价格调整。
所以一旦她保存(说她调整了名字),她就会无意中将价格从100改为120.现在,如果她再次编辑它,它将加载为144,每次都会增加。
我没有想出一个合乎逻辑的方法来防止这种情况发生。有什么建议吗?
答案 0 :(得分:2)
您的代码需要重构,价格字段的条件更新不是一个好主意。
$results[$key]['Product']['price_adjusted']
= $this->priceAdjustAfterFind($val['Product']['price']);
制作视图助手
<?php
class PricingHelper extends AppHelper {
function show($result) {
return ($result['price_adjusted']) ? $result['price_adjusted'] : $result['price']
}
}
在您的视图中调用
<?php echo $this->Pricing->show($result); ?>
答案 1 :(得分:1)
一种常见的方法是将标记价格作为单独的字段存储在数据库中。这样可以避免编辑时遇到的问题,因为用户始终会编辑基本价格。这也允许在save()
而不是每find()
上计算标记价格。这比您当前的方法更容易控制,这可以在多模型查找中看到。
这种方法的缺点是它不像find()
方法那样动态。这意味着如果您的GEO标记发生变化,您必须重新保存每个产品以便更新价格。
最后,也许某种混合动力最适合你。无论哪种方式,您都可以在模型中使用虚拟字段标记价格,或者在运行时设置。这样您就不会覆盖price
,仍然可以使用它。
$results[$key]['Product']['markup_price'] = $this->priceAdjustAfterFind($val['Product']['price']);