Как получить исходное значение внутри метода сохранения Symfony? - PullRequest
1 голос
/ 14 апреля 2011

Я пишу приложение Symfony 1.4 и пытаюсь настроить код, который будет запускаться, если при редактировании объекта изменяется конкретное значение.

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

Есть ли способ получить доступ к исходному значению объекта передкакие изменения были внесены пользователем?

Примечание:

Объект еще не сохранен, поэтому все еще можно (каким-то образом) получить исходное значение.

КОД:

public function save()
{
    if($this->isNew())
        $this->getAcctRelatedByAccountId()->updateCurrentBalance(($this->isAdditive()) ? $this->getAmount(): $this->getAmount()*-1);

    // get the original value HERE

    // do work based on the original value

    // do work based on the new, submitted value

    return parent::save();
}

Ответы [ 4 ]

2 голосов
/ 14 апреля 2011

Если вам не нужно выполнять вычисления при сохранении, перезапишите установщик столбца.

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

0 голосов
/ 02 апреля 2015

Вы можете сделать это, переопределив processForm().В действиях получить его из кэша, и вы можете:

$form->getObject() ;    //the original object
$request->getParameter($form->getName()) ;    // the new object
0 голосов
/ 06 марта 2014

Мой подход к аналогичной проблеме:

/**
 * Returns Record's original values before saving the new ones
 *
 * @return array
 */
public function getOldValues()
{
    $arr_modified = $this->getModified(true);
    $arr = $this->toArray(false);

    foreach ($arr_modified as $k => $v)
    {
        $arr[$k] = $v;
    }

    return $arr;
}



/**
 * Sample usage of getOldValues
 *
 * @param Doctrine_Connection $conn
 */
public function save(Doctrine_Connection $conn = null)
{
    $dispatcher = ProjectConfiguration::getActive()->getEventDispatcher();

    /* object values before saving */
    $arr_before = $this->getOldValues();

    $event_name = 'myobject.update';
    if (true == $this->isNew())
    {
        $event_name = 'myobject.add';
    }

    parent::save($conn);

    /* object values after saving */
    $arr_after = $this->toArray(true);

    /* Notify about the record changes */
    if ($dispatcher instanceof sfEventDispatcher)
    {
        $dispatcher->notify(new sfEvent($this, $event_name, array('before' => $arr_before, 'after' => $arr_after)));
    }
}
0 голосов
/ 14 апреля 2011

Вы можете получить значение следующим образом: $this->_get('field'); (_set('field', value)) ?

Или вы можете использовать слушателей событий доктрины

...