<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="migration.19">
    <title>Zend Framework 1.9</title>

    <para>
        Wenn man von einem Zend Framework Release vor 1.9.0 zu einem beliebigen 1.9 Release
        hochrüstet sollte man die folgenden Migrations Hinweise beachten.
    </para>

    <sect2 id="migration.19.zend.file.transfer">
        <title>Zend_File_Transfer</title>

        <sect3 id="migration.19.zend.file.transfer.mimetype">
            <title>MimeType Prüfung</title>

            <para>
                Aus Sicherheitsgründen haben wir den standardmäßigen Fallback Mechanismus der
                <classname>MimeType</classname>, <classname>ExcludeMimeType</classname>,
                <classname>IsCompressed</classname> und <classname>IsImage</classname> Prüfungen
                ausgeschaltet. Das bedeutet, wenn die <emphasis>fileInfo</emphasis> oder
                <emphasis>magicMime</emphasis> Erweiterungen nicht gefunden werden können, dann
                wird die Prüfung immer fehlschlagen.
            </para>

            <para>
                Wenn es notwendig ist das man für die Prüfung die <acronym>HTTP</acronym> Felder
                verwendet welche vom Benutzer geschickt werden, dann kann man dieses Feature
                einschalten indem die <methodname>enableHeaderCheck()</methodname> Methode
                verwendet wird.
            </para>

            <note>
                <title>Sicherheits Hinweis</title>

                <para>
                    Man sollte beachten, das wenn man sich auf die <acronym>HTTP</acronym> Felder
                    verlässt, die vom Benutzer geschickt werden, das ein Sicherheits Risiko ist.
                    Diese können einfach geändert werden und könnten es einem Benutzer erlauben eine
                    schädliche Datei zu schicken.
                </para>
            </note>

            <example id="migration.19.zend.file.transfer.example">
                <title>Die Verwendung der HTTP Felder erlauben</title>

                <programlisting language="php"><![CDATA[
// Bei der Initiierung
$valid = new Zend_File_Transfer_Adapter_Http(array('headerCheck' => true);

// oder im Nachhinein
$valid->enableHeaderCheck();
]]></programlisting>
            </example>
        </sect3>
    </sect2>

    <sect2 id="migration.19.zend.filter">
        <title>Zend_Filter</title>

        <para>
            Vor dem Release 1.9 erlaubte <classname>Zend_Filter</classname> die Verwendung der
            statischen Methode <methodname>get()</methodname>. Ab dem Release 1.9 wurde diese
            Methode zu <methodname>filterStatic()</methodname> umbenannt um besser zu beschreiben
            was Sie macht. Die alte <methodname>get()</methodname> Methode wurde als deprecated
            markiert.
        </para>
    </sect2>

    <sect2 id="migration.19.zend.http.client">
        <title>Zend_Http_Client</title>

        <sect3 id="migration.19.zend.http.client.fileuploadsarray">
            <title>
                Änderungen in der internen Speicherung der Information von hochgeladenen Dateien
            </title>

            <para>
                In Version 1.9 vom Zend Framework gibt es eine Ändernug wie
                <classname>Zend_Http_Client</classname> Informationen über hochgeladenen Dateien
                intern speichert, bei denen die
                <methodname>Zend_Http_Client::setFileUpload()</methodname> Methode verwendet wird.
            </para>

            <para>
                Diese Änderung wurde durchgeführt um es zu erlauben mehrere Dateien mit dem
                gleichen Formularnamen, als Array von Dateien, hochzuladen. Weitere Informationen
                über dieses Problem können in <ulink
                    url="http://framework.zend.com/issues/browse/ZF-5744">diesem
                    Fehlerreport</ulink> gefunden werden.
            </para>

            <example id="migration.19.zend.http.client.fileuploadsarray.example">
                <title>Interne Speicherung der Informationen von hochgeladenen Dateien</title>

                <programlisting language="php"><![CDATA[
// Zwei Dateien mit dem gleichen Namen des Formularelements als Array hochladen
$client = new Zend_Http_Client();
$client->setFileUpload('file1.txt',
                       'userfile[]',
                       'some raw data',
                       'text/plain');
$client->setFileUpload('file2.txt',
                       'userfile[]',
                       'some other data',
                       'application/octet-stream');

// In Zend Framework 1.8 oder älter, ist der Wert der geschützten
// Variable $client->files:
// $client->files = array(
//     'userfile[]' => array('file2.txt',
                             'application/octet-stream',
                             'some other data')
// );

// In Zend Framework 1.9 oder neuer, ist der Wert von $client->files:
// $client->files = array(
//     array(
//         'formname' => 'userfile[]',
//         'filename' => 'file1.txt,
//         'ctype'    => 'text/plain',
//         'data'     => 'some raw data'
//     ),
//     array(
//         'formname' => 'userfile[]',
//         'filename' => 'file2.txt',
//         'formname' => 'application/octet-stream',
//         'formname' => 'some other data'
//     )
// );
]]></programlisting>
            </example>

            <para>
                Wie man sieht gestattet diese Änderung die Verwendung des gleichen Namens für das
                Formularelement mit mehr als einer Datei - trotzdem führt dies zu einer subtilen
                Änderung der Rückwärtskompatibilität und sollte erwähnt werden.
            </para>
        </sect3>

        <sect3 id="migration.19.zend.http.client.getparamsrecursize">
            <title>
                Zend_Http_Client::_getParametersRecursive() sollte nicht mehr eingesetzt werden
            </title>

            <para>
                Beginnend mit Version 1.9, wird die geschützte Methode
                <methodname>_getParametersRecursive()</methodname> nicht mehr von
                <classname>Zend_Http_Client</classname> verwendet und ist abgelehnt (deprecated).
                Ihre Verwendung führt zu einer <constant>E_NOTICE</constant> Nachricht die von
                <acronym>PHP</acronym> kommt.
            </para>

            <para>
                Wenn man <classname>Zend_Http_Client</classname> erweitert und diese Methode
                aufrufr, sollte man sehen das man stattdessen die statische Methode
                <methodname>Zend_Http_Client::_flattenParametersArray()</methodname> verwendet.
            </para>

            <para>
                Nochmals, da <methodname>_getParametersRecursive()</methodname> eine geschützte
                Methode ist, sind nur Benutzer betroffen die <classname>Zend_Http_Client</classname>
                erweitert haben.
            </para>
        </sect3>
    </sect2>

    <sect2 id="migration.19.zend.locale">
        <title>Zend_Locale</title>

        <sect3 id="migration.19.zend.locale.deprecated">
            <title>Abgelaufene Methoden</title>

            <para>
                Einige spezialisiertere Übersetzungsmethoden stehen nicht mehr zur Verfügung weil
                Sie bestehende Verhaltensweisen duplizieren. Beachten Sie das die alten Methoden
                weiterhin funktionieren, aber eine Benutzer Notiz geworfen wird, die den neuen
                Aufruf beschreibt. Diese Methoden werden mit 2.0 entfernt. Die folgende Liste zeigt
                die alten und neuen Methodenaufrufe.
            </para>

            <table id="migration.19.zend.locale.deprecated.table-1">
                <title>List der Methodenaufrufe</title>

                <tgroup cols="2">
                    <thead>
                        <row>
                            <entry>Alter Aufruf</entry>
                            <entry>Neuer Aufruf</entry>
                        </row>
                    </thead>

                    <tbody>
                        <row>
                            <entry>
                                <methodname>getLanguageTranslationList($locale)</methodname>
                            </entry>

                            <entry>
                                <methodname>getTranslationList('language', $locale)</methodname>
                            </entry>
                        </row>

                        <row>
                            <entry>
                                <methodname>getScriptTranslationList($locale)</methodname>
                            </entry>

                            <entry>
                                <methodname>getTranslationList('script', $locale)</methodname>
                            </entry>
                        </row>

                        <row>
                            <entry>
                                <methodname>getCountryTranslationList($locale)</methodname>
                            </entry>

                            <entry>
                                <methodname>getTranslationList('territory', $locale, 2)</methodname>
                            </entry>
                        </row>

                        <row>
                            <entry>
                                <methodname>getTerritoryTranslationList($locale)</methodname>
                            </entry>

                            <entry>
                                <methodname>getTranslationList('territory', $locale, 1)</methodname>
                            </entry>
                        </row>

                        <row>
                            <entry>
                                <methodname>getLanguageTranslation($value, $locale)</methodname>
                            </entry>

                            <entry>
                                <methodname>getTranslation($value, 'language', $locale)</methodname>
                            </entry>
                        </row>

                        <row>
                            <entry>
                                <methodname>getScriptTranslation($value, $locale)</methodname>
                            </entry>

                            <entry>
                                <methodname>getTranslation($value, 'script', $locale)</methodname>
                            </entry>
                        </row>

                        <row>
                            <entry>
                                <methodname>getCountryTranslation($value, $locale)</methodname>
                            </entry>

                            <entry>
                                <methodname>getTranslation($value, 'country', $locale)</methodname>
                            </entry>
                        </row>

                        <row>
                            <entry>
                                <methodname>getTerritoryTranslation($value, $locale)</methodname>
                            </entry>

                            <entry>
                                <methodname>getTranslation($value, 'territory',
                                    $locale)</methodname>
                            </entry>
                        </row>
                    </tbody>
                </tgroup>
            </table>
        </sect3>
    </sect2>

    <sect2 id="migration.19.zend.view.helper.navigation">
        <title>Zend_View_Helper_Navigation</title>

        <para>
            Vor dem Release 1.9 hat der Menü Helfer
            (<classname>Zend_View_Helper_Navigation_Menu</classname>) Untermenüs nicht richtig
            dargestellt. Wenn <property>onlyActiveBranch</property> <constant>TRUE</constant> war
            und die Option <property>renderParents</property> <constant>FALSE</constant> wurde
            nichts dargestellt wenn die tiefste aktive Seite auf einer geringeren Tiele als die
            <property>minDepth</property> Option war.
        </para>

        <para>
            In einfacheren Worten; Wenn <property>minDepth</property> auf '1' gesetzt war und
            die aktive Seite eine der Seiten am Anfangs-Level, wurde nichts dargestellt wie das
            folgende Beispiel zeigt.
        </para>

        <para>
            Das folgende Container Setup wird angenommen:
        </para>

        <programlisting language="php"><![CDATA[
<?php
$container = new Zend_Navigation(array(
    array(
        'label' => 'Home',
        'uri'   => '#'
    ),
    array(
        'label'  => 'Products',
        'uri'    => '#',
        'active' => true,
        'pages'  => array(
            array(
                'label' => 'Server',
                'uri'   => '#'
            ),
            array(
                'label' => 'Studio',
                'uri'   => '#'
            )
        )
    ),
    array(
        'label' => 'Solutions',
        'uri'   => '#'
    )
));
]]></programlisting>

        <para>
            Der folgende Code wird in einem View Script verwendet:
        </para>

        <programlisting language="php"><![CDATA[
<?php echo $this->navigation()->menu()->renderMenu($container, array(
    'minDepth'         => 1,
    'onlyActiveBranch' => true,
    'renderParents'    => false
)); ?>
]]></programlisting>

        <para>
            Vor dem Release 1.9 würde der obige Codeabschnitt nichts ausgeben.
        </para>

        <para>
            Seit dem Release 1.9 akzeptiert die <methodname>_renderDeepestMenu()</methodname>
            Methode in <classname>Zend_View_Helper_Navigation_Menu</classname> aktive Seiten die ein
            Level unter <property>minDepth</property> sind, solange diese Seite Kinder hat.
        </para>

        <para>
            Der gleiche Codeabschnitt zeigt jetzt die folgende Ausgabe:
        </para>

        <programlisting language="html"><![CDATA[
<ul class="navigation">
    <li>
        <a href="#">Server</a>
    </li>
    <li>
        <a href="#">Studio</a>
    </li>
</ul>
]]></programlisting>
    </sect2>

    <sect2 id="migration.19.security">
        <title>Sicherheitsfixes ab 1.9.7</title>

        <para>
            Zusätzlich können Benutzer der Serie 1.9 von anderen Änderungen beginnend in Version
            1.9.7 betroffen sein. Das sind alles Sicherheitsbehebungen welche auch potentiell
            Probleme mit Rückwärtskompatibilität haben können.
        </para>

        <sect3 id="migration.19.security.zend.dojo.editor">
            <title>Zend_Dojo_View_Helper_Editor</title>

            <para>
                Eine kleine Änderung wurde in der Serie 1.9 gemacht um die Standardverwendung des
                dijit Editors zu modifizieren um <acronym>div</acronym> Tags statt einem
                <acronym>textarea</acronym> Tag zu verwenden; die letztere Verwendung bringt <ulink
                    url="http://api.dojotoolkit.org/jsdoc/HEAD/dijit._editor.RichText">Sicherheits
                    Probleme</ulink> mit sich, und die Verwendung von <acronym>div</acronym> Tags
                wird vom Dojo Projekt empfohlen.
            </para>

            <para>
                Um trotzdem eine erfolgreiche Degration zu erlauben, wurde dem View Helper eine neue
                Option <varname>degrade</varname> hinzugefügt; diese erlaubt es Entwicklern statt
                dessen optional ein <acronym>textarea</acronym> zu verwenden. Trotzdem öffnet dies
                Anwendungen die damit entwickelt wurden <acronym>XSS</acronym> Vektoren. In 1.9.7
                wurde diese Option entfernt. Die erfolgreiche Degration wird trotzdem, über das
                <acronym>noscript</acronym> Tag unterstützt welches eine <acronym>textarea</acronym>
                enthält. Diese Lösung adressiert Sicherheitsbedenken.
            </para>

            <para>
                Die Folgerung ist, das wenn man das <varname>degrade</varname> Flag verwendet,
                dieses ab diesem Zeitpunkt einfach ignoriert wird.
            </para>
        </sect3>

        <sect3 id="migration.19.security.zend.filter.html-entities">
            <title>Zend_Filter_HtmlEntities</title>

            <para>
                Um zu einem höheren Sicherheitsstandard für die Zeichenkodierung zu kommen, ist der
                Standardwert von <classname>Zend_Filter_HtmlEntities</classname> jetzt
                <acronym>UTF-8</acronym> statt <acronym>ISO-8859-1</acronym>.
            </para>

            <para>
                Zusätzlich, weil der aktuelle Mechanismus mit Zeichenkodierung handelt und nicht mit
                Zeichensets, wurden zwei Methoden hinzugefügt.
                <methodname>setEncoding()</methodname> und <methodname>getEncoding()</methodname>.
                Die vorhergehenden Methoden <methodname>setCharSet()</methodname> und
                <methodname>setCharSet()</methodname> sind jetzt deprecated und verweisen auf die
                neuen Methoden. Letztendlich, statt die geschützten Mitglieder in der
                <methodname>filter()</methodname> Methode direkt zu verwenden, werden Sie durch Ihre
                expliziten Zugriffsmethoden empfangen. Wenn man den Filter in der Vergangenheit
                erweitert hat, sollte man seinen Code und seine Unittests prüfen um sicherzustellen
                das weiterhin alles funktioniert.
            </para>
        </sect3>

        <sect3 id="migration.19.security.zend.filter.strip-tags">
            <title>Zend_Filter_StripTags</title>

            <para>
                <classname>Zend_Filter_StripTags</classname> enthielt in voehergehenden Versionen
                ein <varname>commentsAllowed</varname> Flag, welches es erlaubt hat
                <acronym>HTML</acronym> Kommentare in von dieser Klasse gefiltertem
                <acronym>HTML</acronym> Text als erlaubt zu markieren. Aber das öffnet den Weg für
                <acronym>XSS</acronym> Attacken, speziell im Internet Explorer (der es erlaubt
                konditionelle Funktionalität über <acronym>HTML</acronym> Kommentare zu
                spezifizieren). Beginnend mit Version 1.9.7 (und retour mit den Versionen 1.8.5 und
                1.7.9), hat das <varname>commentsAllowed</varname> Flag keine Bedeutung meht, und
                alle <acronym>HTML</acronym> Kommentare, inklusive denen die andere
                <acronym>HTML</acronym> Tags oder untergeordnete Kommentare enthalten, werden von
                der endgültigen Aufgabe des Filters entfernt.
            </para>
        </sect3>
    </sect2>
</sect1>
