检查哪个表单字段值已更改Symfony 3

时间:2018-10-22 15:16:57

标签: php forms symfony symfony-forms symfony-3.1

我需要在FormType内检查哪个字段已更改。有什么办法吗?我搜索了一段时间,然后尝试以几种方式(也包含表单事件)获取已编辑实体字段以捕获已编辑字段,但没有简单的结果。

有什么方法可以使它变得容易,或者我需要在创造这种东西时更具创造力?最好的办法是,如果我可以得到一个带有实体类型的示例,但是任何线索都很好。

P.S。我无法在客户端执行此操作-出于特殊原因,我必须在服务器端执行操作。

2 个答案:

答案 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();

比较数组并完成内容...