Jak rozumiem, chcesz użyć tylko form_widget (formularz) w końcowej szablonu.
Załóżmy mamy dwa odziedziczone modele (MODELA, ModelB) oraz rodzaje formularzy do nich (ModelAType, ModelBType)
class ModelA {
private $A;
private $B;
// Getters and setters
}
class ModelB extends ModelA {
private $C;
// Getters and setters
}
/**
* @DI\Service(id = "form.type.modelA")
* @DI\Tag("form.type", attributes={ "alias":"model_a_type" })
*/
class FormAType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('A')
->add('B')
;
}
// getName and so on
}
/**
* @DI\Service(id = "form.type.modelA")
* @DI\Tag("form.type", attributes={ "alias":"model_b_type" })
*/
class FormAType extends AbstractType {
public function getParent() {
return "model_a_type";
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('C')
;
}
// getName and so on
}
Jeśli renderowanie formB, dostaniesz A, B, C porządku, ale ty chce A, C, B. Aby to zrobić, utwórz szablon formularza i dodaj odwołanie do aplikacji. plik konfiguracyjny:
#app/config/config.yml
twig:
....
form:
resources:
- YourAppBundle:Form:fields.html.twig
{# src/YourAppBundle/Resources/views/Form/fields.html.twig #}
{% block model_a_type_widget %}
{{ form_widget(form.A) }}
{{ form_widget(form.B) }}
{% endblock model_a_type_widget %}
{% block model_b_type_widget %}
{{ form_widget(form.A) }}
{{ form_widget(form.C) }}
{{ block('model_a_type_widget') }}
{% endblock model_b_type_widget %}
Teraz, gdy wyrenderujesz formęB, zobaczysz żądaną kolejność i utrzymasz kod w strukturze. Dzieje się tak, ponieważ każdy widget jest renderowany tylko raz, więc jeśli wyrenderujesz go przed wywołaniem bloku nadrzędnego, zmienisz ich kolejność.
Dziękuję, ale to niemożliwe. Mamy bardzo złożoną strukturę i potrzebujemy funkcji form_widget (formularz), więc musimy to zrobić w backendach! – snirgel
Czy próbowałeś dodać pola do instancji 'FormBuilder' w żądanej kolejności? –
To nie możliwe. Mamy około 80 typów obiektów z zależnościami, spadkami itd., Więc NIE MOGĘ manipulować takimi rzeczami ręcznie ... – snirgel