我正在编写一个symfony 1.4应用程序,并且我正在尝试设置在编辑对象时如果特定值更改将运行的代码。
我试图在模型类中而不是在视图内部执行此操作,因为只要保存此对象,这将适用。
有没有办法在用户做出任何更改之前访问对象的原始值?
注意:
该对象尚未保存,因此仍然可以(以某种方式)检索原始值。
CODE:
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();
}
答案 0 :(得分:2)
如果您不需要在保存时进行计算,请覆盖列的设置器。
每当设置一个值时,你可以根据原始值进行计算,然后在新值上进行计算,最后调用覆盖的父设置器来实际设置新值。
答案 1 :(得分:0)
你可能会得到这样的价值:$this->_get('field'); (_set('field', value)) ?
或者您可以使用doctrine event listeners
答案 2 :(得分:0)
我遇到类似问题的方法:
/**
* 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)));
}
}
答案 3 :(得分:0)
您可以通过覆盖processForm()
来实现。在操作中从缓存中获取它,您可以:
$form->getObject() ; //the original object
$request->getParameter($form->getName()) ; // the new object