Im Januar wurde der Generator auf Symfony Forms umgestellt. Mir war schon vorher klar, dass diese Komponente eine der mächtigsten Teile von Symfony darstellt. Wie nützlich sie aber in der Praxis ist, sieht man natürlich erst, wenn man sie tatsächlich nutzt.
Auch der Zikula Core reimplementiert zunehmend Formulare mit Symfony Forms. Kürzlich wurde das Blocksystem komplett darauf umgestellt. In diesem Zuge wurden ein Block Handler Interface sowie ein dazu passender Abstract Block Handler eingeführt, mit denen Blöcke nun einfacher aufgebaut werden und einen Form Type zur Bearbeitung verwenden können.
Durch die Kapselung des Aufbaus von Formularen in Form Types werden diese sehr leicht wiederverwendbar. So kann man etwa komplette Formulare genauso wie ein einzelnes Feld in anderen Formularen verwenden. Da die Behandlung von Formularen zur Bearbeitung von Entitäten mit Relationen und diversen Extensions (wie Kategorien, Attribute, etc.) dennoch ziemlich komplex werden kann, habe ich im Generator die aus dem alten in Zikula verwendeten Form-System bekannten Form Handler Klassen für diesen Anwendungsfall beibehalten und umstrukturiert, so dass die Controller entlastet werden.
Symfony bietet bereits eine ganze Reihe vordefinierter Feldtypen, so dass der Aufbau eines Formulars sehr schnell von der Hand geht. Auch eigene Typen lassen sich wiederum als Form Type realisieren. So definiert der Generator beispielsweise spezielle Eingabefelder für Farben, Benutzer, Bäume oder Koordinaten.
Sehr interessant ist aber insbesondere die Erweiterung bestehender Feldtypen. Hiermit lassen sich bereits existierende Felder um zusätzliche Funktionen anreichern. Im Generator nutze ich das beispielsweise, um weitere Informationen bei Upload-Feldern anzuzeigen oder um Datums- und Zeitfeldern einen Picker zu spendieren.
Die nächste wichtige Funktion betrifft die Data Transformers. Hiermit lassen sich Daten aus Formularen verändern, wenn sie in einem anderen Format gespeichert (Model Transformer) oder angezeigt (View Transformer) werden sollen. Dies wird im Generator mit mehrwertigen Listen und Relationen mit AutoCompletion umgesetzt.
Noch nicht genutzt habe ich bislang die Möglichkeit, ein Formular mit Form-Events dynamisch zu verändern. Man kann mit dieser Funktionalität zwar sehr viel tun, dies betrifft jedoch weniger den Generator an sich als vielmehr die anforderungsspezifische Anpassung in den generierten Anwendungen.