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

    <para>
        Wenn man von einem älteren Release auf Zend Framework 1.10 oder höher hochrüstet sollte
        man die folgenden Migrations Hinweise beachten.
    </para>

    <sect2 id="migration.110.zend.controller.front">
        <title>Zend_Controller_Front</title>

        <para>
            Ein fehlerhaftes Verhalten wurde behoben, welches aufgetreten ist wenn keine Modell
            Route und keine Route mit der angegebenen Anfrage übereinstimmt. Vorher hat der Router
            das nicht modifizierte Anfrageobjekt zurückgegeben, und der Frontcontroller hat damit
            nur den Standardcontroller und die Standardaktion angezeigt. Seit Zend Framework 1.10
            wirft der Router korrekterweise, wie im Router Interface beschrieben, eine Exception
            wenn keine passende Route vorhanden ist. Das Error Plugin fängt die Exception und leitet
            Sie an den Errorcontroller weiter. Man kann mit der Konstante
            <constant>Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE</constant> auf einen
            spezifischen Fehler testen:
        </para>

        <programlisting language="php"><![CDATA[
/**
 * Vor 1.10
 */
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
    // ...

/**
 * Ab 1.10
 */
    public function errorAction()
    {
        $errors = $this->_getParam('error_handler');

        switch ($errors->type) {
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ROUTE:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_CONTROLLER:
            case Zend_Controller_Plugin_ErrorHandler::EXCEPTION_NO_ACTION:
     // ...
]]></programlisting>
    </sect2>

    <sect2 id="migration.110.zend.feed.reader">
        <title>Migrating from 1.9.6 to 1.10 or later</title>

        <para>
            Mit der Einführung von Zend Framework 1.10 wurde die Behandlung für das Empfangen von
            Autoren und Entwicklern in <classname>Zend_Feed_Reader</classname> geändert. Diese
            Änderung war ein Weg die Behandlung solcher Daten zwischen RSS und Atom Klassen zwischen
            den Komponenten zu harmonisieren und die Rückgabe von Autoren und Entwicklern in einer
            besseren, verwendbareren und detailuerteren Form zu ermöglichen. Das korrigiert auch
            einen Fehler bei dem angenommen wurde das jedes Autor Element auf einen Namen zeigt.
            In RSS ist das falsch, da ein Autor Element aktuell nur eine Email Adresse anbieten
            muss. Zusätzlich fügte die originale Implementation seine RSS Limits bei Atom Feeds
            hinzu was zu einer Reduzierung der Nützlichkeit des Parsers mit diesem Format führte.
        </para>

        <para>
            Die Änderung bedeutet das Methoden wie <methodname>getAuthors()</methodname> und
            <methodname>getContributors</methodname> nicht länger ein einfaches Array von Strings
            zurückgeben die von den relevanten RSS und Atom Elementen geparst wurden Statt dessen
            ist der Rückgabewert eine Unterklasse von <classname>ArrayObject</classname> die
            <classname>Zend_Feed_Reader_Collection_Author</classname> genannt wird und ein
            aufzählbares multidimensionales Array an Autoren simuliert. Jedes Mitglied dieses
            Objekts ist ein einfaches Array mit drei potentiellen Schlüsseln (wie in den
            Quelldaten erlaubt). Diese beinhalten name, email und uri.
        </para>

        <para>
            Das originale Verhalten dieser Methoden würde ein einfaches Array von Strings
            zurückgeben, wobei jeder String versucht einen einzelnen Namen zu präsentieren, aber in
            der Realität war dies nicht möglich da es keine Regel gibt die das Format der RSS
            Autor Strings leiten.
        </para>

        <para>
            Die einfachste Methode der Simulation des originalen Verhaltens dieser Methoden ist die
            Verwendung von <classname>Zend_Feed_Reader_Collection_Author</classname>'s
            <methodname>getValues()</methodname> welche auch ein einfaches Array an Strings
            darstellt und die "relevantesten Daten" repräsentiert. Für Autoren wird deren Name
            angenommen. Jeder Wert in resultierenden Array wird vom "name" Wert abgeleitet welcher
            jedem Autor angehängt ist (wenn vorhanden). In den meisten Fällen ist diese einfache
            Änderung einfach durchzuführen wie anbei demonstriert.
        </para>

        <programlisting language="php"><![CDATA[
/**
 * In 1.9.6
 */
$feed = Zend_Feed_Reader::import('http://example.com/feed');
$authors = $feed->getAuthors();

/**
 * Äquivalent in 1.10
 */
$feed = Zend_Feed_Reader::import('http://example.com/feed');
$authors = $feed->getAuthors()->getValues();
]]></programlisting>
    </sect2>

    <sect2 id="migration.110.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>
    </sect2>

    <sect2 id="migration.110.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>
    </sect2>

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

        <sect3 id="migration.110.zend.file.transfer.files">
            <title>Sicherheitsänderung</title>

            <para>
                Aus Gründen der Sicherheit speichert <classname>Zend_File_Transfer</classname> nicht
                länger die originalen Mimetypen und Dateigrößen welche vom anfragenden Client
                angegeben wurden in seinem internen Speicher. Stattdessen werden die echten Werte
                bei der Instanzierung erkannt.
            </para>

            <para>
                Zusätzlich werden die originalen Werte in <varname>$_FILES</varname> bei der
                Instanzierung mit den echten Werten überschrieben. Das macht auch
                <varname>$_FILES</varname> sicher.
            </para>

            <para>
                Wenn man die originalen Werte benötigt, kann man diese entweder vor der
                Instanzierung von <classname>Zend_File_Transfer</classname> speichern, oder bei der
                Instanzierung die Option <property>disableInfos</property> verwenden. Es ist zu
                beachten das diese Option sinnlos ist wenn Sie nach der Instanzierung verwendet
                wird.
            </para>
        </sect3>

        <sect3 id="migration.110.zend.file.transfer.count">
            <title>Count Prüfung</title>

            <para>
                Vor dem Release 1.10 hat die <classname>MimeType</classname> Prüfung eine falsche
                Benennung verwendet. Aus Gründen der Konsistenz wurden die folgenden Konstanten
                geändert:
            </para>

            <table id="migration.110.zend.file.transfer.count.table">
                <title>Geänderte Prüfmeldungen</title>

                <tgroup cols="4">
                    <thead>
                        <row>
                            <entry>Alt</entry>
                            <entry>Neu</entry>
                            <entry>Wert</entry>
                        </row>
                    </thead>

                    <tbody>
                        <row>
                            <entry><constant>TOO_MUCH</constant></entry>
                            <entry><constant>TOO_MANY</constant></entry>

                            <entry>
                                Too many files, maximum '%max%' are allowed but '%count%' are given
                            </entry>
                        </row>

                        <row>
                            <entry><constant>TOO_LESS</constant></entry>
                            <entry><constant>TOO_FEW</constant></entry>

                            <entry>
                                Too few files, minimum '%min%' are expected but '%count%' are given
                            </entry>
                        </row>
                    </tbody>
                </tgroup>
            </table>

            <para>
                Wenn man diese Meldungen im eigenen Code übersetzt dann sollte man die neuen
                Konstanten verwenden. Als Vorteil muss man den originalen String im englischen nicht
                mehr übersetzen um die richtige Schreibweise zu erhalten.
            </para>
        </sect3>
    </sect2>

    <sect2 id="migration.110.zend.translate">
        <title>Zend_Translate</title>

        <sect3 id="migration.110.zend.translate.xliff">
            <title>Xliff Adapter</title>

            <para>
                In der Vergangenheit hat der Xliff Adapter den Source String als Message Id
                verwendet. Laut dem Xliff Standard sollte die trans-unit Id verwendet werden.
                Dieses Verhalten wurde mit Zend Framework 1.10 korrigiert. Jetzt wird
                standardmäßig die trans-unit Id als Message Id verwendet.
            </para>

            <para>
                Aber man kann trotzdem das falsch und alte Verhalten bekommen indem die
                <property>useId</property> Option auf <constant>FALSE</constant> gesetzt wird.
            </para>

            <programlisting language="php"><![CDATA[
$trans = new Zend_Translate(
    'xliff', '/path/to/source', $locale, array('useId' => false)
);
]]></programlisting>
        </sect3>
    </sect2>

    <sect2 id="migration.110.zend.validate">
        <title>Zend_Validate</title>

        <sect3 id="migration.110.zend.validate.selfwritten">
            <title>Selbst geschriebene Adapter</title>

            <para>
                Wenn in einer selbst geschriebenen Prüfung ein Fehler gesetzt wird um diesen
                zurückzugeben muß die <methodname>_error()</methodname> Methode aufgerufen werden.
                Vor Zend Framework 1.10 konnte man diese Methode ohne einen angegebenen Parameter
                aufrufen. Es wurde dann das erste gefundene Nachrichtentemplate verwendet.
            </para>

            <para>
                Dieses Verhalten ist problematisch wenn man Prüfungen hat die mehr als eine
                Nachricht zurückgeben kann. Auch wenn man eine existierende Prüfung erweitert kann
                man unerwartete Ergebnisse erhalten. Das kann zum Problem führen das der Benutzer
                nicht die Nachricht erhält die man erwartet.
            </para>

            <programlisting language="php"><![CDATA[
My_Validator extends Zend_Validate_Abstract
{
    public isValid($value)
    {
        ...
        $this->_error(); // Unerwartete Ergebnisse zwischen verschiedenen OS
        ...
    }
}
]]></programlisting>

            <para>
                Um dieses Problem zu verhindern erlaubt es die <methodname>_error()</methodname>
                Methode nicht mehr ohne einen angegebenen Parameter aufgerufen zu werden.
            </para>

            <programlisting language="php"><![CDATA[
My_Validator extends Zend_Validate_Abstract
{
    public isValid($value)
    {
        ...
        $this->_error(self::MY_ERROR);
        // Definierter Fehler, keine unerwarteten Ergebnisse
        ...
    }
}
]]></programlisting>
        </sect3>

        <sect3 id="migration.110.zend.validate.datevalidator">
            <title>Vereinfachungen im Date Prüfer</title>

            <para>
                Vor Zend Framework 1.10 wurden 2 identische Nachrichten im Date Prüfer geworfen.
                Es gab <constant>NOT_YYYY_MM_DD</constant> und <constant>FALSEFORMAT</constant>.
                Ab Zend Framework 1.10 wird nur mehr die <constant>FALSEFORMAT</constant> Meldung
                zurückgegeben wenn das angegebene Datum mit dem gesetzten Format nicht
                übereinstimmt.
            </para>
        </sect3>

        <sect3 id="migration.110.zend.validate.barcodevalidator">
            <title>Fehlerbehebungen im Alpha, Alum und Barcode Prüfer</title>

            <para>
                Vor dem Zend Framework 1.10 waren Nachrichten in den 2 Barcode Adaptern, dem Alpha
                und dem Alnum Prüfer identisch. Das führte zu Problemen bei der Verwendung von
                eigenen Meldungen, Übersetzungen oder mehreren Instanzen dieser Prüfer.
            </para>

            <para>
                Mit Zend Framework 1.10 wurden die Werte dieser Konstanten so geändert das Sie
                eindeutig sind. Wenn man, so wie es im Handbuhc erklärt wird, die Konstanten
                verwendet gibt es keine Änderungen. Aber wenn man den Inhalt der Konstanten im
                eigenen Code verwendet dann muß man diese Ändern. Die folgende Tabelle zeigt die
                geänderten Werte:
            </para>

            <table id="migration.110.zend.validate.barcodevalidator.table">
                <title>Vorhandenen Meldungen der Prüfer</title>

                <tgroup cols="3">
                    <thead>
                        <row>
                            <entry>Prüfer</entry>
                            <entry>Konstante</entry>
                            <entry>Wert</entry>
                        </row>
                    </thead>

                    <tbody>
                        <row>
                            <entry><classname>Alnum</classname></entry>
                            <entry><constant>STRING_EMPTY</constant></entry>
                            <entry>alnumStringEmpty</entry>
                        </row>

                        <row>
                            <entry><classname>Alpha</classname></entry>
                            <entry><constant>STRING_EMPTY</constant></entry>
                            <entry>alphaStringEmpty</entry>
                        </row>

                        <row>
                            <entry><classname>Barcode_Ean13</classname></entry>
                            <entry><constant>INVALID</constant></entry>
                            <entry>ean13Invalid</entry>
                        </row>

                        <row>
                            <entry><classname>Barcode_Ean13</classname></entry>
                            <entry><constant>INVALID_LENGTH</constant></entry>
                            <entry>ean13InvalidLength</entry>
                        </row>

                        <row>
                            <entry><classname>Barcode_UpcA</classname></entry>
                            <entry><constant>INVALID_LENGTH</constant></entry>
                            <entry>upcaInvalidLength</entry>
                        </row>

                        <row>
                            <entry><classname>Digits</classname></entry>
                            <entry><constant>STRING_EMPTY</constant></entry>
                            <entry>digitsStringEmpty</entry>
                        </row>
                    </tbody>
                </tgroup>
            </table>
        </sect3>
    </sect2>
</sect1>
