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.

Sonntag, 2. Oktober 2011

SYMFONY: Zur Laufzeit den title tag einem Template zuweisen. (Version: Symfony v.1.4.14)

In der Datei:
app/%my_app%/config/ view.yml
kann man relativ flexibel auf der Applikation- und Moduls-Ebene den Title-Tag anpassen.

Was aber, wenn man den Title-Tag für jedes Template und jede Aktion gezielt setzen möchte?

Dafür muss man einfach innerhalb der entsprechenden Aktion folgende Zeilen hinzufügen
$this->getResponse()->setTitle($my_meta_title);

wobei
    $my_meta_title  der Titel der angezeigten Seite ist.



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

SYMFONY: Zur Laufzeit meta tags für keywords und description einem Template zuweisen. (Version: Symfony v.1.4.14)


In der Datei:
app/%my_app%/config/ view.yml
kann man relativ flexibel auf der Applikation- und Moduls-Ebene die meta tags für keywords und description anpassen. Was aber, wenn wir die meta tags für keywords und description für jedes Template gezielt anpassen möchten? Die Antwort ist sehr einfach:


Wenn man die Meta-Tags für Schlüsselworte  und Beschreibung für jedes Template und jede Aktion auch gezielt anpassen möchte, muss man einfach innerhalb der entsprechenden Aktion noch folgende Zeilen hinzufügen:
$this->getResponse()->addMeta('description', '$my_meta_description);
$this->getResponse()->addMeta('keywords', $my_meta_keywords);

wobei
   $my_meta_description - die meta-Beschreibung für das Template ist
   $my_meta_keywords   - die meta-Schlüsselworte sind


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

Donnerstag, 25. August 2011

SYMFONY: In einem Auswahlfeld (sfWidgetFormSelect) zur Laufzeit einen Wert setzen. (Version: Symfony v.1.4.14)

Eine Form mit dem Namen "MyForm" wurde in der lib/form/myform.php etwa so definiert:

class MyForm extends BaseForm
{
  protected static $themes = array('Thema 1', 'Thema 2', 'Thema 3', ‘Thema 4’);
  public function configure()
  {
    $this->setWidgets(array(
      'my_widget'   => new sfWidgetFormSelect(array('choices' => self::$themes)),
  }
}


Nun wird die Form in einer Action folgend erzeugt:
$this->my_form = new MyForm();

Die im Auswahlfeld angezeigte Auswahl ist standardmäßig der erste Eintrag also: „Thema1“

Wenn man zur Laufzeit die angezeigte Auswahl ändern will muss man folgend vorgehen:
Der Eintrag 3 also "Thema 4" soll als ausgewählt angezeigt werden:
$my_new_choice = 3
$widget = $this->my_form->GetWidget('my_widget');
$widget->setDefault(array('choices' => $my_new_choice));

Es geht auch auf direktem Weg:
$this->my_form->setDefault('my_widget', $my_new_choice);

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

Dienstag, 23. August 2011

CSS: valign="top" mit Hilfe von CSS realisieren

Statt in der Tabelle valign="top" stets zu wiederholen, können wir es viel eleganter mit CSS lösen:

td {
vertical-align: top;
}

Samstag, 13. August 2011

Wilkommen

In diesem Blog werde ich alles wissenswertes zum Thema Symfony & Co. veröffentlichen