2015-06-03 72 views
0

我有一個包含註釋的實體。它有一個非常簡單的結構索納塔批准功能

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

我已經建立了奏鳴曲,我現在可以管理評論。

「編輯」頁面有一組下拉菜單,用於設置字段的日期和時間approved_at我想要做的是在「編輯」頁面有一個複選框,如果選中,保存當前日期&時間approved_at

我該怎麼做?

回答

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

這應該可以做到。從文檔的章 - here.

+0

更新的作品,但是當我編輯和已批准的評論複選框未選中。我該如何解決這個問題? – Hpatoio

+0

由於您使用的是非映射字段'approve',因此您必須將該值動態分配給'true'或'false'。一種方法是檢查「approved_at」是否爲空(然後您會檢查該字段) - 否則,您將它保留爲現在的狀態(未選中) – Artamiel

+0

好的,但是如何?我不知道索納塔。有一個'postRead'事件或者我可以改變傳遞給表單的數據。 – Hpatoio