11

私は独自の CAPTCHA クラスを作成していますが、フォームが検証されない場合、明らかな理由から、キャプチャ入力に前の回答を事前入力したくありません。レンダリングする前に入力をクリアしたいだけです。

データオプションはデフォルト値専用であり、ユーザーが入力した値によって上書きされることを発見しました。次のコードを試しました:

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

.. リクエストがフォームにバインドされた後、AlreadyBoundExceptionがスローされます。私は実際にそれを動作させることができました:

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

しかし、それは間違っているように見え、間違いなく Symfony の標準に達していません。フォームを作成するときに指定できるその他のオプションを調べましたが、特に注意すべき点はありません。

誰にもアイデアはありますか?

ところで、Symfony2 には CAPTCHA ソリューションがパッケージ化されていることを半分期待しています。これは主に、フレームワークに慣れるまでの学習課題です。

4

3 に答える 3

5

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,
        ));
    }

    //...
}

とても簡単です: FormType (つまり CaptchaType)$view->vars['value'] = ''のメソッドを追加するだけです。buildViewつまり、フィールドのデータはクリアされていませんが、Twig テンプレートには渡されません。アプローチは異なりますが、結果は同じです。検証に失敗した後、パスワード フィールドは空のままです。

あなたが本当に怠け者であれば、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 が同じアプローチを取っていることがわかりました。

于 2016-05-04T15:21:01.793 に答える
0

You can pass an incomplete entity to the action called when your control finds form invalid.

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()
            )
        );
}

The create action would have similar modification.

于 2013-02-22T08:20:10.103 に答える