我有一个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。 我怎么能这样做?
答案 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 %}
希望它会对你有所帮助。
答案 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;