Symfony2条件验证

时间:2015-10-20 16:18:05

标签: symfony

我有一个FormType方法。

<?php
class PostType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array                $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('title')
            ->add('text')
            ->add('paymentMethod', 'choice', array(
                'required' => true,
                'choices' => array(
                    'cach' => 'Cach',
                    'check'=> 'Check'
                )
            ))
            ->add('checkId', 'integer', array(
                'required' => true
            ))
            ->add('submit', 'submit');
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults([
            'data_class' => 'AppBundle\Entity\Post',
        ]);
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'appbundle_post';
    }
}
?>

checkId 字段仅在选项&#39; 检查&#39;使用 paymentMethod 字段选择。

这是javascript:

PaymentMethod = {
    hideCheckId: function(){
        $('.check-id').hide();
    },

    showCheckId: function(){
        $('.check-id').fadeIn();
    },

    whenPaymentMethodChange: function(){
        $('#appbundle_post_paymentMethod').on('change', function(){
            var method = this.value ;

            if(method == 'check'){
                PaymentMethod.showCheckId();
            }else{
                PaymentMethod.hideCheckId();
            }
        })
    }
};
PaymentMethod.hideCheckId();
PaymentMethod.whenPaymentMethodChange();

我想要这个领域&#39; checkId&#39;仅在选择选项检查时才需要为TRUE。 我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

好的,谢谢,这是每个人的解决方案:

在实体类中添加回调方法函数。

    /**
     * @param ExecutionContextInterface $context
     * @Assert\Callback()
     */
    public function isPaymentIsCheck(ExecutionContextInterface $context)
    {
        if ($this->getPaymentMethod() == 'check' and $this->getCheckId() == '') {
            $context->buildViolation('A check ID as to be defined')
                ->atPath('checkID')
                ->addViolation();
        }
    }

不要忘记在实体类中添加 Assert ExecutionContextInterface 组件:

use Symfony\Component\Validator\Constraints as Assert;    
use Symfony\Component\Validator\Context\ExecutionContextInterface;

最后不要忘记在树枝模板中显示错误:

    {% if form.vars.errors|length %}
        <div class="alert alert-danger">{{ form_errors(form) }}</div>
    {% endif %}

希望它会对你有所帮助。

此处有更多信息:setMaxBinaryMessageBufferSize(int)

答案 1 :(得分:0)

KevinR所写的内容肯定会解决您的问题,但在我看来,它的解决方案更加清晰:

http://symfony.com/doc/current/book/validation.html#group-sequence-providers

  

想象一下可以是正常的用户实体   用户或高级用户。如果它是高级用户,则需要一些额外的用户   应该将约束添加到用户实体(例如信用卡)   细节)。要动态确定应激活哪些组,   您可以创建组序列提供程序。首先,创建实体和   一个名为Premium的新约束组:

这正是您解决此类问题的方法

public function getGroupSequence()
{
    $groups = array('Post'); //Or array('Default') whichever you prefer

    if ($this->getPaymentMethod() === 'Check') {
        $groups[] = 'Check';
    }

    return $groups;
}

当然,您必须在实体映射中添加验证组paymentMethod属性。这是注释示例,有关更多示例,请查看上面的链接。

/**
 * @Assert\IsTrue(groups={"Check"})
 */
private $checkId;