2017-03-03 4 views
-1

Mein übergeordneter Formulartyp hat ein Feld "title" mit einem generischen Label "Title". Sagen wir, ich habe fünf untergeordnete Formulare und drei von ihnen müssen das Etikett ändern. Wie mache ich das. Ich werde verrückt.Elternformular-Label im untergeordneten Formular symfony überschreiben

class ParentType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('title', TextType::class, [ 
      'label' => 'generics.title', 
     ]); 
    } 
} 

class ChildType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     // I thought I could change the label of parent around here 
     // without removing and adding it again 

     $builder->add('description', TextareaType::class, [ 
      'label' => 'generics.description', 
     ]); 
    } 

    public function getParent() 
    { 
     return ParentType::class; 
    } 
} 

Ich möchte dies nicht im Zweig lösen.

Was ist mit dem Hinzufügen einer benutzerdefinierten titleLabel -Option in ParentType und Einstellung in der childs configureOptions() -Methode?

+2

Wie lautet Ihr Formularcode? Wie rendern Sie es? Unter welchen Umständen entscheiden Sie, welches Etikett verwendet werden soll? Wo möchten Sie entscheiden, welches Label verwendet werden soll? Sie müssen genauer sein. Eigentlich sollten Sie genügend Code und Informationen hinzufügen, damit wir Ihre Situation reproduzieren können. –

+0

Nicht ein Nudge sein, aber sollte es nicht sein: "Class ChildType erweitert ParentType", wenn Sie davon erben? Dann können Sie innerhalb Ihrer buildForm-Methode 'parent :: buildForm ($ builder, $ options);' . Wenn Sie die Elternklasse nicht direkt verwenden, können Sie der Kindklasse immer nur den 'Titel' hinzufügen. – pogeybait

+0

Ist das nicht eine schlechte Methode, um direkt von ParentType zu erweitern? Ich dachte, ich sollte getParent() -Methode verwenden. @yceruto danke für den Code-Stil – uoji

Antwort

0

Sie könnten "Vorlage Methode Muster" verwenden. Schreiben Sie die Vorlagenmethode mit dem Namen getTitle in ParentType. Und Geben Sie diesen Methodenaufruf als Beschriftungsoption an.

protected function getTitle() 
{ 
    return 'generics.title' 
} 

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder->add('title', TextType::class, [ 
     'label' => $this->getTitle(), 
    ]); 
} 

Derive ChildType von parent und schreiben Beton getTitle in ChildType.

class ChildType extends ParentType { 
    protected function getTitle() 
    { 
     return 'concrete label'; 
    } 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     parent::buildForm($builder, $options); 
     $builder->add('description', TextareaType::class, [ 
     'label' => 'generics.description', 
     ]); 
    } 
} 
Verwandte Themen