Browse Source

[DOCUMENTATION] German:

- sync up to r16782

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@16936 44c647ce-9c0f-0410-b52a-842ac1e357ba
thomas 16 years ago
parent
commit
68322d06fb

+ 1 - 1
documentation/manual/de/Makefile.in

@@ -61,7 +61,7 @@ html/index.html: $(MANUAL_XML) $(HTML_XSL)
 	$(XMLLINT) --xinclude --output _temp_manual.xml $(MANUAL_XML)
 	$(XSLTPROC) --xinclude --output html/index.html $(HTML_XSL) _temp_manual.xml
 	@echo "Copying manual figures (recursively)..."
-	-[ -d figures ] && cp -r figures html/figures
+	-[ -d figures ] && cp -r figures html/
 
 $(MANUAL_XML): $(MANUAL_XML).in
 	sed -e 's!@DOCBOOK_DTD@!$(DOCBOOK_DTD)!' $< > $@

+ 9 - 2
documentation/manual/de/manual.xml.in

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 16718 -->
+<!-- EN-Revision: 16772 -->
 <!-- Reviewed: no -->
 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
     "@DOCBOOK_DTD@"
@@ -157,6 +157,7 @@
         <xi:include href="module_specs/Zend_Db_Table_Row.xml" />
         <xi:include href="module_specs/Zend_Db_Table_Rowset.xml" />
         <xi:include href="module_specs/Zend_Db_Table-Relationships.xml" />
+        <xi:include href="module_specs/Zend_Db_Table_Definition.xml" />
     </chapter>
 
     <chapter id="zend.debug">
@@ -278,7 +279,13 @@
 
     <chapter id="zend.ldap">
         <title>Zend_Ldap</title>
-        <xi:include href="module_specs/Zend_Ldap.xml" />
+        <xi:include href="module_specs/Zend_Ldap-Introduction.xml" />
+        <xi:include href="module_specs/Zend_Ldap-API.xml" />
+        <xi:include href="module_specs/Zend_Ldap-Usage.xml" />
+        <xi:include href="module_specs/Zend_Ldap-Tools.xml" />
+        <xi:include href="module_specs/Zend_Ldap-Node.xml" />
+        <xi:include href="module_specs/Zend_Ldap-Server.xml" />
+        <xi:include href="module_specs/Zend_Ldap-LDIF.xml" />
     </chapter>
 
     <chapter id="zend.loader">

+ 53 - 8
documentation/manual/de/module_specs/Zend_Db_Table.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 15851 -->
+<!-- EN-Revision: 16772 -->
 <!-- Reviewed: no -->
 <sect1 id="zend.db.table">
 
@@ -25,6 +25,37 @@
 
     </sect2>
 
+    <sect2 id="zend.db.table.concrete">
+        <title>Zend_Db_Table als konkrete Klasse verwenden</title>
+
+        <para>
+            Ab ZF 1.9 kann man Zend_Db_Table instanziieren. Der zusätzliche Vorteil ist das man
+            die Basisklasse nicht erweitern und konfigurieren muß um einfache Operationen wie
+            auswählen, einfügen, aktualisieren und löschen in einer einzelnen Tabelle
+            durchzuführen. Anbei ist ein Beispiel der einfachsten Verwendung.
+        </para>
+
+        <example id="zend.db.table.defining.concrete-instantiation.example1">
+
+            <title>Eine Table Klasse nur mit dem Stringnamen deklarieren</title>
+
+                <programlisting language="php"><![CDATA[
+Zend_Db_Table::setDefaultAdapter($dbAdapter);
+$bugTable = new Zend_Db_Table('bug');
+]]></programlisting>
+
+        </example>
+
+        <para>
+            Das obige Beispiel zeigt das einfachste Beispiel. Nicht alle der unten beschriebenen
+            Optionen sollten für die Konfiguration von Zend_Db_Table Tabellen durchgeführt werden.
+            Wenn man in der Lage sein will das konkrete Verwendungsbeispiel zusätzlich zu den
+            komplexeren Abhängigkeits Features zu verwenden sehen Sie in die
+            Zend_Db_Table_Definition Dokumentation.
+        </para>
+
+    </sect2>
+
     <sect2 id="zend.db.table.defining">
 
         <title>Definieren einer Table Klasse</title>
@@ -865,15 +896,29 @@ $rows = $table->find(array(1234, 5678), array('ABC', 'DEF'));
 
                         <programlisting language="php"><![CDATA[
 // Ein Rowset holen
-$rows = $table->fetchAll('bug_status = "NEW"', 'bug_id ASC', 10, 0);
-$rows = $table->fetchAll($table->select()->where('bug_status = ?', 'NEW')
-                                         ->order('bug_id ASC')
-                                         ->limit(10, 0));
+$rows = $table->fetchAll(
+    'bug_status = "NEW"',
+    'bug_id ASC',
+    10,
+    0
+    );
+$rows = $table->fetchAll(
+    $table->select()
+        ->where('bug_status = ?', 'NEW')
+        ->order('bug_id ASC')
+        ->limit(10, 0)
+    );
 
 // Eine einzelne Zeile holen
-$row = $table->fetchRow('bug_status = "NEW"', 'bug_id ASC');
-$row = $table->fetchRow($table->select()->where('bug_status = ?', 'NEW')
-                                        ->order('bug_id ASC'));
+$row = $table->fetchRow(
+    'bug_status = "NEW"',
+    'bug_id ASC'
+    );
+$row = $table->fetchRow(
+    $table->select()
+        ->where('bug_status = ?', 'NEW')
+        ->order('bug_id ASC')
+    );
 ]]></programlisting>
 
                     </para>

+ 201 - 0
documentation/manual/de/module_specs/Zend_Db_Table_Definition.xml

@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- EN-Revision: 16772 -->
+<!-- Reviewed: no -->
+<sect1 id="zend.db.table.definition">
+
+    <title>Zend_Db_Table_Definition</title>
+
+    <sect2 id="zend.db.table.definition.introduction">
+
+        <title>Introduction</title>
+
+        <para>
+            <classname>Zend_Db_Table_Definition</classname> is a class that can be used to
+            describe the relationships and configuration options that should be used when
+            <classname>Zend_Db_Table</classname> is used via concrete instantiation.
+        </para>
+
+    </sect2>
+
+    <sect2 id="zend.db.table.definition.usage">
+
+        <title>Basic Usage</title>
+
+        <para>
+            For all of the same options that are available when configuring an extended
+            Zend_Db_Table_Abstract class, those options are also available when describing
+            a definition file.  This definition file should be passed to the class at
+            instantiation time so that it can know the full definition of all tables
+            in said definition.
+        </para>
+
+        <para>
+            Below is a definition that will describe the table names and relationships
+            between table objects.  Note: if 'name' is left out of the definition, it
+            will be take as the key of the defined table (an example of this is in the
+            'genre' section in the example below.)
+        </para>
+
+        <example id="zend.db.table.definition.example1">
+
+            <title>Describing the Definition of a Database Data Model</title>
+
+            <programlisting language="php"><![CDATA[
+$definition = new Zend_Db_Table_Definition(array(
+    'author' => array(
+        'name' => 'author',
+        'dependentTables' => array('book')
+        ),
+    'book' => array(
+        'name' => 'book',
+        'referenceMap' => array(
+            'author' => array(
+                'columns' => 'author_id',
+                'refTableClass' => 'author',
+                'refColumns' => 'id'
+                )
+            )
+        ),
+    'genre' => null,
+    'book_to_genre' => array(
+        'referenceMap' => array(
+            'book' => array(
+                'columns' => 'book_id',
+                'refTableClass' => 'book',
+                'refColumns' => 'id'
+                ),
+            'genre' => array(
+                'columns' => 'genre_id',
+                'refTableClass' => 'genre',
+                'refColumns' => 'id'
+                )
+            )
+        )
+    ));
+]]></programlisting>
+
+        </example>
+
+        <para>
+            As you can see, the same options you'd generally see inside of an
+            extended Zend_Db_Table_Abstract class are documented in this
+            array as well.  When passed into Zend_Db_Table constructor, this
+            definition is <emphasis>persisted</emphasis> to any tables it will need
+            to create in order to return the proper rows.
+        </para>
+
+        <para>
+            Below is an example of the primary table instantiation as well as
+            the findDependentRowset() and findManyToManyRowset() calls that will
+            correspond to the data model described above:
+        </para>
+
+
+        <example id="zend.db.table.definition.example2">
+
+            <title>Interacting with the described definition</title>
+
+            <programlisting language="php"><![CDATA[
+$authorTable = new Zend_Db_Table('author', $definition);
+$authors = $authorTable->fetchAll();
+
+foreach ($authors as $author) {
+    echo $author->id . ': ' . $author->first_name . ' ' . $author->last_name . PHP_EOL;
+    $books = $author->findDependentRowset('book');
+    foreach ($books as $book) {
+        echo '    Book: ' . $book->title . PHP_EOL;
+        $genreOutputArray = array();
+        foreach ($book->findManyToManyRowset('genre', 'book_to_genre') as $genreRow) {
+            $genreOutputArray[] = $genreRow->name;
+        }
+        echo '        Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
+    }
+}
+]]></programlisting>
+
+        </example>
+
+
+    </sect2>
+
+    <sect2 id="zend.db.table.definition.advanced-usage">
+
+        <title>Advanced Usage</title>
+
+        <para>
+            Sometimes you want to use both paradigms for defining and using the
+            table gateway: both by extension and concrete instantiation.  To do this
+            simply leave out any table configurations out of the definition.  This will
+            allow Zend_Db_Table to look for the actual refered class instead of the
+            definition key.
+        </para>
+
+        <para>
+            Building on the example above, we will allow for one of the table configurations
+            to be a Zend_Db_Table_Abstract extended class, while keeping the rest of the tables
+            as part of the definition.  We will also show how one would interact with this
+            new definition.
+        </para>
+
+        <example id="zend.db.table.definition.example3">
+
+            <title>Interacting A Mixed Use Zend_Db_Table Definition</title>
+
+            <programlisting language="php"><![CDATA[
+class MyBook extends Zend_Db_Table_Abstract
+{
+    protected $_name = 'book';
+    protected $_referenceMap = array(
+        'author' => array(
+            'columns' => 'author_id',
+            'refTableClass' => 'author',
+            'refColumns' => 'id'
+            )
+        );
+}
+
+$definition = new Zend_Db_Table_Definition(array(
+    'author' => array(
+        'name' => 'author',
+        'dependentTables' => array('MyBook')
+        ),
+    'genre' => null,
+    'book_to_genre' => array(
+        'referenceMap' => array(
+            'book' => array(
+                'columns' => 'book_id',
+                'refTableClass' => 'MyBook',
+                'refColumns' => 'id'
+                ),
+            'genre' => array(
+                'columns' => 'genre_id',
+                'refTableClass' => 'genre',
+                'refColumns' => 'id'
+                )
+            )
+        )
+    ));
+
+$authorTable = new Zend_Db_Table('author', $definition);
+$authors = $authorTable->fetchAll();
+
+foreach ($authors as $author) {
+    echo $author->id . ': ' . $author->first_name . ' ' . $author->last_name . PHP_EOL;
+    $books = $author->findDependentRowset(new MyBook());
+    foreach ($books as $book) {
+        echo '    Book: ' . $book->title . PHP_EOL;
+        $genreOutputArray = array();
+        foreach ($book->findManyToManyRowset('genre', 'book_to_genre') as $genreRow) {
+            $genreOutputArray[] = $genreRow->name;
+        }
+        echo '        Genre: ' . implode(', ', $genreOutputArray) . PHP_EOL;
+    }
+}
+
+]]></programlisting>
+
+        </example>
+
+    </sect2>
+
+</sect1>

+ 0 - 463
documentation/manual/de/module_specs/Zend_Ldap.xml

@@ -1,463 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 15742 -->
-<!-- Reviewed: no -->
-<sect1 id="zend.ldap.using">
-
-    <title>Einleitung</title>
-
-    <note>
-        <title>Minimale Funktionalität</title>
-        <para>
-            Im Moment ist diese Klasse nur dafür gedacht, die beschränkte Funktionalität zu bieten,
-            die für <link
-                linkend="zend.auth.adapter.ldap"><classname>Zend_Auth_Adapter_Ldap</classname></link>
-            nötig ist. Weiterführende Verwendungsmöglichkeiten wie das Suchen, Erstellen,
-            Bearbeiten oder Umbenennen von Objekten im Verzeichnis werden im Moment nicht
-            unterstützt und werden zu einem späteren Zeitpunkt hinzugefügt werden.
-        </para>
-    </note>
-
-    <para>
-        <classname>Zend_Ldap</classname> ist eine Klasse, mit der LDAP-Operationen, wie das
-        Durchsuchen, das Bearbeiten oder die Bindung an Einträge im LDAP-Verzeichnis, durchgeführt
-        werden können.
-    </para>
-
-    <sect2 id="zend.ldap.using.theory-of-operation">
-
-        <title>Beschreibung</title>
-
-        <para>
-            Diese Komponente besteht im Moment aus zwei Klassen, <classname>Zend_Ldap</classname>
-            und <classname>Zend_Ldap_Exception</classname>. Ein
-            <classname>Zend_Ldap</classname>-Objekt repräsentiert konzeptionell die Bindung an einen
-            einzelnen LDAP server. Die Parameter für diese Bindung können explizit oder in der form
-            eines Optionen-Arrays angegeben werden.
-        </para>
-
-        <para>
-            Die Verwendung von <classname>Zend_Ldap</classname> hängt von der Art Ihres LDAP-Servers
-            ab und kann am besten mit einigen einfachen Beispielen erklärt werden.
-        </para>
-
-        <para>
-            Wenn Sie OpenLDAP benutzen, wäre ein einfaches Beispiel das Folgende (Beachten Sie:
-            Die Option <code>bindRequiresDn</code> ist wichtig, wenn Sie <emphasis>nicht</emphasis>
-            Microsoft Active Directory benutzen):
-
-            <programlisting language="php"><![CDATA[
-$options = array(
-    'host' => 's0.foo.net',
-    'username' => 'CN=user1,DC=foo,DC=net',
-    'password' => 'pass1',
-    'bindRequiresDn' => true,
-    'accountDomainName' => 'foo.net',
-    'baseDn' => 'OU=Sales,DC=foo,DC=net',
-);
-$ldap = new Zend_Ldap($options);
-$acctname = $ldap->getCanonicalAccountName('abaker',
-                                           Zend_Ldap::ACCTNAME_FORM_DN);
-echo "$acctname\n";
-]]></programlisting>
-
-        </para>
-
-        <para>
-            Wenn Sie Microsoft Active Directory nutzen, sollte das folgende Beispiel funktionieren:
-
-            <programlisting language="php"><![CDATA[
-$options = array(
-    'host' => 'dc1.w.net',
-    'useStartTls' => true,
-    'username' => 'user1@w.net',
-    'password' => 'pass1',
-    'accountDomainName' => 'w.net',
-    'accountDomainNameShort' => 'W',
-    'baseDn' => 'CN=Users,DC=w,DC=net',
-);
-$ldap = new Zend_Ldap($options);
-$acctname = $ldap->getCanonicalAccountName('bcarter',
-                                           Zend_Ldap::ACCTNAME_FORM_DN);
-echo "$acctname\n";
-]]></programlisting>
-
-            Beachten Sie, dass wir die Methode <code>getCanonicalAccountName()</code> hier nur
-            benutzen, um den Domain-Name des Accounts 'bcarter' zu erhalten, weil das so ziemlich
-            alles von dem wenigen Code, der im Moment in dieser Klasse vorhanden ist, verwendet.
-        </para>
-
-        <sect3 id="zend.ldap.using.theory-of-operation.username-canonicalization-automatic">
-
-            <title>Automatische Normalisierung des Benutzernamens bei der Server-Bindung</title>
-
-            <para>
-                Wenn <code>bind()</code> mit einem nicht-DN-konformen Benutzernamen aufgerufen wird
-                aber <code>bindRequiresDN</code> <constant>TRUE</constant> ist und kein Benutzername in
-                DN-Form als Option angegeben wird, wird die Server-Bindung fehlschlagen. Wenn
-                allerdings ein Benutzername in DN-Form im Optionen-Array übergeben wurde, wird
-                <classname>Zend_Ldap</classname> sich zuerst mit diesem Benutzernamen an den Server
-                binden, den Account-Domain Name für den Benutzernamen, der <code>bind()</code>
-                suchen und sich dann neu mit diesem DN verbinden.
-            </para>
-
-            <para>
-                Dieses Verhalten ist wichtig für <classname>Zend_Auth_Adapter_Ldap</classname>, das
-                den eingegebenen Benutzernamen direkt an <code>bind()</code> weiterleitet.
-            </para>
-
-            <para>
-                Das folgende Beispiel zeigt, wie der nicht DN-konforme Benutzername
-                '<code>abaker</code>' mit <code>bind()</code> benutzt werden kann:
-
-                <programlisting language="php"><![CDATA[
-$options = array(
-        'host' => 's0.foo.net',
-        'username' => 'CN=user1,DC=foo,DC=net',
-        'password' => 'pass1',
-        'bindRequiresDn' => true,
-        'accountDomainName' => 'foo.net',
-        'baseDn' => 'OU=Sales,DC=foo,DC=net',
-);
-$ldap = new Zend_Ldap($options);
-$ldap->bind('abaker', 'moonbike55');
-$acctname = $ldap->getCanonicalAccountName('abaker',
-                                           Zend_Ldap::ACCTNAME_FORM_DN);
-echo "$acctname\n";
-]]></programlisting>
-
-                Der Aufruf von <code>bind()</code> in diesem Beispiel erkennt dass der Benutzername
-                '<code>abaker</code>' nicht in DN-Form ist und dass <code>bindRequiresDn</code>
-                <constant>TRUE</constant> ist, verwendet '<code>CN=user1,DC=foo,DC=net</code>' und
-                '<code>pass1</code>' zum Verbinden, empfängt den DN für '<code>abaker</code>',
-                löst die Bindung und bindet sich dann neu mit dem jetzt bekannten
-                '<code>CN=Alice Baker,OU=Sales,DC=foo,DC=net</code>'.
-            </para>
-
-        </sect3>
-
-        <sect3 id="zend.ldap.using.theory-of-operation.options">
-
-            <title>Zend_Ldap Optionen</title>
-
-            <para>
-                Die <classname>Zend_Ldap</classname>-Komponente akzeptiert ein Array von Optionen,
-                das entweder im Konstruktor oder der Methode <code>setOptions()</code> übergeben
-                werden kann. Folgende Optionen sind möglich:
-
-                <table id="zend.ldap.using.theory-of-operation.options.table">
-                  <title>Zend_Ldap Optionen</title>
-                  <tgroup cols="2">
-                    <thead>
-                      <row>
-                        <entry>Name</entry>
-                        <entry>Beschreibung</entry>
-                      </row>
-                    </thead>
-                    <tbody>
-                      <row>
-                        <entry>host</entry>
-                        <entry>
-                            Host-Name des LDAP-Servers, wenn er nicht in <code>connect()</code>
-                            überschrieben wird. (kann auch verwendet werden, wenn die Komponente
-                            versucht, Benutzernamen in <code>bind()</code> zu normalisieren).
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>port</entry>
-                        <entry>
-                            Port des LDAP-Servers, wenn er nicht in <code>connect()</code>
-                            überschrieben wird.
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>useStartTls</entry>
-                        <entry>
-                            Ob der LDAP-Client TLS (auch SSL-v2) verschlüsselte Übertragung
-                            verwenden soll. Der Wert <constant>TRUE</constant> ist auf jeden Fall in
-                            Produktivumgebungen empfohlen, damit Passwörter nicht im Klartext
-                            übertragen werden. Der Standardwert ist <constant>FALSE</constant>, weil Server
-                            fast immer verlangen, dass ein Verschlüsselungszertifikat
-                            nachinstalliert wird.
-                        </entry>
-                      </row>
-                      <row>
-                          <entry>useSsl</entry>
-                          <entry>
-                            Ob der LDAP Client SSL verschüsselte Übertragung unterstützen sollten
-                            oder nicht. Die <code>useSsl</code> und <code>useStartTls</code>
-                            Optionen sind gegenseitig exklusiv.
-                          </entry>
-                        </row>
-                      <row>
-                        <entry>username</entry>
-                        <entry>
-                            Der Standard-Benutzername. Bei manchen Servern muss dieser in DN-Form
-                            vorliegen.
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>password</entry>
-                        <entry>
-                            Das Passwort des Standard-Benutzernamens.
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>bindRequiresDn</entry>
-                        <entry>
-                            Wenn dieser Wert<constant>TRUE</constant> ist, wird
-                            <classname>Zend_Ldap</classname> den Domain-Name für den Account, der
-                            zur Bindung genutzt wird, suchen, wenn der Benutzername noch nicht in
-                            DN-Form ist. Der Standardwert ist <constant>FALSE</constant>.
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>baseDn</entry>
-                        <entry>
-                            Der Standard-DN, unter dem gesucht wird (bspw. Accounts). Diese Option
-                            wird für die meisten Account-Bezogenen Vorgänge benötigt und sollte
-                            den DN beinhalten, unter dem die Accounts liegen.
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>accountCanonicalForm</entry>
-                        <entry>
-                            Eine Integerzahl, die die Art angibt, in der Account-Namen normalisiert
-                            werden. Schauen Sie für mehr Informationen in die Tabelle
-                            <emphasis>Accountnamen-Normalisierung</emphasis> weiter unten.
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>accountDomainName</entry>
-                        <entry>
-                            Der vollqualifizierte Domain-Name, für den der LDAP-Server eine
-                            Autorität ist.
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>accountDomainNameShort</entry>
-                        <entry>
-                            Der 'Kurz'-Domain-Name für den der LDAP-Server eine Autorität ist.
-                            Wird normalerweise in Windows-Netzwerken genutzt, um NetBIOS-Namen zu
-                            definieren, kann aber auch von Nicht-AD-Servern genutzt werden.
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>accountFilterFormat</entry>
-                        <entry>
-                            Der LDAP-Suchfilter, der verwendet wird, um Accounts zu suchen. Dieser
-                            String ist ein Ausdruck im Stil von <ulink
-                                url="http://php.net/printf"><code>printf()</code></ulink>,
-                            der ein '<code>%s</code>' enthalten muss, das durch den Benutzernamen
-                            ersetzt wird. Der Standardwert ist
-                            '<code>(&amp;(objectClass=user)(sAMAccountName=%s))</code>', es sei denn
-                            <code>bindRequiresDn</code> ist <constant>TRUE</constant>. In diesem Fall ist
-                            der Standardwert
-                            '<code>(&amp;(objectClass=posixAccount)(uid=%s))</code>'.
-                            Wenn eigene Schemata benutzt werden, muss diese Option vielleicht
-                            geändert werden.
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>allowEmptyPassword</entry>
-                        <entry>
-                            Einige LDAP Server können so konfiguriert werden das Sie ein leeres
-                            Passwort als anonyme Bindung akzeptieren. Dieses Verhalten ist fast
-                            immer unerwünscht. Aus diesem Grund sind leere Passwörter explizit nicht
-                            erlaubt. Wenn dieser Wert auf <constant>TRUE</constant> gesetzt wird ist die
-                            Übermittlung eines leeres Passwortes wärend des Bindens erlaubt.
-                        </entry>
-                      </row>
-                      <row>
-                        <entry>optReferrals</entry>
-                        <entry>
-                            Auf <constant>TRUE</constant> gesetzt, zeigt diese Option dem LDAP Client das
-                            Referenzen gefolgt werden soll. Der Standardwert ist <constant>FALSE</constant>.
-                        </entry>
-                      </row>
-                    </tbody>
-                  </tgroup>
-                </table>
-
-            </para>
-
-        </sect3>
-
-        <sect3 id="zend.ldap.using.theory-of-operation.account-name-canonicalization">
-
-            <title>Normalisierung von Accountnamen</title>
-
-            <para>
-                Die Optionen <code>accountDomainName</code> and <code>accountDomainNameShort</code>
-                werden für zwei Zwecke genutzt: Erstens bieten sie Mehrdomain-Authentifizierung und
-                Möglichkeiten zur Ausfallsicherung, und zweitens werden sie benutzt, um
-                Benutzernamen zu normalisieren, nach der Vorgabe der Option
-                <code>accountCanonicalForm</code>. Diese Option kann einen der folgenden Werte
-                annehmen:
-
-                <table id="zend.ldap.using.theory-of-operation.account-name-canonicalization.table">
-                  <title>accountCanonicalForm</title>
-                  <tgroup cols="3">
-                    <thead>
-                      <row>
-                        <entry>Name</entry>
-                        <entry>Wert</entry>
-                        <entry>Beispiel</entry>
-                      </row>
-                    </thead>
-                    <tbody>
-                      <row>
-                        <entry><code>ACCTNAME_FORM_DN</code></entry>
-                        <entry>1</entry>
-                        <entry>CN=Alice Baker,CN=Users,DC=example,DC=com</entry>
-                      </row>
-                      <row>
-                        <entry><code>ACCTNAME_FORM_USERNAME</code></entry>
-                        <entry>2</entry>
-                        <entry>abaker</entry>
-                      </row>
-                      <row>
-                        <entry><code>ACCTNAME_FORM_BACKSLASH</code></entry>
-                        <entry>3</entry>
-                        <entry>EXAMPLE\abaker</entry>
-                      </row>
-                      <row>
-                        <entry><code>ACCTNAME_FORM_PRINCIPAL</code></entry>
-                        <entry>4</entry>
-                        <entry>abaker@example.com</entry>
-                      </row>
-                    </tbody>
-                  </tgroup>
-                </table>
-
-            </para>
-
-            <para>
-                Die standardmäßige Normalisierung hängt davon am, welche Optionen zum Account-DN
-                übergeben wurden. Wenn <code>accountDomainNameShort</code> angegeben wurde, ist
-                der Standardwert von <code>accountCanonicalForm</code>
-                <code>ACCTNAME_FORM_BACKSLASH</code>. Wenn dagegen <code>accountDomainName</code>
-                angegeben wurde, ist der Standardwert <code>ACCTNAME_FORM_PRINCIPAL</code>.
-            </para>
-
-            <para>
-                Die Normalisierung von Account-Namen stellt sicher, dass der String, der zur
-                Identifizierung eines Accounts verwendet wird, einheitlich ist, egal was
-                an <code>bind()</code> übergeben wurde. Wenn der Benutzer bspw.
-                <emphasis>abaker@example.com</emphasis> oder einfach <emphasis>abaker</emphasis>
-                als Benutzernamen angibt und <code>accountCanonicalForm</code> auf 3 gesetzt ist,
-                wird der normalisierte Name <emphasis>EXAMPLE\abaker</emphasis> sein.
-            </para>
-
-        </sect3>
-
-        <sect3 id="zend.ldap.using.theory-of-operation.multi-domain-failover">
-
-            <title>Authentifizierung auf mehreren Domains und Ausfallsicherung</title>
-
-            <para>
-                <classname>Zend_Ldap</classname> an sich wird nicht versuchen, sich mit mehreren
-                Servern zu verbinden. Allerdings ist <classname>Zend_Ldap</classname> auf dieses
-                Szenario vorbereitet. Dazu können Sie einfach ein Array mit Optionen für mehrere
-                Server durchlaufen und nacheinander versuchen, sich mit jedem Server zu verbinden.
-                Wie oben beschrieben wird <code>bind()</code> automatisch jeden Benutzernamen
-                normalisieren, also ist es egal, ob der Benutzer <code>abaker@foo.net</code> oder
-                <code>W\bcarter</code> oder <code>cdavis</code> als Benutzernamen angibt -
-                <code>bind()</code> wird fehlschlagen, wenn der Login nicht erfolgreich war.
-            </para>
-
-            <para>
-                Das folgende Beispiel zeigt Authentifizierung auf mehreren Domains und eine
-                Ausfallsicherung.
-
-                <programlisting language="php"><![CDATA[
-$acctname = 'W\\user2';
-$password = 'pass2';
-
-$multiOptions = array(
-    'server1' => array(
-        'host' => 's0.foo.net',
-        'username' => 'CN=user1,DC=foo,DC=net',
-        'password' => 'pass1',
-        'bindRequiresDn' => true,
-        'accountDomainName' => 'foo.net',
-        'accountDomainNameShort' => 'FOO',
-        'accountCanonicalForm' => 4, // ACCT_FORM_PRINCIPAL
-        'baseDn' => 'OU=Sales,DC=foo,DC=net',
-    ),
-    'server2' => array(
-        'host' => 'dc1.w.net',
-        'useSsl' => true,
-        'username' => 'user1@w.net',
-        'password' => 'pass1',
-        'accountDomainName' => 'w.net',
-        'accountDomainNameShort' => 'W',
-        'accountCanonicalForm' => 4, // ACCT_FORM_PRINCIPAL
-        'baseDn' => 'CN=Users,DC=w,DC=net',
-    ),
-);
-
-$ldap = new Zend_Ldap();
-
-foreach ($multiOptions as $name => $options) {
-
-    echo "Versuche, mit den Server-Optionen für '$name' zu verbinden\n";
-
-    $ldap->setOptions($options);
-    try {
-        $ldap->bind($acctname, $password);
-        $acctname = $ldap->getCanonicalAccountName($acctname);
-        echo "AUSGEFÜHRT: $acctname angemeldet\n";
-        return;
-    } catch (Zend_Ldap_Exception $zle) {
-        echo '  ' . $zle->getMessage() . "\n";
-        if ($zle->getCode() === Zend_Ldap_Exception::LDAP_X_DOMAIN_MISMATCH) {
-            continue;
-        }
-    }
-}
-]]></programlisting>
-
-                Wenn die Bindung an einen Server aus irgendeinem Grund fehlschlägt, wird sie
-                mit dem nächsten Server erneut versucht.
-            </para>
-
-            <para>
-                Der Aufruf von <code>getCanonicalAccountName</code> gibt den normalisierten
-                Account-Namen zurück, den die Anwendung vermutlich benutzen würde, um Daten - wie
-                bspw. Einstellungen - damit zu assoziieren. Die Option
-                <code>accountCanonicalForm = 4</code>, die in diesem Fall in den Optionen aller
-                Server gesetzt ist, stellt sicher, dass die normalisierte Form in einem
-                einheitlichen Format ist, egal welcher Server am Ende benutzt wurde.
-            </para>
-
-            <para>
-                Die besondere Ausnahme <code>LDAP_X_DOMAIN_MISMATCH</code> tritt auf, wenn ein
-                Account-Name angegeben wurde, der einen Domain-Teil beinhaltet (bspw.
-                <code>abaker@foo.net</code> oder <code>FOO\abaker</code> und nicht nur
-                <code>abaker</code>), aber dieser Domain-Teil mit keiner Domain in den aktuell
-                ausgewählten Server-Optionen übereinstimmt. Diese Ausnahme zeigt an, dass der
-                Server keine Autorität für diesen Account ist. In diesem Fall wird eine Bindung
-                nicht ausgeführt, um unnötige Server-Anfragen zu vermeiden. Beachten Sie, dass
-                die Anweisung <code>continue</code> in diesem Beispiel keine Auswirkung hat, aber
-                Sie werden im praktischen Einsatz zur Fehlerbehandlung und aus Debugging-Gründen
-                wahrscheinlich neben <code>LDAP_X_DOMAIN_MISMATCH</code> auch noch auf die
-                Exception-Codes <code>LDAP_NO_SUCH_OBJECT</code> und
-                <code>LDAP_INVALID_CREDENTIALS</code> prüfen wollen.
-            </para>
-
-            <para>
-                Der obige Code ist dem sehr ähnlich, der in <link
-                    linkend="zend.auth.adapter.ldap"><classname>Zend_Auth_Adapter_Ldap</classname></link>
-                verwendet wird. Wir empfehlen daher, einfach den Authentifizierungs-Adapter
-                für Multi-Domain-Authentifizierung und LDAP-basierte Authentifizierung mit
-                Ausfallsicherung zu verwenden (oder kopieren Sie den Code oben).
-            </para>
-
-        </sect3>
-
-    </sect2>
-
-</sect1>
-<!--
-vim:se ts=4 sw=4 et:
--->

+ 219 - 6
documentation/manual/de/ref/coding_standard.xml

@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 16626 -->
+<!-- EN-Revision: 16734 -->
 <!-- Reviewed: no -->
 <appendix id="coding-standard">
   <title>Zend Framework Coding Standard für PHP</title>
@@ -170,6 +170,56 @@
             </note>
         </sect2>
 
+        <sect2 id="coding-standard.naming-conventions.abstracts">
+            <title>Abstrakte Klassen</title>
+
+            <para>
+                Generell folgen abstrakte Klassen der gleichen Konvention wie <link
+                    linkend="coding-standard.naming-conventions.classes">Klasses</link>, mit einer
+                zusätzlichen Regel: Die Namen von abstrakten Klassen müssen mit derm Term
+                "Abstract" enden, und dem Term darf kein Unterstrich vorangestellt sein. Als
+                Beispiel wird <classname>Zend_Controller_Plugin_Abstract</classname> als ungültig
+                angenommen, aber <classname>Zend_Controller_PluginAbstract</classname> oder
+                <classname>Zend_Controller_Plugin_PluginAbstract</classname> wären gültige Namen.
+            </para>
+
+            <note>
+                <para>
+                    Diese Namens Konvention ist neu mit Version 1.9.0 des Zend Frameworks. Bei
+                    Klassen vor dieser Version kann es sein das sie dieser Regel nicht folgen, aber
+                    Sie werden in Zukunft umbenannt um zu entsprechen.
+                </para>
+            </note>
+        </sect2>
+
+        <sect2 id="coding-standard.naming-conventions.interfaces">
+            <title>Interfaces</title>
+
+            <para>
+                Generell folgen Interfaces der gleichen Konvention wie <link
+                    linkend="coding-standard.naming-conventions.classes">Klasses</link>, mit einer
+                zusätzlichen Regel: Die Namen von Interfaces können optional mit dem Term
+                "Interface" enden, aber dem Term darf kein Unterstrich vorangestellt sein. Als
+                Beispiel wird <classname>Zend_Controller_Plugin_Interface</classname> als ungültig
+                angenommen, aber <classname>Zend_Controller_PluginInterface</classname> oder
+                <classname>Zend_Controller_Plugin_PluginInterface</classname> wären gültige Namen.
+            </para>
+
+            <para>
+                Wärend diese Regel nicht benötigt wird, wird Sie stark empfohlen, da Sie
+                Entwicklern einen guten visuellen Hinweis gibt welche Dateien ein Interface
+                enthalten und welche Klassen.
+            </para>
+
+            <note>
+                <para>
+                    Diese Namens Konvention ist neu mit Version 1.9.0 des Zend Frameworks. Bei
+                    Klassen vor dieser Version kann es sein das sie dieser Regel nicht folgen, aber
+                    Sie werden in Zukunft umbenannt um zu entsprechen.
+                </para>
+            </note>
+        </sect2>
+
         <sect2 id="coding-standard.naming-conventions.filenames">
             <title>Dateinamen</title>
 
@@ -454,6 +504,30 @@ $sampleArray = array(1, 2, 3, 'Zend', 'Studio',
                      $a, $b, $c,
                      56.44, $d, 500);
 ]]></programlisting>
+
+                <para>
+                    Alternativ kann das beginnende Array Element in der folgenden Zeile beginnen.
+                    Wenn das so ist, sollte es um ein Einrückungslevel tiefer stehen als die
+                    Zeile welche die Array Deklaration enthält und alle folgenden Zeilen sollten
+                    die gleiche Einrückung haben; der schließende Teil sollte in einer eigenen
+                    Zeile stehen und das gleiche Einrückungslevel haben wie die Zeile welche die
+                    Array Deklaration enthält:
+                </para>
+
+                <programlisting language="php"><![CDATA[
+$sampleArray = array(
+    1, 2, 3, 'Zend', 'Studio',
+    $a, $b, $c,
+    56.44, $d, 500,
+);
+]]></programlisting>
+
+                <para>
+                    Wenn die letztere Deklaration verwendet wird, empfehlen wir ein endendes Komma
+                    für das letzte Element im Array zu verwenden; das minimiert das Problem beim
+                    Hinzufügen von neuen Elements bei zusätzlichen Zeilen, und hilft
+                    sicherzustellen das durch ein fehlendes Komma keine Parsing Fehler auftreten.
+                </para>
             </sect3>
 
             <sect3 id="coding-standard.coding-style.arrays.associative">
@@ -470,6 +544,30 @@ $sampleArray = array(1, 2, 3, 'Zend', 'Studio',
 $sampleArray = array('firstKey'  => 'firstValue',
                      'secondKey' => 'secondValue');
 ]]></programlisting>
+
+                <para>
+                    Alternativ kann das beginnende Array Element in der folgenden Zeile beginnen.
+                    Wenn das so ist, sollte es um ein Einrückungslevel tiefer stehen als die
+                    Zeile welche die Array Deklaration enthält und alle folgenden Zeilen sollten
+                    die gleiche Einrückung haben; der schließende Teil sollte in einer eigenen
+                    Zeile stehen und das gleiche Einrückungslevel haben wie die Zeile welche die
+                    Array Deklaration enthält. Wegen der Lesbarkeit sollten die verschiedenen
+                    "=>" Operatoren so eingerückt werden das Sie untereinander stehen.
+                </para>
+
+                <programlisting language="php"><![CDATA[
+$sampleArray = array(
+    'firstKey'  => 'firstValue',
+    'secondKey' => 'secondValue',
+);
+]]></programlisting>
+
+                <para>
+                    Wenn die letztere Deklaration verwendet wird, empfehlen wir ein endendes Komma
+                    für das letzte Element im Array zu verwenden; das minimiert das Problem beim
+                    Hinzufügen von neuen Elements bei zusätzlichen Zeilen, und hilft
+                    sicherzustellen das durch ein fehlendes Komma keine Parsing Fehler auftreten.
+                </para>
             </sect3>
         </sect2>
 
@@ -520,6 +618,49 @@ class SampleClass
     // muss mit vier Leerzeichen eingerückt sein
 }
 ]]></programlisting>
+
+                <para>
+                    Klassen die andere Klassen erweitern oder welche Interfaces implementieren
+                    sollen Ihre Abhängigkeit auf der gleichen Zeile deklarieren wenn das möglich
+                    ist.
+                </para>
+
+                <programlisting language="php"><![CDATA[
+class SampleClass extends FooAbstract implements BarInterface
+{
+}
+]]></programlisting>
+
+                <para>
+                    Wenn als Ergebnis so einer Deklaration, die Länge der Zeile die <link
+                        linkend="coding-standard.php-file-formatting.max-line-length">Maximale
+                        Zeilenlänge</link> überschreitet, ist die Zeile vor dem "extends" und
+                    oder "implements" Schlüsselwort umzubrechen und diese Zeilen um ein
+                    Einrückungslevel einzurücken.
+                </para>
+
+                <programlisting language="php"><![CDATA[
+class SampleClass
+    extends FooAbstract
+    implements BarInterface
+{
+}
+]]></programlisting>
+
+                <para>
+                    Wenn die Klasse mehrere Interfaces implementiert und die Deklaration die
+                    maximale Zeilenlänge übersteigt, ist nach jedem Komma umzubrechen und die
+                    Interfaces zu separieren, und die Namen des Interfaces so einzurücken das Sie
+                    untereinander stehen.
+                </para>
+
+                <programlisting language="php"><![CDATA[
+class SampleClass
+    implements BarInterface,
+               BazInterface
+{
+}
+]]></programlisting>
             </sect3>
 
             <sect3 id="coding-standard.coding-style.classes.member-variables">
@@ -597,6 +738,37 @@ class Foo
 }
 ]]></programlisting>
 
+                <para>
+                    In den Fällen wo die Liste der Argumente die <link
+                        linkend="coding-standard.php-file-formatting.max-line-length">maximale
+                        Zeilenlänge</link> überschreitet, sollten Zeilenumbrüche eingeführt werden.
+                    Zusätzliche Argumente der Funktion oder Methode müssen durch einen zusätzlichen
+                    Einrückungslevel nach der Funktion oder Methodendeklaration eingerückt werden.
+                    Ein Zeilenumbruch sollte dann vor dem schließenden Argument stattfinden,
+                    welcher in der gleichen Zeile platziert werden sollte wie die öffnende Klammer
+                    der Funktion oder Methode mit einem einzelnen Leerzeichen das die zwei trennt,
+                    und mit dem gleichen Einrückungslevel wie die Deklaration der Funktion oder
+                    Methode. Das folgende ist ein Beispiel so einer Situation:
+
+                    <programlisting language="php"><![CDATA[
+/**
+ * Dokumentations Block Hier
+ */
+class Foo
+{
+    /**
+     * Dokumentations Block Hier
+     */
+    public function bar($arg1, $arg2, $arg3,
+        $arg4, $arg5, $arg6
+    ) {
+        // gesamter Inhalt der Funktion
+        // muss durch view Leerzeichen eingerückt sein
+    }
+}
+]]></programlisting>
+                </para>
+
                 <note>
                     <para>
                         <emphasis>Notiz</emphasis>: Die Übergabe per Referenz ist die einzige
@@ -686,6 +858,12 @@ threeArguments(array(1, 2, 3), 2, 3);
 threeArguments(array(1, 2, 3, 'Zend', 'Studio',
                      $a, $b, $c,
                      56.44, $d, 500), 2, 3);
+
+threeArguments(array(
+    1, 2, 3, 'Zend', 'Studio',
+    $a, $b, $c,
+    56.44, $d, 500
+), 2, 3);
 ]]></programlisting>
             </sect3>
         </sect2>
@@ -724,6 +902,33 @@ if ($a != 2) {
 ]]></programlisting>
 
                 <para>
+                    Wenn die Kontrollanweisung die Ursache für eine Überschreitung der <link
+                        linkend="coding-standard.php-file-formatting.max-line-length">maximalen
+                        Zeilenlänge</link> ist, und sie mehrere Anweisungen hat, kann die
+                    Kontrollanweisung in mehrere Zeilen gebrochen werden. In solchen Fällen, ist
+                    die Zeile vor dem logischen Operator zu brechen und die Zeile so einzurücken
+                    das Sie unter dem ersten Zeichen der Kontrollanweisung steht. Der schließende
+                    Teil der Kontrollanweisung ist mit der öffnenden Klammer in einer eigenen Zeile
+                    zu platzieren, wobei ein einzelnes Leerzeichen die zwei trennen muß, und der
+                    Einrückungslevel identisch mit der öffenden Kontrollanweisung sein ist.
+                </para>
+
+                <programlisting language="php"><![CDATA[
+if (($a == $b)
+    && ($b == $c)
+    || (Foo::CONST == $d)
+) {
+    $a = $d;
+}
+]]></programlisting>
+
+                <para>
+                    Die Einrückung des späteren Deklarationsformats dient der Vorbeugung von
+                    Problemen beim Hinzufügen oder entfernen von Klauseln von der Kontrollanweisung
+                    bei späteren Revisionen.
+                </para>
+
+                <para>
                     Für "if" Anweisungen die "elseif" oder "else" beinhalten, sind die Konventionen
                     der Formatierung ähnlich dem "if" Konstrukt. Das folgende Beispiel zeigt gültige
                     Formatierungen für "if" Anweisungen mit "else" und/oder "elseif" Konstrukten:
@@ -743,6 +948,19 @@ if ($a != 2) {
 } else {
     $a = 7;
 }
+
+if (($a == $b)
+    && ($b == $c)
+    || (Foo::CONST == $d)
+) {
+    $a = $d;
+} elseif (($a != $b)
+          || ($b != $c)
+) {
+    $a = $c;
+} else {
+    $a = $b;
+}
 ]]></programlisting>
 
                 <para>
@@ -751,11 +969,6 @@ if ($a != 2) {
                     es müssen alle "if", "elseif" oder "else" Anweisungen in Klammern geschrieben
                     werden.
                 </para>
-
-                <para>
-                    Die Verwendung des "elseif" Konstruktes ist erlaubt es wird aber strengstens
-                    davon abgeraten und es ist die "else if" Kombination zu bevorzugen.
-                </para>
             </sect3>
 
             <sect3 id="coding-standards.coding-style.control-statements.switch">