utworzyłem formularz korzystając zHow to Dynamically ...
Formularz :
Kod
<?php
/
class EventType extends AbstractType
{
private $permissions;
public function __construct($permissions = false)
{
$this->permissions = $permissions;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(
'plannedStartDate',
'date',
array(
'html5' => false,
'placeholder' => array('year' => 'Year', 'month' => 'Month', 'day' => 'Day'),
'widget' => 'single_text',
'format' => 'dd/MM/yyyy',
'required' => true,
'label' => '',
'label_attr' => array(
'class' => 'col-sm-3 control-label'
),
'attr' => array(
'class' => 'form-control'
)
)
)
->add(
'plannedStartTime',
'time',
array(
'html5' => false,
'widget' => 'single_text',
'read_only' => true,
'required' => true,
'label' => '',
'label_attr' => array(
'class' => 'col-sm-3 control-label'
),
'attr' => array(
'class' => 'form-control'
)
)
)
->add(
'plannedEndTime',
'time',
array(
'html5' => false,
'widget' => 'single_text',
'read_only' => true,
'placeholder' => 'Godzina zakończenia',
'required' => true,
'label' => '',
'label_attr' => array(
'class' => 'col-sm-3 control-label'
),
'attr' => array(
'class' => 'form-control'
)
)
)
->add(
'typeOfEvent',
'entity',
array(
'class' =>'AppBundle:TypeOfEvent',
'placeholder' => 'Wybierz typ wizyty',
'required' => true,
'label' => 'Typ wizyty',
'label_attr' => array(
'class' => 'col-sm-3 control-label'
),
'attr' => array(
'class' => 'form-control'
)
)
)
->add('contractor', 'entity', array(
'placeholder' => 'Wybierz',
'class' => 'AppBundle:Contractor',
'label' => 'Kontrahent',
'label_attr' => array(
'class' => 'col-sm-3 control-label'
),
'attr' => array(
'class' => 'form-control'
)
))
->add('contactPersonTelephone', 'text', array(
))
->add('submit', 'submit', array(
'label' => 'Zapisz',
'attr' => array(
'class' => 'btn btn-default button_green'
)
))
//
;
$formCyclicModifier = function (FormInterface $form, TypeOfEvent $typeOfEvent = null) {
if ($typeOfEvent) {
if ($typeOfEvent->getIsCyclic() == true){
$form->add(
'cyclic',
'entity',
array(
'class' => 'AppBundle:Cyclic',
)
);
}
} else {}
};
$formModifier = function (FormInterface $form, Contractor $contractor = null) {
$contactPersons = null === $contractor ? array() : $contractor->getContactPersons();
$rooms = null === $contractor ? array() : $contractor->getRoom();
$form->add(
'contactPerson',
'entity',
array(
'class' => 'AppBundle:ContactPerson',
'placeholder' => 'Wybierz użytkownika',
'choices' => $contactPersons,
)
);
$form->add(
'room',
'entity',
array(
'class' => 'AppBundle:Room',
'placeholder' => 'Wybierz pomieszczenie',
'choices' => $rooms,
)
);
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
$data = $event->getData();
$formModifier($event->getForm(), $data->getContractor());
}
);
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formCyclicModifier) {
$data = $event->getData();
$formCyclicModifier($event->getForm(), $data->getTypeOfEvent());
}
);
$builder->get('contractor')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($formModifier){
$contractor = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $contractor);
}
);
$builder->get('typeOfEvent')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($formCyclicModifier){
$typeOfEvent = $event->getForm()->getData();
$formCyclicModifier($event->getForm()->getParent(), $typeOfEvent);
}
);
}
/
class EventType extends AbstractType
{
private $permissions;
public function __construct($permissions = false)
{
$this->permissions = $permissions;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add(
'plannedStartDate',
'date',
array(
'html5' => false,
'placeholder' => array('year' => 'Year', 'month' => 'Month', 'day' => 'Day'),
'widget' => 'single_text',
'format' => 'dd/MM/yyyy',
'required' => true,
'label' => '',
'label_attr' => array(
'class' => 'col-sm-3 control-label'
),
'attr' => array(
'class' => 'form-control'
)
)
)
->add(
'plannedStartTime',
'time',
array(
'html5' => false,
'widget' => 'single_text',
'read_only' => true,
'required' => true,
'label' => '',
'label_attr' => array(
'class' => 'col-sm-3 control-label'
),
'attr' => array(
'class' => 'form-control'
)
)
)
->add(
'plannedEndTime',
'time',
array(
'html5' => false,
'widget' => 'single_text',
'read_only' => true,
'placeholder' => 'Godzina zakończenia',
'required' => true,
'label' => '',
'label_attr' => array(
'class' => 'col-sm-3 control-label'
),
'attr' => array(
'class' => 'form-control'
)
)
)
->add(
'typeOfEvent',
'entity',
array(
'class' =>'AppBundle:TypeOfEvent',
'placeholder' => 'Wybierz typ wizyty',
'required' => true,
'label' => 'Typ wizyty',
'label_attr' => array(
'class' => 'col-sm-3 control-label'
),
'attr' => array(
'class' => 'form-control'
)
)
)
->add('contractor', 'entity', array(
'placeholder' => 'Wybierz',
'class' => 'AppBundle:Contractor',
'label' => 'Kontrahent',
'label_attr' => array(
'class' => 'col-sm-3 control-label'
),
'attr' => array(
'class' => 'form-control'
)
))
->add('contactPersonTelephone', 'text', array(
))
->add('submit', 'submit', array(
'label' => 'Zapisz',
'attr' => array(
'class' => 'btn btn-default button_green'
)
))
//
;
$formCyclicModifier = function (FormInterface $form, TypeOfEvent $typeOfEvent = null) {
if ($typeOfEvent) {
if ($typeOfEvent->getIsCyclic() == true){
$form->add(
'cyclic',
'entity',
array(
'class' => 'AppBundle:Cyclic',
)
);
}
} else {}
};
$formModifier = function (FormInterface $form, Contractor $contractor = null) {
$contactPersons = null === $contractor ? array() : $contractor->getContactPersons();
$rooms = null === $contractor ? array() : $contractor->getRoom();
$form->add(
'contactPerson',
'entity',
array(
'class' => 'AppBundle:ContactPerson',
'placeholder' => 'Wybierz użytkownika',
'choices' => $contactPersons,
)
);
$form->add(
'room',
'entity',
array(
'class' => 'AppBundle:Room',
'placeholder' => 'Wybierz pomieszczenie',
'choices' => $rooms,
)
);
};
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formModifier) {
$data = $event->getData();
$formModifier($event->getForm(), $data->getContractor());
}
);
$builder->addEventListener(
FormEvents::PRE_SET_DATA,
function (FormEvent $event) use ($formCyclicModifier) {
$data = $event->getData();
$formCyclicModifier($event->getForm(), $data->getTypeOfEvent());
}
);
$builder->get('contractor')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($formModifier){
$contractor = $event->getForm()->getData();
$formModifier($event->getForm()->getParent(), $contractor);
}
);
$builder->get('typeOfEvent')->addEventListener(
FormEvents::POST_SUBMIT,
function(FormEvent $event) use ($formCyclicModifier){
$typeOfEvent = $event->getForm()->getData();
$formCyclicModifier($event->getForm()->getParent(), $typeOfEvent);
}
);
}
Korzystając z ajaxa podmieniam dane dla list wyboru w zależności od wybranego kontrahenta. I pięknie to działa.
Problem w tym, ze jak chcę przeprowadzić walidację np czasu w polach 'plannedStartTime', 'plannedEndTime', to pobieranie danych do list przestaje działać. Gdy nic nie waliduję działa poprawnie.
Jak dopisać walidację do tego formularza by nie zakłócała ajaxowego podmieniania części tego formularza?