首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Symfony2窗体清除字段值

如何使用Symfony2窗体清除字段值
EN

Stack Overflow用户
提问于 2013-02-22 00:19:52
回答 3查看 7K关注 0票数 11

我正在编写自己的CAPTCHA类,当表单不验证时,出于明显的原因,我不想预先使用前面的答案填充captcha输入。我只想在输入呈现之前清除它。

我发现数据选项仅适用于默认值,该默认值被用户输入的内容覆盖。我尝试了以下代码:

代码语言:javascript
复制
$form->get('captcha')->setData(null);

。。在请求与表单绑定之后,但是会抛出一个AlreadyBoundException。实际上,我已经设法让它与之协同工作:

代码语言:javascript
复制
if (isset($formView->children['captcha'])) {
    $formView->children['captcha']->vars['value'] = null;
}

但这看上去是不对的,绝对不符合Symfony标准。在构建表单时,我查看了您可以提供的其他选项,但我看不到任何值得注意的东西。

有人知道吗?

顺便说一句,我半信半疑地认为Symfony2附带了一个CAPTCHA解决方案,这主要是一个学习练习,而我已经习惯了这个框架。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-05-04 15:21:01

我认为您希望像Symfony处理password字段那样处理这个表单字段:它不会被填充。让我们来看看PasswordType

代码语言:javascript
复制
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'] = ''添加到FormType的buildView方法(即CaptchaType)中即可。这意味着字段的数据未被清除,但不会传递给Twig模板。不同的方法,但结果是相同的:在验证失败后,密码字段保持为空。

如果您真的很懒,可以使用PasswordType,但是由于该字段的输入将被屏蔽(*),这将使恼人的captcha字段更加糟糕。

您的表单类型可能如下所示:

代码语言:javascript
复制
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拿走了同一方法

票数 5
EN

Stack Overflow用户

发布于 2016-05-04 19:38:00

在处理请求之前,有一种很有趣的修改方法。然而,我想看看斯蒂芬恩的答案,因为它似乎更清晰。

差不多是这样的:

代码语言:javascript
复制
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()
    ));
}

将名称为“form”的提交数据作为一个值数组,将该值更改为null,然后用新值设置请求的值,并让表单处理它。

一种简单的形式

代码语言:javascript
复制
class Form extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('task')
            ->add('save', SubmitType::class);    

    }

}

无论您键入什么,在提交表单后,数据始终为空。当然,在将值设置为null之前,需要验证captcha。

票数 3
EN

Stack Overflow用户

发布于 2013-02-22 08:20:10

当控件发现表单无效时,可以将不完整的实体传递给调用的操作。

公共函数updateAction(Request ){ $entity =updateAction (!$entity) {抛出$this->createNotFoundException(“无法找到实体”);} $form =$this->createForm(新的RecommendationType(),$entity,数组( 'attr‘=>数组(,'entity’=> $entity ) );$form->bind($request);if ($form->isValid()) {$this->EM($entity);$this->EM()->flush();返回->flush,数组(‘id’=> $id));}{ $entity->setCapthca(Null);}返回$this->呈现(‘Bundle:Entity:edit.html.twig’,数组( 'entity‘=> $entity,'form’=> $form->createView() );}

create操作将进行类似的修改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15014747

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档