验证非模型属性

时间:2013-04-11 07:34:43

标签: symfony validation propel symfony-2.2

环境:Symfony2.2 + Propel 1.6

我尝试验证链接到模型(客户)的“客户”表单,以管理“创建帐户”(表单1)和“登录帐户”(表单2)。用户需要选中“我接受协议条款”复选框,并且此字段未链接到模型。 我正在使用全局“validation.yml”文件来管理验证规则。

我不知道如何验证复选框是否使用validation.yml文件进行检查。

我尝试了几种技术:

1 /将规则放在validation.yml中并在模型中添加getter / setter:

validation.yml:

MyProject\Model\Customer:
properties:
    email:
        - NotBlank:
            groups:     [login, create]
            message:    Champ obligatoire.
        - Email:
            groups:     [login, create]
            message:    La valeur saisie doit être un email.
    cgv:
        - Symfony\Component\Validator\Constraints\True:
            groups:         [login, create]
            message:        Vous devez accepter les CGV.
constraints:
    - Propel\PropelBundle\Validator\Constraints\UniqueObject:
        groups:         [create]
        fields:         email
        message:        Cet email est déjà inscrit.
    - Callback:
        groups:         [login]
        methods:
            -    [MyProject\Model\CustomerQuery, isCustomerEmail]

MyProject的\型号\客户:

class Customer extends BaseCustomer {
    private $cgv;

    (...)

    public function setCgv($cgv) {
        $this->cgv = (Boolean) $cgv;
    }

    public function getCgv() {
        return $this->cgv;
    }
}

结果:即使未选中复选框,规则“True”也可以。如果我添加“NotBlank”规则,则在检查/取消选中的情况下验证都会失败。

2 /尝试在“CustomerType”对象中添加特定的验证规则(如此article中所述)

/*
 * 
 *
 * @author
 */
class CustomerLoginType extends AbstractType {
    /**
     * 
     * @param \Symfony\Component\Form\FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email', 'text', array('required' => true));
        $builder->add('fill', 'checkbox', array('mapped' => false, 'required' => false, 'data' => true));
        $builder->add('cgv', 'checkbox', array('data' => true, 'mapped' => false, 'required' => true, 'validation_groups' => array('login'), 'constraints' => new True(array('message' => 'Vous devez accepter les Conditions Générales de Vente.'))));
   }

    /**
     * 
     * @return string
     */
    public function getName()
    {
        return 'customer_login';
    }    

    /**
     * 
     * @param \MyProject\FrontBundle\Form\Type\OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'MyProject\Model\Customer',
            'validation_groups' => array('login')
        ));
    }

}

结果:如果存在“validation.yml”文件,则不考虑这些规则,如果我删除文件中的“Customer”条目,它可以工作,但我希望尽可能保留它。

3 /由于我找不到“yml”解决方案,我最终在控制器中添加了一个“手动”验证,如下所示:

    $form_request = $this->getRequest()->get('customer_login');
    if (!isset($form_request['cgv'])) {
        $form_customer_login->get('cgv')->addError(new \Symfony\Component\Form\FormError('Vous devez accepter les Conditions Générales de Vente.'));
    }

如何了解如何在validation.yml文件中添加“接受条款”复选框规则?

0 个答案:

没有答案