Quantcast
Channel: Active questions tagged symfony4 - Stack Overflow
Viewing all articles
Browse latest Browse all 3917

Symfony Check if at least one of two fields isn't empty on form validation

$
0
0

I've been turning this around in my head for quite a while now and still wasn't able to find a solution to my problem. Using Symfony 4 forms and constraints I'm unable to setup a check to say that at least one of two fields must not be empty when submitting form that contains a sub-form.

I have a Booking entity which contains a Visitor entity which has a phoneNumber property and a email property. I'd like to be able to create a Booking which has a "visitors" CollectionType (where I'm allowed to add visitors from the BookingType form).

My BookingType form (a bit simplified):

class BookingType extends AbstractType{    private $router;    private $translator;    public function __construct(UrlGeneratorInterface $router, TranslatorInterface $translator)    {        $this->router = $router;        $this->translator = $translator;    }    public function buildForm(FormBuilderInterface $builder, array $options)    {        $builder            ->add('bookableTimeSlot', EntityType::class, ['label' => 'entity.booking.bookable-time-slot','class' => BookableTimeSlot::class,'choice_label' => function ($bookableTimeSlot) {                    return $bookableTimeSlot->getStartDateTime()->format('d.m.Y h\hi');                }            ])            ->add('visitors', CollectionType::class, ['entry_type' => VisitorType::class,'label' => 'entity.booking.visitors','allow_add' => true,'by_reference' => false,'entry_options' => ['label' => false]            ])        ;    }    public function configureOptions(OptionsResolver $resolver)    {        $resolver->setDefaults(['data_class' => Booking::class,'user' => User::class,        ]);    }}

My Visitor entity (a bit simplified):

<?phpnamespace App\Entity;use Doctrine\ORM\Mapping as ORM;use Symfony\Component\Validator\Constraints as Assert;use Symfony\Component\Validator\Context\ExecutionContextInterface;/** * @ORM\Entity(repositoryClass="App\Repository\VisitorRepository") */class Visitor{    /**     * @ORM\Id()     * @ORM\GeneratedValue()     * @ORM\Column(type="integer")     */    private $id;    /**     * @ORM\Column(type="string", length=255)     */    private $firstName;    /**     * @ORM\Column(type="string", length=255)     */    private $lastName;    /**     * @ORM\Column(type="string", length=45, nullable=true)     */    private $phone;    /**     * @ORM\ManyToOne(targetEntity="App\Entity\Booking", inversedBy="visitors")     * @ORM\JoinColumn(nullable=false)     */    private $booking;    /**     * @ORM\Column(type="string", length=255, nullable=true)     */    private $email;    public function getId(): ?int    {        return $this->id;    }    public function getFirstName(): ?string    {        return $this->firstName;    }    public function setFirstName(string $firstName): self    {        $this->firstName = $firstName;        return $this;    }    public function getLastName(): ?string    {        return $this->lastName;    }    public function setLastName(string $lastName): self    {        $this->lastName = $lastName;        return $this;    }    public function getPhone(): ?string    {        return $this->phone;    }    public function setPhone(string $phone): self    {        $this->phone = $phone;        return $this;    }    public function getBooking(): ?Booking    {        return $this->booking;    }    public function setBooking(?Booking $booking): self    {        $this->booking = $booking;        return $this;    }    public function getEmail(): ?string    {        return $this->email;    }    public function setEmail(?string $email): self    {        $this->email = $email;        return $this;    }}

And finaly my VisitorType form (a bit simplified):

class VisitorType extends AbstractType{    public function buildForm(FormBuilderInterface $builder, array $options)    {        $builder            ->add('firstName', TextType::class, ['label' => 'entity.visitor.first-name',            ])            ->add('lastName', TextType::class, ['label' => 'entity.visitor.last-name',            ])            ->add('phone', TextType::class, ['label' => 'entity.visitor.phone-number','required' => false,            ])            ->add('email', TextType::class, ['label' => 'entity.visitor.email','required' => false,'constraints' => [                    new Email()                ]            ])        ;    }    public function configureOptions(OptionsResolver $resolver)    {        $resolver->setDefaults(['data_class' => Visitor::class,        ]);    }}

I've tried to add an Expression constraint to the email and phone field which looked something like this:

new Expression(['expression' => 'this.getPhone() == null && this.getEmail() == null'])

Also tried to add constraint directly to the entity, but nothing seems to work correctly for me.

Any help would be greatly appreciated.

UPDATEI haven't specified this, but my problem comes from the fact that I would like to validate the VisitorType form from another form which adds the VisitorType as a CollectionType.


Viewing all articles
Browse latest Browse all 3917

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>