开发者

How to override preUpdate action to not modify my `updated_at` field in Doctrine?

I want to disable the automatic behaviour of changing the 'updated_at' field when an object is updated. I want to do it manually; or at least, have the posibility to disable it as wanted.

I know I can do this by building my own behaviour as in this great answer. But I was searching for something 'cleaner'开发者_运维知识库 modifying a listener of the object.

  • I've tried to override the preUpdate() action on the model.
  • I've tried to disable the listeners, and nothing:

--

Doctrine::getTable('Place')->getRecordListener()->setOption('disabled', true);
// or
Doctrine::getTable('Place')->getRecordListener()->setOption('disabled', array('preUpdate'));
// As reference, I've used these two lines on a Symfony Task

Any more ideas, or code to look at?


You can access the listener directly from your object like this:


  $listenerChain = $this->getListener();

  $i = 0;

  while ($listener = $listenerChain->get($i))
  {
    if ($listener instanceof Doctrine_Template_Listener_Timestampable)
    {
      $listener->setOption('disabled', true);
      break;
    }
    $i++;
  }     


according to the docs at http://www.doctrine-project.org/documentation/manual/1_1/nl/behaviors:core-behaviors#timestampable if you want to use Timestampable but not the updated portion of it just use:

Timestampable:
  updated:
    disabled: true

And add in your own updated_at field in the columns section.


The most simple way to do this would be to rename the updated_at field to something else. So that it is ignored by Doctrine.

That way, you can control the contents of the field exactly.


// get the first (in our case the timstampable) listener for the record
$timestampable = $record->getListener()->get(0);

// disable setting of created_at at the timestampable listener
$timestampable->setOption(array('created' => array('disabled' => true)));

problem is that you have to know the position of the listener

you can also disable all listeners this way:

$record->getListener()->setOption('disabled',true);
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜