在我的Symfony2应用程序中,我有一个表单订阅,其中包含2个使用相同实体地址的子表单。 我正在寻找一个解决方案,只有在未选中复选框时才能验证第二个表单。由于子表单属于同一实体,因此验证限制是相同的。 Assert \ Valid实体可以使用groups参数,因此我不能使用此解决方案。
SubscriptionType.php
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('billingAddress', new AddressType())
->add('shippingSame', 'checkbox', array(
'mapped' => false,
'data' => true,
))
->add('shippingAddress', new AddressType())
;
}
Adress.php实体
class Address
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @var string
*
* @ORM\Column(name="firstname", type="string", length=255, nullable=false)
* @Assert\NotBlank()
*/
private $firstname;
/**
* @var string
*
* @ORM\Column(name="line1", type="string", length=255, nullable=false)
* @Assert\NotBlank()
*/
private $line1;
}
Suscription.php Entiry
class Subscription
{
/**
* @var integer
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Shop\Address")
* @ORM\JoinColumn(nullable=false)
*/
private $billingAddress;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Shop\Address")
* @ORM\JoinColumn(nullable=false)
*/
private $shippingAddress;
}
所以,我只想在未选中未映射的复选框的情况下验证第二个地址。
谢谢你的帮助!
答案 0 :(得分:0)
使用未映射字段的唯一方法是直接访问表单数据,这违背了验证的目的。要使用symfony的Validator组件,您必须对复选框进行映射。只需将此字段添加到您的实体,您就不必将其映射到数据库。
Application.CalculateFullRebuild
然后您可以在@Assert\Callback()中轻松访问它:
/**
* @var bool
*/
private $shippingSame;
/**
* @return bool
*/
public function isShippingSame()
{
return $this->shippingSame;
}
/**
* @param bool $shippingSame
*/
public function setShippingSame($shippingSame)
{
$this->shippingSame = $shippingSame;
}
答案 1 :(得分:0)
您可以使用表格Validation Groups features。
您需要一些高级逻辑来确定验证组(基于提交的数据),您可以将validation_groups选项设置为数组回调,如下所示:
SubscriptionType.php
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
// before the 2.7 version this method is called setDefaultOptions
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'validation_groups' => function (FormInterface $form) {
$data = $form->getData();
if (true == $data->shippingSame) {
return array('validate_only_billing_address');
}
return array('validate_shipping_billing_address');
},
));
}
在您的实体中添加正确的验证组注释。
希望这有帮助。如果您需要更多建议,请告诉我。
答案 2 :(得分:0)
$resolver->setDefaults(array(
'validation_groups' => function (FormInterface $form) {
if (true == $form->get('shippingSame')->getData()) {
return array('validate_only_billing_address');
}
return array('validate_shipping_billing_address');
},
));
我只更改了get()属性。 也许只是一个版本差异(老实说,我没有调查) 实际上我在最后一个v2.7.1上运行。
希望这可以帮助某人