Dieses Blog durchsuchen

Dienstag, 29. November 2011

SYMFONY: Die Formatierung einer Form selbst festlegen (Version: Symfony v.1.4.15)

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(),
    ));
 }

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>';
}


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:

class LoginForm extends BaseForm
{
  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.


SYMFONY: Lokalisierung und Internationalisierung einer Webseite - Teil 1 - statische Strings (Version: Symfony v.1.4.15)


Lokalisierung und Internationalisierung.

Die Internationalisierung und Lokalisierung muss auf mehreren Ebenen geschehen:

- Datenbankebene. (Refactoring des Datenbank-Schema)
- Model-Ebene.      (Anpassung der Aktionen und der Routen)
- View-Ebene.        (Anpassung der Templates)

Wir fangen mit den statischen Strings der View-Ebene an an und werden uns bis zu der Datenbankebene durcharbeiten:

1. View-Ebene (Templates)

1.1. Konfiguration für die Templates

Die Lokalisierung ist standardmäßig in Symfony ausgeschaltet.
Um die Lokalisierung einzuschalten muss man in der Datei:
apps/%meine_app%/config/settings.xml
folgende Einträge hinzufügen oder ggf. ändern:

all
  .settings
    I18N :                       on
    standard_helpers:  [Partial, Cache, I18N]
    default_culture:      de

Folgendes wird dadurch bewirkt:
- I18N : on – damit wird die Unterstützung für die Lokalisierung eingeschaltet,
- standard_helpers [I18N] – hiermit wird der „I18N“-Helper hinzugefügt.
- default_culture: de – als Standard wird die Sprache deutsch festgelegt.

1.2. Anpassung der Routen:

In der Datei:
 apps/%meine_app%/config/routing.xml
müssen alle Routen nach folgendem Muster anpasst werden:

index:
  url: /:sf_culture/index.html
  param: {module: default, action: default}
  requirements: {sf_culture: (?:en_GB|de)}

Über den Parameter "/:sf_culture" wird die gewünschte Sprache übergeben.
Der Parameter „requirements“ ist optional. Damit kann man die Auswahl nur auf bestimmte Sprachen beschränken.

Nach dem die Routen verändert wurden, muss unbedingt der Cash geleert werden:
            >symfony cc

Die Seite kann man Testen indem man die folgend aufruft:
http://www.meine-domeane.de/frontend_dev.php/de/index.php


1.3. Statische Texte in den Templates lokalisieren:

Die Lokalisierung der statischen Strings in Symfony ist sehr einfach.
Dazu muss man jeden statischen String einfach dem Helper __() als Argument  übergeben.
Der Helper kümmert sich darum, dass die Strings in der gesetzten Sprache angezeigt werden.
Voraussetzung dafür sein natürlich Übersetzungsdateien für jede Sprache. Darauf wird noch näher eingegangen.

Beispiel:

<b>Wilkommen</b> 

wird durch

<b> <?php echo __('Wilkommen') ?> </b>

ersetzt.


1.4. Erzeugen einer Übersetzungsdatei für statische Texte:

Damit die Lokalisierung der statischen Strings in den Templates richtig funktioniert, muss man für jede Sprache eine Übersetzungsdatei erzeugen.

Dafür gibt es in Symfony ein Kommando:
>symphony i18n:extract application culture
Die erzeugte Datei heißt messages.xml wird im Verzeichnis apps/application /i18n/{culture} erzeugt.

Als Beispiel wird die Übersetzungsdatei für das britisch-englische erzeugt:
>symphony i18n:extract frontend en_GB --auto-save --auto-delete

wobei:
    frontend:           der Name der Applikation ist
    en_GB:              britisch englisch als Sprache
    - -auto-save:      alle neuen Strings werden in die Datei übernommen
    - -auto-delete:    alle nicht mehr existenten Strings werden aus der Datei gelöscht

Die Datei wird automatisch für alle Dateien der angegebenen Anwendung erzeugt. Dabei werden alle Strings berücksichtigt, die als Argument des Helpers __() gefunden werden. Für die Anwendung "frontend" und die Sprache britisch-englisch finden wir die Übersetzungsdatei dann unter folgendem Pfad:
            apps/frontend/i18n/en_GB/messages.xml

Die in der Datei erzeugten Einträge sehen folgend aus:
<trans-unit id="1">
  <source>Wilkommen</source>
  </target>
</trans-unit>

Um die gewünschte Sprache einzufügen muss der Eintrag folgend geändert werden:
<trans-unit id="1">
  <source>Wilkommen</source>
  <target>Welcome</target>
</trans-unit>

wobei
    id:              eine eindeutige id für jeden gefundenen String ist.
    <source></source>  zwischen den Tokens steht der String in der Ausgangssprache.
    <target></target>     zwischen den Tokens muss der übersetzte String eingetragen werden.

Anschließend, wenn man die Webpräsenz über den folgenden Link aufruft:
www.meine-domaene/en_GB/index.html
wird die Webpräsenz bereits in englischer Sprache angezeigt.


1.5. Sprachauswahl auf der Seite anzeigen:

Als letztes kann man dem Benutzer die Möglichkeit geben, die Sprache auf der Seite selbst auszuwählen. Dafür bindet man die links für die gewünschte Sprachen ein:

<?php echo link_to(image_tag('/images/de.png'), '@index?sf_culture=de') ?>&nbsp;
<?php echo link_to(image_tag('/images/en.png'), '@index?sf_culture=en_GB') ?>

Vorausgesetzt, die Bilddateien mit den Fähnchen befinden sich bereits in dem Verzeichnis web/images/.


Der Text unterliegt dem Copyright und darf nicht vervielfältigt werden ohne unsere Zustimmung.