Development

Documentation/de_DE/book/1.0/14-Generators (diff)

You must first sign up to be able to contribute.

Changes between Version 8 and Version 9 of Documentation/de_DE/book/1.0/14-Generators

Show
Ignore:
Author:
Jan.Kunzmann (IP: 84.190.19.106)
Timestamp:
03/20/08 11:02:22 (9 years ago)
Comment:

100% rough translation

Legend:

Unmodified
Added
Removed
Modified
  • Documentation/de_DE/book/1.0/14-Generators

    v8 v9  
    11'''ARBEITSENTWURF ROHÜBERSETZUNG / TRANSLATION WORKING DRAFT'''[[BR]] 
    2 Originaldokument: http://svn.symfony-project.com/doc/trunk/book/14-Generators.txt, Version 6117 vom 2007-11-20[[BR]] 
    3 Übersetzungsfortschritt: 80%[[BR]] 
     2Originaldokument: http://svn.symfony-project.com/doc/branches/1.1/book/14-Generators.txt, Version 7994 vom 2008-03-19[[BR]] 
     3Übersetzungsfortschritt: 100%[[BR]] 
    44Übersetzung: JK[[BR]] 
    55Korrekturfortschritt: 0%[[BR]] 
    9797Um das Grundgerüst für ein `artikel`-Modul zu erstellen, welches auf der Modellklasse `Artikel` basiert, geben Sie folgendes ein: 
    9898 
    99     > symfony propel-generate-crud meineapp artikel Artikel 
    100  
    101 Symfony liest die Definition der Klasse `Artikel` aus der `schema.yml` und erzeugt daraus im Verzeichnis `meineapp/modules/artikel/` einen Satz Templates und Actions. 
    102  
    103 Das erzeugte Modul enthält drei Views. Der `list`-View, der auch der Standardview ist, zeigt beim Aufruf von `http://localhost/meineapp_dev.php/artikel` die Zeilen der Tabelle `blog_artikel`, wie in Abbildung 14-2 wiedergegeben. 
     99    > symfony propel-generate-crud frontend artikel Artikel 
     100 
     101Symfony liest die Definition der Klasse `Artikel` aus der `schema.yml` und erzeugt daraus im Verzeichnis `frontend/modules/artikel/` einen Satz Templates und Actions. 
     102 
     103Das erzeugte Modul enthält drei Views. Der `list`-View, der auch der Standardview ist, zeigt beim Aufruf von `http://localhost/frontend_dev.php/artikel` die Zeilen der Tabelle `blog_artikel`, wie in Abbildung 14-2 wiedergegeben. 
    104104 
    105105Abbildung 14-2 - `list`-View des Moduls `artikel` 
    121121![edit-View des Moduls artikel](/images/book/F1404.png "edit-View des Moduls artikel") 
    122122 
    123 Listing 14-2 - Erzeugte CRUD-Elemente, in `meineapp/modules/artikel/` 
     123Listing 14-2 - Erzeugte CRUD-Elemente, in `frontend/modules/artikel/` 
    124124 
    125125    // In actions/actions.class.php 
    139139Die Logik dieser Actions und Templates ist einfach und eingängig, weshalb Listing 14-3 nur einen kurzen Blick auf die erzeugte Action-Klasse zeigt, anstatt den kompletten Code ausführlich zu erklären. 
    140140 
    141 Listing 14-3 - Erzeugte Action-Klasse, in `meineapp/modules/artikel/actions/actions.class.php` 
     141Listing 14-3 - Erzeugte Action-Klasse, in `frontend/modules/artikel/actions/actions.class.php` 
    142142 
    143143    [php] 
    169169Um ein Propel-Grundgerüst zu initiieren, dass ein `artikel`-Modul erstellt, das sich mit den Datensätzen der Modelklasse `Artikel` beschäftigt, geben Sie folgendes ein: 
    170170 
    171     > symfony propel-init-crud meineapp artikel Artikel 
     171    > symfony propel-init-crud frontend artikel Artikel 
    172172 
    173173Sie können dann über die Standardaction auf den `list`-View zugreifen: 
    174174 
    175     http://localhost/meineapp_dev.php/artikel 
     175    http://localhost/frontend_dev.php/artikel 
    176176 
    177177Die Ergebnisseiten sind genau die gleichen wie bei einem erzeugten Grundgerüst. Sie können sie als einfaches Webinterface für die Datenbank verwenden. 
    408408Es ist tatsächlich so, dass die Felder, die Sie in `generator.yml` konfigurieren, nicht einmal den tatsächlichen Spalten im Schema entsprechen müssen. Wenn die entsprechende Klasse einen selbstgeschriebenen Getter besitzt, kann dieser als Feld für den `list`-View verwendet werden; wenn es einen Getter und/oder einen Setter gibt, auch im `edit`-View. Sie können beispielsweise das Model `Artikel` um eine Methode `getNbComments()` erweitern, ähnlich der in Listing 14-10. 
    409409 
    410 Listing 14-10 - Einen selbstgeschriebenen Getter in das Model einfügen, in `lib/model/Artikel.class.php` 
     410Listing 14-10 - Einen selbstgeschriebenen Getter in das Model einfügen, in `lib/model/Artikel.php` 
    411411 
    412412    [php] 
    560560>Die Templates der Administration sind I18N-fähig 
    561561> 
    562 >Der komplette Text, der in den erzeugten Templates verwendet wird, ist internationalisierbar (d.h. er wird durch aufrufe des `__()`-Helfers ausgegeben). Das bedeutet, dass Sie die erzeugte Administration ganz einfach übersetzen können, indem Sie die Übersetzungen der Phrasen in eine XLIFF-Datei im Verzeichnis `apps/meineapp/i18n/` schreiben, wie im vorherigen Kapitel erklärt. 
     562>Der komplette Text, der in den erzeugten Templates verwendet wird, ist internationalisierbar (d.h. er wird durch aufrufe des `__()`-Helfers ausgegeben). Das bedeutet, dass Sie die erzeugte Administration ganz einfach übersetzen können, indem Sie die Übersetzungen der Phrasen in eine XLIFF-Datei im Verzeichnis `apps/frontend/i18n/` schreiben, wie im vorherigen Kapitel erklärt. 
    563563 
    564564### Anpassung des Listen-Views 
    776776 
    777777    [php] 
    778     class userActions extends sfActions 
     778    class userActions extends autouserActions 
    779779    { 
    780780      protected function updateUserFromRequest() 
    912912          title:          Liste aller Artikel 
    913913          actions:        {} 
     914 
     915### Formular-Validierung 
     916 
     917Wenn Sie das erzeugte Template `_edit_form.php` im Cache Ihres Projekts betrachten, werden Sie feststellen, dass die Formularfelder eine spezielle Namenskonvention verwendet. In einem erzeugten `edit`-View bestehen die Namen der Eingabefelder aus dem Klassennamen (in Unterstrich-Schreibweise) und dem Feldnamen in eckigen Klammern. 
     918 
     919Wenn beispielsweise der `edit`-View der Klasse `Artikel` ein Feld `titel` hat, sieht das Template so aus wie in Listing 14-35, und das Feld wird als `artikel[titel]` geführt. 
     920 
     921Listing 14-35 - Syntax der erzeugten Eingabefeldnamen 
     922 
     923    // generator.yml 
     924    generator: 
     925      class:              sfPropelAdminGenerator 
     926      param: 
     927        model_class:      Artikel 
     928        theme:            default 
     929        edit: 
     930          display: [titel] 
     931 
     932    // Resultierendes Template _edit_form.php 
     933    <?php echo object_input_tag($artikel, 'getTitel', array('control_name' => 'artikel[titel]')) ?> 
     934 
     935    // Resultierendes HTML 
     936    <input type="text" name="artikel[titel]" id="artikel_titel" value="Mein Titel" /> 
     937 
     938Dies hat viele Vorteile während der Formularverarbeitung. Auf der anderen Seite macht es die Formularvalidierung etwas komplizierter, wie in Kapitel 10 erklärt, da Sie in der Felddefinition die eckigen Klammern '[' und ']' durch geschweifte Klammern `{` und `}` ersetzen müssen. Außerdem sollten Sie, wenn Sie einen Feldnamen als Parameter für einen Validator verwenden, den Namen so schreiben wie er im erzeugten HTML-Code steht (also mit den eckigen Klammern, aber in Anführungszeichen). In Listing 14-36 erfahren Sie alle Details der speziellen Validator-Syntax für generierte Formulare. 
     939 
     940Listing 14-36 - Dateisyntax für Validatoren für Formulare des Administrations-Generators 
     941 
     942    ## Ersetzen Sie in der Feldliste die eckigen Klammern durch geschweifte 
     943    fields: 
     944      artikel{titel}: 
     945        required: 
     946          msg: Sie müssen einen Titel angeben. 
     947        ## Parameter für Validatoren enthalten den unveränderten Feldnamen in Anführungszeichen 
     948        sfCompareValidator: 
     949          check:        "user[passwordneu]" 
     950          compare_error: Die Passwortbestätigung stimmt nicht mit dem Passwort überein. 
     951 
     952### Beschränkung der Interaktion durch Benutzer-Rechte 
     953 
     954Für jedes Modul der Administration können Sie gemäß den Rechten des eingeloggten Benutzers die angezeigten Felder und Interaktionen anpassen (Eine Beschreibung von Symfonys Sicherheitsfeatures lesen Sie in Kapitel 6). 
     955 
     956Die Felder in `generator.yml` berücksichtigen den Parameter `credentials` und werden nur den Benutzern angezeigt, die die entsprechenden Rechte haben. Dies funktioniert für den `list`-View ebenso wie für den `edit`-View. Außerdem kann der Generator auch bestimmte Interaktionen verberten. Listing 14-37 zeigt diese Features. 
     957 
     958Listing 14-37 - Verwendung von Benutzer-Rechten (Credentials) in `generator.yml` 
     959 
     960    ## Die Spalte id wird nur Benutzern mit dem Recht "admin" angezeigt 
     961        list: 
     962          title:          Liste aller Artikel 
     963          layout:         tabular 
     964          display:        [id, =titel, inhalt, anz_kommentare] 
     965          fields: 
     966            id:           { credentials: [admin] } 
     967 
     968    ## Die Interaktion "neuerkommentar" ist nur für Benutzer mit dem Recht "admin" zulässig 
     969        list: 
     970          title:          Liste aller Artikel 
     971          object_actions: 
     972            _edit:        - 
     973            _delete:      - 
     974            neuerkommentar: { credentials: [admin], name: Kommentar hinzufügen, action: neuerKommentar, icon: backend/neuerkommentar.png } 
     975 
     976Darstellung der generierten Module verändern 
     977-------------------------------------------- 
     978 
     979Damit die Aufmachung der erzeugten Module bereits bestehenden grafischen Vorgaben genügt, können Sie sie zum einen durch ein eigenes Stylesheet anpassen, zum anderen, indem Sie die Standard-Templates überschreiben. 
     980 
     981### Verwendung eines eigenen Stylesheets 
     982 
     983Weil das erzeugte HTML gut strukturiert ist, können Sie die Darstellung in viele Richtungen anpassen. 
     984 
     985Sie können ein alternatives CSS festlegen, welches für ein Administrationsmodul anstelle des Standard-Styles verwendet wird, indem Sie den Parameter `css` in die Konfiguration des Generators einfügen, wie in Listing 14-38. 
     986 
     987Listing 14-38 - Verwendung eines eigenen Stylesheets anstelle des Standard-Styles 
     988 
     989    generator: 
     990      class:              sfPropelAdminGenerator 
     991      param: 
     992        model_class:      Kommentar 
     993        theme:            default 
     994        css:              meinstylesheet 
     995 
     996Alternativ hierzu können Sie auch die Mechanismen verwenden, die von der `view.yml` der einzelnen Module zur Verfügung gestellt werden, um die Styles gezielt für einen View zu überschreiben. 
     997 
     998### Eigene Kopf- und Fußzeilen erzeugen 
     999 
     1000In den Views für `list` und `edit` wird systematisch ein Partial für Kopf- und Fußzeilen eingebunden. Standardmäßig fehlt dieses Partial im `templates/`-Verzeichnis eines Administrationsmoduls, aber Sie müssen einfach nur eines mit einem der folgenden Namen erstellen, damit es automatisch eingebunden wird: 
     1001 
     1002    _list_header.php 
     1003    _list_footer.php 
     1004    _edit_header.php 
     1005    _edit_footer.php 
     1006 
     1007Wenn Sie also einen selbstgeschriebenen Header (Kopfzeile) im View `artikel/edit` wollen, erzeugen Sie eine Datei namens `_edit_header.php` wie in Listing 14-39. Es wird dann ohne weiteres Zutun eingebunden. 
     1008 
     1009Listing 14-39 - Beispiel eines Header-Partials für den `edit`-View, in `modules/artikel/template/_edit_header.php` 
     1010 
     1011    [php] 
     1012    <?php if ($artikel->getAnzKommentare() > 0): ?> 
     1013      <h2>Dieser Artikel hat <?php echo $artikel->getAnzKommentare() ?> Kommentare.</h2> 
     1014    <?php endif; ?> 
     1015 
     1016Wie Sie sehen, hat ein `edit`-Partial stets über eine Variable, die nach dem Klassennamen benantn ist, Zugriff auf das aktuelle Objekt. Ein `list`-Partial kann über die Variable `$pager` auf den Pager zugreifen. 
     1017 
     1018>**SIDEBAR** 
     1019>Actions in der Administration mit eigenen Parametern aufrufen 
     1020> 
     1021>Den Actions eines Administrations-Moduls können Sie auch selbstdefinierte Parameter übergeben, indem Sie das Argument `query_string` im Helfer `link_to()` verwenden. Um beispielweise das Partial `_edit_header` von oben mit einem Link zu den Kommentaren zu einem Artikel zu erweitern, schreiben Sie dies: 
     1022> 
     1023>     [php] 
     1024>     <?php if ($artikel->getAnzKommentare() > 0): ?> 
     1025>       <h2>Dieser Artikel hat <?php echo link_to($artikel->getAnzKommentare().' Kommentare', 'kommentar/list', array('query_string' => 'filter=filter&filters%5Bartikel_id%5D='.$artikel->getId())) ?></h2> 
     1026>     <?php endif; ?> 
     1027> 
     1028>Der Parameter `query_string` ist eine codierte Version des besser lesbaren 
     1029> 
     1030>     'filter=filter&filters[artikel_id]='.$artikel->getId() 
     1031> 
     1032>Dies filtert die Liste der Kommentare, so dass nur noch die angezeigt werden, die sich auf `$artikel` beziehen. Über das Argument `query_string` können Sie die Sortierung und/oder Filterung der Listenansicht festlegen. Dies kann auch für selbstdefinierte Interaktionen sinnvoll sein. 
     1033 
     1034### Anpassung der Layout-Themes 
     1035 
     1036Es gibt noch weitere Partials, die aus dem Framework vererbt werden und die Sie im `templates/`-Verzeichnis des Moduls überschreiben können, um sie Ihren eigenen Anforderungen anzupassen. 
     1037 
     1038Die Templates des Generators sind in kleine Einheiten zerteilt, die unabhängig voneinander überschrieben werden können. Auch die Actions können jede für sich verändert werden. 
     1039 
     1040Wenn Sie jedoch diese Angaben für verschiedene Module in der gleichen Weise verändern, sollten Sie besser ein wiederverwendbares Theme erzeugen. Ein Theme ist ein kompletter Satz aus Templates und Actions, die von einem Modul der Administration verwendet werden können, wenn dies am Anfang der `generator.yml` im Feld `theme` angegeben ist. Als Standard-Theme verwendet Symfony die Dateien aus `$sf_symfony_data_dir/generator/sfPropelAdmin/default/`. 
     1041 
     1042Die Theme-Dateien müssen innerhalb der Verzeichnisstruktur des Projekts stehen, in einem Verzeichnis `data/generator/sfPropelAdmin/[theme_name]/template/`. Am besten beginnen Sie ein neues Theme, indem Sie die Dateien des Standard-Themes aus dem Verzeichnis `$sf_symfony_data_dir/generator/sfPropelAdmin/default/template/` dorthin kopieren. Auf diese Weise können Sie sicher sein, dass alle notwendigen Dateien für Ihr selbstgeschriebenes Theme vorhanden sind: 
     1043 
     1044    // Partials, in [theme_name]/template/templates/ 
     1045    _edit_actions.php 
     1046    _edit_footer.php 
     1047    _edit_form.php 
     1048    _edit_header.php 
     1049    _edit_messages.php 
     1050    _filters.php 
     1051    _list.php 
     1052    _list_actions.php 
     1053    _list_footer.php 
     1054    _list_header.php 
     1055    _list_messages.php 
     1056    _list_td_actions.php 
     1057    _list_td_stacked.php 
     1058    _list_td_tabular.php 
     1059    _list_th_stacked.php 
     1060    _list_th_tabular.php 
     1061 
     1062    // Actions, in [theme_name]/template/actions/actions.class.php 
     1063    processFilters()     // Verarbeitet die Filter 
     1064    addFiltersCriteria() // Fügt die Filter zum Criteria-Objekt hinzu 
     1065    processSort()        // Verarbeitet die Sortierung 
     1066    addSortCriteria()    // Fügt die Sortierung zum Criteria-Objekt hinzu 
     1067 
     1068Beachten Sie, dass diese Template-Dateien in Wirklichkeit Templates von Templates sind, also PHP-Dateien, die von einem speziellen Programm verarbeitet werden, um daraus die eigentlichen Templates zu erzeugen, die auf den Einstellungen des Generators basieren (die sog. Übersetzungs-Schritt oder englisch Compilation Phase). Das erzeugte Template muss natürlich immer noch PHP-Code enthalten, der dann während des eigentlichen Anzeigevorgangs ausgeführt wird, und deshalb benutzen die Template-Templates eine alternative Syntax, um den PHP-Code während des ersten Durchgangs unausgeführt zu lassen. Listing 14-40 zeigt einen Ausschnitt aus einem Standard-Template-Template. 
     1069 
     1070Listing 14-40 - Syntax bei Templates-Templates 
     1071 
     1072    [php] 
     1073    <?php foreach ($this->getPrimaryKey() as $pk): ?> 
     1074    [?php echo object_input_hidden_tag($<?php echo $this->getSingularName() ?>,'get<?php echo $pk->getPhpName() ?>') ?] 
     1075    <?php endforeach; ?> 
     1076 
     1077Der PHP-Code in diesem Listing, der durch `<?` eingeleitet wird, wird unmittelbar während der Übersetzung ausgeführt; der durch `[?` eingeleitete wird erst während der Ausführung ausgeführt. Der Template-Mechanismus verändert die `[?`-Tags in `<?`, so dass das daraus resultierende Template so aussieht: 
     1078 
     1079    [php] 
     1080    <?php echo object_input_hidden_tag($artikel, 'getId') ?> 
     1081 
     1082Der Umgang mit diesen Templates ist tückisch, deshalb sind Sie am besten beraten, wenn Sie Ihre eigenen Themes mit einer Kopie des Standard-Themes beginnen, es dann Schritt für Schritt anpassen und intensiv testen. 
     1083 
     1084>**TIP** 
     1085>Sie können ein Generator-Theme auch in ein Plugin verpacken, was es Ihnen ermöglicht, es noch besser wiederzuverwenden und mit verschiedenen Anwendungen auszuliefern. Kapitel 17 enthält hierzu weitere Informationen. 
     1086 
     1087- 
     1088 
     1089>**SIDEBAR** 
     1090>Erstellung Ihrer eigenen Generatoren 
     1091> 
     1092>Die Generatoren für das Grundgerüst und die Administration verwenden eine Menge interner Symfony-Komponenten, die die Erstellung von erzeugten Actions und Templates im Cache, die Verwendung von Themes und das Übersetzen von Template-Templates automatisieren. 
     1093> 
     1094>Das heißt, dass Symfony für Sie auch alle Werkzeuge vorhält, um Ihren eigenen Generator zu schreiben, der so aussehen kann wie die bereits existierenden - oder komplett anders. Die Erzeugung eines Moduls wird von der Methode `generate()` in `sfGeneratorManager` verwaltet. Um eine Administration zu erstellen, ruft Symfony intern folgendes auf: 
     1095> 
     1096>     [php] 
     1097>     $generator_manager = new sfGeneratorManager(); 
     1098>     $data = $generator_manager->generate('sfPropelAdminGenerator', $parameters); 
     1099> 
     1100>Wenn Sie Ihren eigenen Generator schreiben wollen, sollten Sie die API-Dokumentation der Klassen `sfGeneratorManager` und `sfGenerator` studieren und die Klassen `sfAdminGenerator` und `sfCRUDGenerator` als Beispiele betrachten. 
     1101 
     1102Zusammenfassung 
     1103--------------- 
     1104 
     1105Ob als Grundlage Ihrer Module oder um Ihre Backend-Anwendung automatisch zu erzeugen - die Basis ist stets ein wohldefiniertes Schema und ein Objekt-Modell. Den PHP-Code eines Grundgerüsts können Sie bearbeiten, die erzeugten Module der Administration dagegen können Sie in den meisten Fällen durch die Konfiguration verändern. 
     1106 
     1107Die Datei `generator.yml` stellt das Herzstück für die Programmierung automatisch erzeugter Backends dar. Sie ermöglicht es Ihnen, Inhalt, Features sowie das Look'n'Feel der `list`- und `edit`-Views anzupassen. Sie können die Beschriftung der Felder, Tooltips, Filter, Sortierreihenfolge, Seitenlänge, Eingabearten, Fremdschlüsselbeziehungen, selbstdefinierte Interaktionen und Benutzerrechte direkt in der Datei YAML ändern, ohne eine einzige Zeile PHP zu schreiben. 
     1108 
     1109Wenn der Administrations-Generator ein notwendiges Feature nicht von sich aus unterstützt, geben Ihnen die Partial-Felder sowie die Möglichkeit, Actions zu überschreiben, vollständige Erweiterbarkeit. Zusätzlich können Sie Ihre Anpassungen am Administrations-Generator dank des Theme-Mechanismus' wiederverwenden. 
    9141110}}}