2个子表单具有相同的实体,具有不同的验证Symfony2

时间:2015-07-12 20:11:51

标签: forms validation symfony

在我的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;
}

所以,我只想在未选中未映射的复选框的情况下验证第二个地址。

谢谢你的帮助!

3 个答案:

答案 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上运行。

希望这可以帮助某人