如何清除与Symfony2的形式字段值(How to clear field value with

2019-08-17 02:34发布

我在写我自己的CAPTCHA类,并在表格没有验证,我不想用以前的答案预先填充的验证码输入,原因是显而易见的。 我只是想明确的输入它的呈现之前。

我已经发现了数据选项只为默认值,这是由用户输入的覆盖。 我尝试下面的代码:

$form->get('captcha')->setData(null);

..之后该请求被绑定的形式,但一个AlreadyBoundException被抛出。 其实我已经设法得到它的工作:

if (isset($formView->children['captcha'])) {
    $formView->children['captcha']->vars['value'] = null;
}

但是,这只是看起来错误的,绝对达不到的Symfony标准。 我已经通过,你可以建立表单时提供的其他选项看,但我看不到值得注意的任何东西。

有谁有想法吗?

顺便说一句,我半想到的Symfony2随附一个CAPTCHA解决方案,这主要是一个学习锻炼,而我习惯了框架。

Answer 1:

我想你想要像Symfony的处理一个来处理这个表单域password字段:它不会得到填充。 让我们来看看PasswordType :

namespace Symfony\Component\Form\Extension\Core\Type;

class PasswordType extends AbstractType
{
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        if ($options['always_empty'] || !$form->isSubmitted()) {
            $view->vars['value'] = '';
        }
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'always_empty' => true,
            'trim' => false,
        ));
    }

    //...
}

所以,这是非常简单:只需加$view->vars['value'] = ''buildView您的FormType(即CaptchaType)的方法。 这意味着该字段的数据不被清除,但它不会被传递到嫩枝模板。 不同的方法,但结果是一样的:密码字段保持为空后验证失败。

如果你真懒,你可以使用PasswordType,但由于该字段的输入将被屏蔽(*****),会不会使一个恼人的验证码现场更是雪上加霜。

你的表单类型,也许是这样的:

class CaptchaType extends AbstractType
{
    /**
     * {@inheritdoc}
     */
    public function buildView(FormView $view, FormInterface $form, array $options)
    {
        $view->vars['value'] = '';
    }

    /**
     * {@inheritdoc}
     */
    public function getParent()
    {
        return __NAMESPACE__.'\TextType';
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return $this->getBlockPrefix();
    }

    /**
     * {@inheritdoc}
     */
    public function getBlockPrefix()
    {
        return 'captcha';
    }
}

编辑:刚才发现CaptchaBundle采取了同样的做法 。



Answer 2:

有处理它之前修改请求一个有趣的方式。 不过,我想看看斯蒂芬的回答,因为它似乎更干净。

像这样:

public function indexAction(Request $request)
{

    $form = $this->createForm(Form::class);

    $subData=$request->request->get('form');

    $subData['task']=null;

    $request->request->set('form',$subData);

    $form->handleRequest($request);


    if ($form->isValid()) {

      //do stuff
    }


    return $this->render('default/index.html.twig', array(
        'form' => $form->createView()
    ));
}

获取名为“形式”作为值数组提交的数据,改变上述值设置为null,然后将请求与新的一个值,并有形式处理。

而一个简单的表格

class Form extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('task')
            ->add('save', SubmitType::class);    

    }

}

不管你输入的内容,数据总是会提交表格后空。 当然,你需要设置为null值之前验证验证码。



Answer 3:

你可以传递一个不完整的实体称为当你控制的发现形成无效的动作。

 public function updateAction(Request $request, $id) { $entity = $this->EM()->getRepository('Bundle:Entity')->find($id); if (!$entity) { throw $this->createNotFoundException('Unable to find Entity entity.'); } $form = $this->createForm(new RecommendationType() ,$entity ,array( 'attr' => array( ,'entity' => $entity ) ) ); $form->bind($request); if ($form->isValid()) { $this->EM()->persist($entity); $this->EM()->flush(); return $this->redirect($this->generateUrl('entity_show' ,array('id' => $id))); } else { $entity->setCapthca(Null); } return $this->render('Bundle:Entity:edit.html.twig' ,array( 'entity' => $entity ,'form' => $form->createView() ) ); } 

在创建行动将有类似的修改。



文章来源: How to clear field value with Symfony2 forms
标签: forms symfony