2011-01-07 38 views
3

如果我使用的是modelafterFind功能調整數據基於其地理位置,像這樣:保持數據從afterFind更新那種方式?

#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; 
} 

這將使該模型高20%,如果在返回的數據的價格領域某些地區。

的問題是:

可以說價格是100的管理員是在GEO區並進入編輯產品admin/product/edit/4。從product model獲得的edit view的數據價格將上漲至120,因爲她在GEO地區,並將觸發價格調整。

因此,只要她保存(稱她調整了名稱),她將無意中將價格從100更改爲120.現在,如果她再次編輯它,它將加載144,每次增加。

我沒有想出一個合理的方法來防止這種情況。有什麼建議麼?

回答

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

到一個常見的方法是將標記價格存儲在數據庫中作爲一個單獨的領域。這樣可以避免您在編輯時遇到的問題,因爲用戶始終會編輯基本價格。這也將允許在save()而不是每個find()上計算加標價格。這比現在的方法更容易控制,這可以在多模型發現中看到。

該方法的缺點是它不像find()方法那樣動態。這意味着如果您的GEO標記發生了變化,您必須重新保存每個產品,以便更新價格。

最後,也許某種混合物最適合你。無論哪種方式,您都可以在模型中使用虛擬字段標記價格,或者在運行時設置虛擬字段。這樣,你不覆蓋price,仍然可以使用它。

$results[$key]['Product']['markup_price'] = $this->priceAdjustAfterFind($val['Product']['price']);