Сохранить данные, измененные из AfterFind, для обновления таким образом? - PullRequest
3 голосов
/ 07 января 2011

Если бы я использовал функцию model 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.Данные, переданные edit view от product model, повысят цену до 120, потому что она находится в области GEO, и приведут к корректировке цены.

Поэтому, как только она сохранит данные (скажем, она изменила имя), она непреднамеренно изменит цену с 100 на 120. Теперь, если она отредактирует ее снова, она будет загружаться как 144, увеличиваясь каждый раз.

Я не придумываю логического способа предотвратить это.Есть предложения?

Ответы [ 2 ]

2 голосов
/ 07 января 2011

Ваш код нуждается в рефакторинге. Условное обновление поля цены не является хорошей идеей.

$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 голос
/ 07 января 2011

Обычный подход к этому - хранить цену наценки в базе данных как отдельное поле. Это позволило бы избежать проблемы при редактировании, поскольку пользователь всегда будет редактировать базовую цену . Это также позволило бы рассчитать цену наценки на save() вместо каждых find(). Это гораздо проще контролировать, чем ваш текущий метод, что можно увидеть в многомодельных находках.

Недостаток этого подхода заключается в том, что он не такой динамичный, как метод find(). Это означает, что если ваша разметка GEO изменилась, вам придется переоценивать каждый продукт по цене для обновления.

В конце концов, возможно, какой-то гибрид лучше всего подходит для вас. В любом случае, вы можете использовать виртуальное поле для цена наценки либо в модели, либо в том, которое вы задали во время выполнения. Таким образом, вы не перезаписываете price и все еще можете его использовать.

$results[$key]['Product']['markup_price'] = $this->priceAdjustAfterFind($val['Product']['price']);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...