Слушател на доктрина - стартирайте действие само ако поле е променено

Как да проверя дали полето е променено?

Бих искал да задействам действие в preSave() само ако конкретно поле се е променило, напр.

public function preSave() {
    if ($bodyBefore != $bodyNow) {
         $this->html = $this->_htmlify($bodyNow);
    }
} 

Въпросът е как да получите тези $bodyBefore и $bodyNow


person takeshin    schedule 13.01.2010    source източник


Отговори (3)


Моля, не извличайте отново базата данни! Това работи за Doctrine 1.2, не съм тествал по-ниски версии.

// in your model class
public function preSave($event) {
  if (!$this->isModified())
    return;

  $modifiedFields = $this->getModified();
  if (array_key_exists('title', $modifiedFields)) {
    // your code
  }
}

Разгледайте и документацията.

person bartman    schedule 26.02.2010

Отговорът на Травис беше почти правилен, защото проблемът е, че обектът се презаписва, когато правите заявката за Doctrine. Така че решението е:

public function preSave($event)
{
  // Change the attribute to not overwrite the object
  $oDoctrineManager = Doctrine_Manager::getInstance(); 
  $oDoctrineManager->setAttribute(Doctrine::ATTR_HYDRATE_OVERWRITE, false); 

  $newRecord = $event->getInvoker();
  $oldRecord = $this->getTable()->find($id);

  if ($oldRecord['title'] != $newRecord->title)
  {
    ...
  }
}
person fesja    schedule 18.02.2010

Опитайте това.

public function preSave($event)
{
   $id = $event->getInvoker()->id;
   $currentRecord = $this->getTable()->find($id);

   if ($currentRecord->body != $event->getInvoker()->body)
   {
      $event->getEnvoker()->body = $this->_htmlify($event->getEnvoker()->body);
   }   
}
person Travis    schedule 15.01.2010
comment
Когато добавя $event параметър към preSave(), методът изобщо не се изпълнява. - person takeshin; 19.01.2010
comment
Коя версия на Doctrine използвате? - person Travis; 19.01.2010