Głowna klasa formularza
$builder->add(
'group',
new FindOrCreateType(
$builder->create(
'findGroup',
new Autocomplete(
$this->getRouter()->generate('_coupon_groups_ajax_find')
),
'required' => false,
'mapped' => false
)
),
$builder->create(
'newGroup',
new CouponGroupType(),
'mapped' => false,
'required' => false
)
)
),
'mapped' => false
)
);
Klasa typu, który będzie dodawał 3 pola:
class FindOrCreateType extends AbstractFormType {
protected $findType;
protected $createType;
protected $checkboxChoserOption = 'createOrFind';
public function __construct(
FormBuilderInterface $findType,
FormBuilderInterface $createType,
$checkboxChoserOption = 'createOrFind')
{
$this->findType = $findType;
$this->createType = $createType;
$this->checkboxChoserOption = $checkboxChoserOption;
}
public function buildForm
(FormBuilderInterface
$builder, array $options) { $builder->add($this->findType);
$builder->add($this->createType);
$builder->add(
$this->checkboxChoserOption,
'checkbox',
'required' => false,
'mapped' => false
)
);
$builder->addModelTransformer(new FindOrCreateTransformer());
}
/**
* Returns the name of this type.
*
* @return string The name of this type
*/
public function getName() {
return 'find_or_create';
}
}
DataTransformer:
class FindOrCreateTransformer implements DataTransformerInterface {
public function transform($value) {
}
public function reverseTransform($value) {
}
}
I niestety ale w każdym przypadku zwraca albo pustą tablicę albo null. W zend jakoś normalnie chyba te formularze były zrobione. Tutaj na każdym kroku mam problem. Nie wierzę, że nikt nie miał takiego przypadku i nie ma na to rozwiązania.
Głowię się z tym już 3 dni i nic mi nie przychodzi do głowy. Pewnie to jest banalnie proste dla was ale dla mnie jest to w ogóle nie logiczne. W tym momencie uważam, że formularze w Symfony2 są beznadziejne w porównaniu z innymi fw... - oczywiście to moje aktualne zdanie

No dobra, już prawie mam to co chciałem. Ale ....
Główny formularz:
$builder->add('createNewGroup', 'checkbox', array( 'mapped' => false,
'required' => false
));
$builder->add(
'newGroup',
new CouponGroupType(),
'mapped' => false,
'required' => false
)
);
$builder->add(
$builder->create(
'findGroup',
new Autocomplete($this->getRouter()->generate('_coupon_groups_ajax_find')),
'mapped' => false,
'required' => false
)
)->addModelTransformer(new DataToEntityTransformer(Group::class, null, $this->getContainer()))
);
$builder->addEventListener(FormEvents::POST_SUBMIT, function(FormEvent $event) {
$form = $event->getForm();
$data = $event->getData();
if((boolean) $form->get('createNewGroup')->getData()) {
$data->setGroup($form->get('newGroup')->getData());
} else {
$data->setGroup($form->get('findGroup')->getData());
}
});
To załatwia to co jest w temacie. Tylko teraz mam problem jak zrealizować aby formularz nie przechodził walidacji gdy użytkownik zaznaczy checkbox i nie wprowadzi żadnych danych w formularzu: newGroup. Zrobiłem sobie taki event:
$builder->addEventListener(FormEvents::SUBMIT, function(FormEvent $event) {
$form = $event->getForm();
$checkbox = $form->get('createNewGroup');
if((boolean) $checkbox->getData()) {
$form->add(
'newGroup',
new CouponGroupType(),
'auto_initialize' => false,
'required' => true,
'mapped' => false,
'cascade_validation' => true
)
);
}
});
A o to mój typ (CouponGroupType):
$builder->add('id', 'hidden');
$builder->add('name', 'text', array( 'required' => true
));
$builder->add('description', 'textarea', array('required' => false));