2011-04-14 4 views
1

Je suis en train d'écrire une application symfony 1.4 et j'essaie de configurer du code qui fonctionnera si une valeur spécifique change quand un objet est édité. J'essaie de le faire dans la classe du modèle plutôt qu'à l'intérieur de la vue puisque cela s'appliquera à chaque fois que cet objet est sauvegardé.comment obtenir la valeur d'origine dans la méthode d'enregistrement symfony?

Existe-t-il un moyen d'accéder à la valeur d'origine de l'objet avant que les modifications aient été effectuées par l'utilisateur?

Note:

L'objet n'a pas encore été enregistré, il sera toujours possible (en quelque sorte) pour récupérer la valeur d'origine.

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(); 
} 

Répondre

2

Si vous n'avez pas besoin les calculs sont effectués lors de l'enregistrement, écraser le setter de la colonne. Chaque fois qu'une valeur est définie, vous pouvez effectuer vos calculs en fonction de la valeur d'origine, puis sur la nouvelle valeur, appelez enfin le paramètre parent remplacé pour définir la nouvelle valeur.

0

Vous pouvez obtenir la valeur comme ceci: $this->_get('field'); (_set('field', value)) ?

Ou vous pouvez utiliser des doctrine event listeners

+0

mon projet utilise Propel, y at-il quelque chose de similaire? – Patrick

+0

Oh, je ne sais pas. J'ai une très mauvaise connaissance de Propel ORM. – cuhuak

0

Mon approche à un problème similaire:

/** 
* 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

Vous pouvez le faire en remplaçant processForm(). Dans les actions l'obtenir à partir du cache et vous pouvez:

$form->getObject() ; //the original object 
$request->getParameter($form->getName()) ; // the new object 
Questions connexes