我需要在FormType内检查哪个字段已更改。有什么办法吗?我搜索了一段时间,然后尝试以几种方式(也包含表单事件)获取已编辑实体字段以捕获已编辑字段,但没有简单的结果。
有什么方法可以使它变得容易,或者我需要在创造这种东西时更具创造力?最好的办法是,如果我可以得到一个带有实体类型的示例,但是任何线索都很好。
P.S。我无法在客户端执行此操作-出于特殊原因,我必须在服务器端执行操作。
答案 0 :(得分:1)
完成此操作: https://stackoverflow.com/a/33923626/8732955
假设我们要检查ImportantObject中的“状态”字段,代码需要看起来像这样
if($form->isSubmitted() && $form->isValid())
{
$uow = $em->getUnitOfWork();
$uow->computeChangeSets();
$changeSet = $uow->getEntityChangeSet($importantObject);
if(isset($changeSet['status'])){
//do something with that knowledge
}
}
答案 1 :(得分:1)
旧帖子,但有趣的问题。
我如何解决它来检查实体之间的关系,但它也适用于单个字段值。比与教义听众打交道要容易。
假设您有一个具有多个标签的用户,以及一个带有复选框的表单以添加或删除标签
在控制器中,创建一个包含要监视的值的新变量:
$oldValue = '';
foreach ( $user->getTags() as $tag )
$oldValue .= $tag->getId().";";
将其作为选项提供给formType
$form = $this->get('form.factory')->create(userType::class, $user,
['oldValue' => $oldValue ]);
在formType中,创建一个隐藏字段
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
public function buildForm(FormBuilderInterface $builder, array $options)
....
$oldValue = $options['oldValue'];
$builder
->add('oldValue', HiddenType::class, [
'data' => $oldValue,
'mapped' => false,
]);
...
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'pathToEntity',
'oldValue' => null,
));
}
回到控制器,获取您的旧字段值:
if ( $form->isSubmitted() && $form->isValid() )
{
// Stuff
$em->flush();
// Check changes :
$oldValue = $form->get('oldValue')->getData();
$oldValues = explode(';', $oldValue);
$newValues = $user->getTags();
比较数组并完成内容...