0

我有一个包含评论的实体。它有一个非常简单的结构

sent_at | DateTime
comment_author | Text
comment_text | Text
approved_at | DateTime (null when the comments is inserted)

我已经设置了奏鸣曲,现在我可以管理评论了。

“编辑”页面有一组下拉菜单来设置字段的日期和时间approved_at我想做的是在“编辑”页面中有一个复选框,如果选中,则保存当前日期和时间approved_at

我怎样才能做到这一点 ?

4

1 回答 1

1

SonataAdminBundle 提供 3 个Saving hooks. 直接来自文档:

new object : prePersist($object) / postPersist($object)
edited object : preUpdate($object) / postUpdate($object)
deleted object : preRemove($object) / postRemove($object)

所以,你感兴趣的是preUpdate()

为了实现您想要的,您必须non-mapped在表单中添加新字段:

 // This is needed to check the checkbox if the message has been already approved
 $approved = false;

 $review = $this->getSubject();

 if ($review->getApprovedAt()) {
    $approved = true;
 }

 [..]

 $builder->add('approve', 'checkbox',
     array(
          // We don't need this as property in our entity.
          'mapped' => false,
          // The field should not be required, so that you can skip approving specific comment at the time
          'required' => false,
          'data' => $approved
     )
 );

现在,您所要做的就是读取更新时的值并设置日期时间(如果选中):

 public function preUpdate($object) {
      /* @var $isApproved boolean */
      $isApproved = $this->getForm()->get('approve')->getData();

      if( $isApproved ) {
          $object->setApprovedAt( new \DateTime('now') );
      }
 }

这应该可以解决问题。文档中的章节 -这里。

于 2015-06-03T12:02:13.623 回答