Symfony nimmt einem sehr viel Arbeit ab. Das gilt auch für
die Forms. Schnell hat man die als Ableitung von der BaseForm definiert, hier
als Beispiel eine Login-Form:
class LoginForm extends BaseForm
{
public function configure()
{
$this->setWidgets(array(
'login' => new sfWidgetFormInputText(),
'pwd' => new sfWidgetFormInputPassword(),
));
}
{
public function configure()
{
$this->setWidgets(array(
'login' => new sfWidgetFormInputText(),
'pwd' => new sfWidgetFormInputPassword(),
));
}
Danach wird die neue Form in einer Action erzeugt:
$this->login_form = new LoginForm();
und in einem Template angezeigt:
<?php echo $login_form ?>
Dabei wird die Form von Symfony gerändert. Die Eingabefelder
werden standardmäßig untereinander angezeigt. Was aber wenn man die Felder
anders anzeigen möchte als von Symfony vorgegeben?
Dann muss man einen eigenen Formatter schreiben. Das folgende einfache Beispiel zeigt wie man die Eingabefelder der obigen Form nebeneinander mit Labels über dem Eingabefeld anzeigt kann.
Als erstes muss man eine neue Klasse erstellen die von der Klasse „sfWidgetFormSchemaFormatter" abstammt. Dafür legt man ein neues Verzeichnis unterhalb des Verzeichnisses \lib an:
\lib\widget\
In diesem Verzeichnis legt man eine neue Datei an, deren
Name exakt dem Namen des neuen Formatters entsprichen muss. Für das Bespiel
„MyFormatter“ wird es folgend aussehen:
\lib\widget\WidgetFormSchemaFormatterMyFormatter.php
Man öffnet die Datei und definiert eine neue Klasse:
class sfWidgetFormSchemaFormatterMyFormatter
extends sfWidgetFormSchemaFormatter {}
Vorerst ist die Klasse leer. Als nächstes muss man sie mit
Leben fühlen:
class sfWidgetFormSchemaFormatterMyFormatter
extends sfWidgetFormSchemaFormatter
{
protected
$rowFormat = '<div style="float:left; padding:0;margin:0;padding-right:5px;"> %label% <br> %field% </div>';
}
{
protected
$rowFormat = '<div style="float:left; padding:0;margin:0;padding-right:5px;"> %label% <br> %field% </div>';
}
Mit $rowFormat wird festgelegt wie eine Zeile der Form
auszusehen hat. Hier wird ein ganz gewöhnlicher HTML-Code eingetragen. In dem
Beispiel wird das %label% über dem %field% angezeigt. Durch die Angabe des Style:
float:left wird erreicht, dass die
Elemente nebeneinander angezeigt werden.
Jetzt muss man nur noch der LoginForm mitteilen, dass die
den neuen Formatter nutzen soll. Dies erreicht man durch folgenden Eintrag
innerhalb der Form-Klasse:
$this->widgetSchema->setFormFormatterName('MyFormatter');
Beachten Sie, dass das Argument "MyFormatter" der
Namenserweiterung der Klasse sfWidgetFormSchemaFormatter gleich sein muss. Also
in diesem Fall "MyFormatter".
Die um eigenen Formatter erweiterte Form-Klasse sieht dann folgend aus:
Die um eigenen Formatter erweiterte Form-Klasse sieht dann folgend aus:
class LoginForm extends BaseForm
{
public function configure()
{
$this->setWidgets(array(
'login' => new sfWidgetFormInputText(),
'pwd' => new sfWidgetFormInputPassword(),
));
{
public function configure()
{
$this->setWidgets(array(
'login' => new sfWidgetFormInputText(),
'pwd' => new sfWidgetFormInputPassword(),
));
$this->widgetSchema->setFormFormatterName('MyFormatter');
}
Wenn man die Form im Template aufruft, dann werden die Eingabefelder in einer Reihe und die Labels über dem Eingabefeld angezeigt.
Der Text unterliegt dem Copyright und darf nicht vervielfältigt werden ohne unsere Zustimmung.
Keine Kommentare:
Kommentar veröffentlichen