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)
 	$(XMLLINT) --xinclude --output _temp_manual.xml $(MANUAL_XML)
 	$(XSLTPROC) --xinclude --output html/index.html $(HTML_XSL) _temp_manual.xml
 	$(XSLTPROC) --xinclude --output html/index.html $(HTML_XSL) _temp_manual.xml
 	@echo "Copying manual figures (recursively)..."
 	@echo "Copying manual figures (recursively)..."
-	-[ -d figures ] && cp -r figures html/figures
+	-[ -d figures ] && cp -r figures html/
 
 
 $(MANUAL_XML): $(MANUAL_XML).in
 $(MANUAL_XML): $(MANUAL_XML).in
 	sed -e 's!@DOCBOOK_DTD@!$(DOCBOOK_DTD)!' $< > $@
 	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"?>
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 16718 -->
+<!-- EN-Revision: 16772 -->
 <!-- Reviewed: no -->
 <!-- Reviewed: no -->
 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
 <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.4//EN"
     "@DOCBOOK_DTD@"
     "@DOCBOOK_DTD@"
@@ -157,6 +157,7 @@
         <xi:include href="module_specs/Zend_Db_Table_Row.xml" />
         <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_Rowset.xml" />
         <xi:include href="module_specs/Zend_Db_Table-Relationships.xml" />
         <xi:include href="module_specs/Zend_Db_Table-Relationships.xml" />
+        <xi:include href="module_specs/Zend_Db_Table_Definition.xml" />
     </chapter>
     </chapter>
 
 
     <chapter id="zend.debug">
     <chapter id="zend.debug">
@@ -278,7 +279,13 @@
 
 
     <chapter id="zend.ldap">
     <chapter id="zend.ldap">
         <title>Zend_Ldap</title>
         <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>
 
 
     <chapter id="zend.loader">
     <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"?>
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 15851 -->
+<!-- EN-Revision: 16772 -->
 <!-- Reviewed: no -->
 <!-- Reviewed: no -->
 <sect1 id="zend.db.table">
 <sect1 id="zend.db.table">
 
 
@@ -25,6 +25,37 @@
 
 
     </sect2>
     </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">
     <sect2 id="zend.db.table.defining">
 
 
         <title>Definieren einer Table Klasse</title>
         <title>Definieren einer Table Klasse</title>
@@ -865,15 +896,29 @@ $rows = $table->find(array(1234, 5678), array('ABC', 'DEF'));
 
 
                         <programlisting language="php"><![CDATA[
                         <programlisting language="php"><![CDATA[
 // Ein Rowset holen
 // 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
 // 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>
 ]]></programlisting>
 
 
                     </para>
                     </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"?>
 <?xml version="1.0" encoding="UTF-8"?>
-<!-- EN-Revision: 16626 -->
+<!-- EN-Revision: 16734 -->
 <!-- Reviewed: no -->
 <!-- Reviewed: no -->
 <appendix id="coding-standard">
 <appendix id="coding-standard">
   <title>Zend Framework Coding Standard für PHP</title>
   <title>Zend Framework Coding Standard für PHP</title>
@@ -170,6 +170,56 @@
             </note>
             </note>
         </sect2>
         </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">
         <sect2 id="coding-standard.naming-conventions.filenames">
             <title>Dateinamen</title>
             <title>Dateinamen</title>
 
 
@@ -454,6 +504,30 @@ $sampleArray = array(1, 2, 3, 'Zend', 'Studio',
                      $a, $b, $c,
                      $a, $b, $c,
                      56.44, $d, 500);
                      56.44, $d, 500);
 ]]></programlisting>
 ]]></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>
 
 
             <sect3 id="coding-standard.coding-style.arrays.associative">
             <sect3 id="coding-standard.coding-style.arrays.associative">
@@ -470,6 +544,30 @@ $sampleArray = array(1, 2, 3, 'Zend', 'Studio',
 $sampleArray = array('firstKey'  => 'firstValue',
 $sampleArray = array('firstKey'  => 'firstValue',
                      'secondKey' => 'secondValue');
                      'secondKey' => 'secondValue');
 ]]></programlisting>
 ]]></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>
             </sect3>
         </sect2>
         </sect2>
 
 
@@ -520,6 +618,49 @@ class SampleClass
     // muss mit vier Leerzeichen eingerückt sein
     // muss mit vier Leerzeichen eingerückt sein
 }
 }
 ]]></programlisting>
 ]]></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>
 
 
             <sect3 id="coding-standard.coding-style.classes.member-variables">
             <sect3 id="coding-standard.coding-style.classes.member-variables">
@@ -597,6 +738,37 @@ class Foo
 }
 }
 ]]></programlisting>
 ]]></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>
                 <note>
                     <para>
                     <para>
                         <emphasis>Notiz</emphasis>: Die Übergabe per Referenz ist die einzige
                         <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',
 threeArguments(array(1, 2, 3, 'Zend', 'Studio',
                      $a, $b, $c,
                      $a, $b, $c,
                      56.44, $d, 500), 2, 3);
                      56.44, $d, 500), 2, 3);
+
+threeArguments(array(
+    1, 2, 3, 'Zend', 'Studio',
+    $a, $b, $c,
+    56.44, $d, 500
+), 2, 3);
 ]]></programlisting>
 ]]></programlisting>
             </sect3>
             </sect3>
         </sect2>
         </sect2>
@@ -724,6 +902,33 @@ if ($a != 2) {
 ]]></programlisting>
 ]]></programlisting>
 
 
                 <para>
                 <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
                     Für "if" Anweisungen die "elseif" oder "else" beinhalten, sind die Konventionen
                     der Formatierung ähnlich dem "if" Konstrukt. Das folgende Beispiel zeigt gültige
                     der Formatierung ähnlich dem "if" Konstrukt. Das folgende Beispiel zeigt gültige
                     Formatierungen für "if" Anweisungen mit "else" und/oder "elseif" Konstrukten:
                     Formatierungen für "if" Anweisungen mit "else" und/oder "elseif" Konstrukten:
@@ -743,6 +948,19 @@ if ($a != 2) {
 } else {
 } else {
     $a = 7;
     $a = 7;
 }
 }
+
+if (($a == $b)
+    && ($b == $c)
+    || (Foo::CONST == $d)
+) {
+    $a = $d;
+} elseif (($a != $b)
+          || ($b != $c)
+) {
+    $a = $c;
+} else {
+    $a = $b;
+}
 ]]></programlisting>
 ]]></programlisting>
 
 
                 <para>
                 <para>
@@ -751,11 +969,6 @@ if ($a != 2) {
                     es müssen alle "if", "elseif" oder "else" Anweisungen in Klammern geschrieben
                     es müssen alle "if", "elseif" oder "else" Anweisungen in Klammern geschrieben
                     werden.
                     werden.
                 </para>
                 </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>
 
 
             <sect3 id="coding-standards.coding-style.control-statements.switch">
             <sect3 id="coding-standards.coding-style.control-statements.switch">