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.
更新的作品,但是當我編輯和已批准的評論複選框未選中。我該如何解決這個問題? – Hpatoio
由於您使用的是非映射字段'approve',因此您必須將該值動態分配給'true'或'false'。一種方法是檢查「approved_at」是否爲空(然後您會檢查該字段) - 否則,您將它保留爲現在的狀態(未選中) – Artamiel
好的,但是如何?我不知道索納塔。有一個'postRead'事件或者我可以改變傳遞給表單的數據。 – Hpatoio