<?xml version="1.0" encoding="UTF-8"?>
<!-- EN-Revision: 24249 -->
<!-- Reviewed: no -->
<sect1 id="learning.quickstart.create-project">
    <title>Das Projekt erstellen</title>

    <para>
        Um das eigene Projekt zu erstellen muss man zuerst Zend Framework herunterladen und
        extrahieren.
    </para>

    <sect2 id="learning.quickstart.create-project.install-zf">
        <title>Zend Framework installieren</title>

        <para>
            Der einfachste Weg um Zend Framework zusammen mit einem kompletten
            <acronym>PHP</acronym> Stack zu erhalten ist durch die Installation von <ulink
                url="http://www.zend.com/en/products/server-ce/downloads">Zend Server</ulink>.
            Zend Server hat native Installationsroutinen für Mac OSX, Windows, Fedora Core und
            Ubuntu, sowie ein universelles Installationspaket das mit den meisten Linux
            Distributionen kompatibel ist.
        </para>

        <para>
            Nachdem Zend Server installiert wurde, können die Framework Dateien bei Max OSX und
            Linux unter <filename>/usr/local/zend/share/ZendFramework</filename>, und bei Windows
            unter <filename>C:\Program Files\Zend\ZendServer\share\ZendFramework</filename> gefunden
            werden. Der <constant>include_path</constant> ist dann bereits konfiguriert um Zend
            Framework zu verwenden.
        </para>

        <para>
            Alternativ kann man <ulink url="http://framework.zend.com/download/latest">die letzte
            Version vom Zend Framework downloaden</ulink> und dessen Inhalt extrahieren; man sollte
            sich notieren wo man das tut.
        </para>

        <para>
            Optional kann der Pfad zum Unterverzeichnis <filename>library/</filename> des Archivs
            den eigenen <constant>include_path</constant> Einstellung in der
            <filename>php.ini</filename> hinzugefügt werden.
        </para>

        <para>
            Das ist es! Zend Framework ist jetzt installiert und bereit zur Verwendung.
        </para>
    </sect2>

    <sect2 id="learning.quickstart.create-project.create-project">
        <title>Das Projekt erstellen</title>

        <note>
            <title>zf Kommandozeilen Tool</title>

            <para>
                In der eigenen Zend Framework Installation ist ein Unterverzeichnis
                <filename>bin/</filename> welches die Skripte <filename>zf.sh</filename> und
                <filename>zf.bat</filename>, für Unix-basierende und Windows-basierende Benutzer
                enthält. Der absolute Pfad zu diesem Skript sollte notiert werden.
            </para>

            <para>
                Wo immer man einer Referenz auf den Befehl <filename>zf</filename> sieht, sollte der
                absolute Pfad zum Skript substituiert werden. Auf Unix-basierenden Systemen, könnte
                man die Alias Funktionalität der Shell verwenden:
                <command>alias zf.sh=path/to/ZendFramework/bin/zf.sh</command>.
            </para>

            <para>
                Wenn man Probleme hat das <command>zf</command> Kommandozeilen Tool zu konfigurieren
                sollte man in <link linkend="zend.tool.framework.clitool">das
                    Handbuch</link> sehen.
            </para>
        </note>

        <para>
            Ein Terminal öffnen (in Windows, <command>Start -> Run</command> und anschließend
            <command>cmd</command> verwenden). Zum Verzeichnis in dem man das Projekt beginnen will
            navigieren. Anschließend den Pfad zum richtigen Skript verwenden und eines der folgenden
            ausführen:
        </para>

        <programlisting language="shell"><![CDATA[
% zf create project quickstart
]]></programlisting>

        <para>
            Die Ausführung dieses Kommandos erstellt die grundsätzliche Site Struktur, inklusive den
            initialen Controllern und Views. Der Baum sieht wie folgt aus:
        </para>

        <programlisting language="text"><![CDATA[
quickstart
|-- application
|   |-- Bootstrap.php
|   |-- configs
|   |   `-- application.ini
|   |-- controllers
|   |   |-- ErrorController.php
|   |   `-- IndexController.php
|   |-- models
|   `-- views
|       |-- helpers
|       `-- scripts
|           |-- error
|           |   `-- error.phtml
|           `-- index
|               `-- index.phtml
|-- library
|-- public
|   |-- .htaccess
|   `-- index.php
`-- tests
    |-- application
    |   `-- bootstrap.php
    |-- library
    |   `-- bootstrap.php
    `-- phpunit.xml
]]></programlisting>

        <para>
            Wenn man an diesem Punkt, Zend Framework dem eigenen <constant>include_path</constant>
            nicht hunzugefügt hat, empfehlen wir Ihn entweder in das eigene
            <filename>library/</filename> Verzeichnis zu kopieren oder zu symlinken. In jedem Fall
            sollte man entweder das <filename>library/Zend/</filename> Verzeichnis der Zend
            Framework Installation rekursiv in das <filename>library/</filename> Verzeichnis des
            Projekts kopieren oder symlinken. Auf unix-artigen Systemen würde das wie folgt
            aussehen:
        </para>

        <programlisting language="shell"><![CDATA[
# Symlink:
% cd library; ln -s path/to/ZendFramework/library/Zend .

# Copy:
% cd library; cp -r path/to/ZendFramework/library/Zend .
]]></programlisting>

        <para>
            Auf Windows Systemen ist es am einfachsten das vom Explorer zu tun.
        </para>

        <para>
            Jetzt da das Projekt erstellt wurde, sind die hauptsächlichen Artefakte die man
            verstehen sollte, die Bootstrap, die Konfiguration, die Action Controller und die Views.
        </para>
    </sect2>

    <sect2 id="learning.quickstart.create-project.bootstrap">
        <title>Die Bootstrap</title>

        <para>
            Die <classname>Bootstrap</classname> Klasse definiert welche Ressourcen und Komponenten
            zu initialisieren sind. Standardmäßig wird Zend Framework's <link
                linkend="zend.controller.front">Front Controller</link> initialisiert und er
            verwendet <filename>application/controllers/</filename> als Standardverzeichnis in dem
            nach Action Controllern nachgesehen wird (mehr davon später). Die Klasse sieht wie
            folgt aus:
        </para>

        <programlisting language="php"><![CDATA[
// application/Bootstrap.php

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{
}
]]></programlisting>

        <para>
            Wie man sieht ist nicht viel notwendig um zu beginnen.
        </para>
    </sect2>

    <sect2 id="learning.quickstart.create-project.configuration">
        <title>Konfiguration</title>

        <para>
            Wärend Zend Framework selbst konfigurationslos ist, ist es oft notwendig die eigene
            Anwendung zu konfigurieren. Die Standardkonfiguration wird in
            <filename>application/configs/application.ini</filename> platziert und enthält einige
            grundsätzliche Direktiven für die Einstellung der <acronym>PHP</acronym> Umgebung (zum
            Beispiel ein- und ausschalten der Fehlermeldungen), zeigt den Pfad zur eigenen Bootstrap
            Klasse (wie auch dessen Klassenname), und den Pfad zu den eigenen Action Controllern.
            Das sieht wie folgt aus:
        </para>

        <programlisting language="ini"><![CDATA[
; application/configs/application.ini

[production]
phpSettings.display_startup_errors = 0
phpSettings.display_errors = 0
includePaths.library = APPLICATION_PATH "/../library"
bootstrap.path = APPLICATION_PATH "/Bootstrap.php"
bootstrap.class = "Bootstrap"
appnamespace = "Application"
resources.frontController.controllerDirectory = APPLICATION_PATH "/controllers"
resources.frontController.params.displayExceptions = 0

[staging : production]

[testing : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1

[development : production]
phpSettings.display_startup_errors = 1
phpSettings.display_errors = 1
]]></programlisting>

        <para>
            Verschiedene Dinge sollten über diese Datei gesagt werden. Erstens kann man, wenn
            <acronym>INI</acronym>-artige Konfigurationen verwendet werden, direkt auf Konstanten
            referenzieren und Sie erweitern; <constant>APPLICATION_PATH</constant> selbst ist eine
            Konstante. Zusätzlich ist zu beachten das es verschiedene definierte Sektionen gibt:
            production, staging, testing, und development. Die letzten drei verweisen auf
            Einstellungen der "production" Umgebung. Das ist ein nützlicher Weg die Konfiguration zu
            organisieren und stellt sicher das die richtigen Einstellungen in jeder Stufe der
            Anwendungsentwicklung vorhanden sind.
        </para>
    </sect2>

    <sect2 id="learning.quickstart.create-project.action-controllers">
        <title>Action Controller</title>

        <para>
            Die <emphasis>Action Controller</emphasis> der Anwendung enthalten den Workflow der
            Anwendung und mappen eigene Anfragen auf die richtigen Modelle und Views.
        </para>

        <para>
            Ein Action Controller sollte ein oder mehrere Methoden haben die auf "Action" enden;
            diese Methoden können über das Web abgefragt werden. Standardmäßig folgen Zend Framework
            URL's dem Schema <constant>/controller/action</constant> wobei "controller" auf den
            Namen des Action Controllers verweist (ohne den "Controller" Suffix) und "action" auf
            eine Action Methode verweist (ohne den "Action" Suffix).
        </para>

        <para>
            Typischerweise benötigt man immer einen <classname>IndexController</classname>, der ein
            Fallback Controller ist und auch als Homepage der Site arbeitet, und einen
            <classname>ErrorController</classname> der verwendet wird um Dinge wie
            <acronym>HTTP</acronym> 404 Fehler zu zeigen (wenn der Controller oder die Action nicht
            gefunden wird) und <acronym>HTTP</acronym> 500 Fehler (Anwendungsfehler).
        </para>

        <para>
            Der standardmäßige <classname>IndexController</classname> ist wie folgt:
        </para>

        <programlisting language="php"><![CDATA[
// application/controllers/IndexController.php

class IndexController extends Zend_Controller_Action
{

    public function init()
    {
        /* Den Action Controller hier initialisieren */
    }

    public function indexAction()
    {
        // Action Body
    }
}
]]></programlisting>

        <para>
            Und der standardmäßige <classname>ErrorController</classname> ist wie folgt:
        </para>

        <programlisting language="php"><![CDATA[
// application/controllers/ErrorController.php

class ErrorController extends Zend_Controller_Action
{

    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:

                // 404 Fehler -- Controller oder Action nicht gefunden
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Page not found';
                break;
            default:
                // Anwendungsfehler
                $this->getResponse()->setHttpResponseCode(500);
                $this->view->message = 'Application error';
                break;
        }

        $this->view->exception = $errors->exception;
        $this->view->request   = $errors->request;
    }
}
]]></programlisting>

        <para>
            Es ist zu sehen das (1) der <classname>IndexController</classname> keinen echten Code
            enthält, und (2) der <classname>ErrorController</classname> auf eine "view" Eigenschaft
            verweist. Das führt schon zu unserem nächsten Subjekt.
        </para>
    </sect2>

    <sect2 id="learning.quickstart.create-project.views">
        <title>Views</title>

        <para>
            Views werden im Zend Framework in reinem alten <acronym>PHP</acronym> geschrieben. View
            Skripte werden unter <filename>application/views/scripts/</filename> platziert, wo Sie
            weiters kategorisiert werden indem der Name des Controllers verwendet wird. In unserem
            Fall haben wir einen <classname>IndexController</classname> und einen
            <classname>ErrorController</classname>, und deshalb haben wir entsprechende
            <filename>index/</filename> und <filename>error/</filename> Unterverzeichnisse in
            unserem View Skript Verzeichnis. In diesem Unterverzeichnissen finden und erstellen wir
            anschließend View Skripte die jeder ausgeführten Controller Action entsprechen; im
            Standardfall haben wir die View Skripte <filename>index/index.phtml</filename> und
            <filename>error/error.phtml</filename>.
        </para>

        <para>
            View Skripte können jedes Markup enthalten das man haben will, und verwenden das
            öffnende <emphasis>&lt;?php</emphasis> Tag und das schließende
            <emphasis>?&gt;</emphasis> Tag um <acronym>PHP</acronym> Direktiven einzufügen.
        </para>

        <para>
            Das folgende wird standardmäßig für das <filename>index/index.phtml</filename> View
            Skript installiert:
        </para>

        <programlisting language="php"><![CDATA[
<!-- application/views/scripts/index/index.phtml -->
<style>

    a:link,
    a:visited
    {
        color: #0398CA;
    }

    span#zf-name
    {
        color: #91BE3F;
    }

    div#welcome
    {
        color: #FFFFFF;
        background-image: url(http://framework.zend.com/images/bkg_header.jpg);
        width:  600px;
        height: 400px;
        border: 2px solid #444444;
        overflow: hidden;
        text-align: center;
    }

    div#more-information
    {
        background-image: url(http://framework.zend.com/images/bkg_body-bottom.gif);
        height: 100%;
    }

</style>
<div id="welcome">
    <h1>Willkommen zum <span id="zf-name">Zend Framework!</span><h1 />
    <h3>Das ist die Hauptseite unseres Projekts<h3 />
    <div id="more-information">
        <p>
            <img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" />
        </p>

        <p>
            Hilfreiche Links: <br />
            <a href="http://framework.zend.com/">Zend Framework Website</a> |
            <a href="http://framework.zend.com/manual/en/">Zend Framework
                Handbuch</a>
        </p>
    </div>
</div>
]]></programlisting>

        <para>
            Das <filename>error/error.phtml</filename> View Skript ist etwas interessanter da es
            einige <acronym>PHP</acronym> Konditionen verwendet:
        </para>

        <programlisting language="php"><![CDATA[
<!-- application/views/scripts/error/error.phtml -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN";
    "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
  <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  <title>Zend Framework Standardanwendung</title>
</head>
<body>
  <h1>Ein Fehler ist aufgetreten</h1>
  <h2><?php echo $this->message ?></h2>

  <?php if ('development' == $this->env): ?>

  <h3>Information der Exception:</h3>
  <p>
      <b>Nachricht:</b> <?php echo $this->exception->getMessage() ?>
  </p>

  <h3>Stack Trace:</h3>
  <pre><?php echo $this->exception->getTraceAsString() ?>
  </pre>

  <h3>Anfrage Parameter:</h3>
  <pre><?php echo var_export($this->request->getParams(), 1) ?>
  </pre>
  <?php endif ?>

</body>
</html>
]]></programlisting>
    </sect2>

    <sect2 id="learning.quickstart.create-project.vhost">
        <title>Einen virtuellen Host erstellen</title>

        <para>
            Für die Zwecke dieses Quickstarts nehmen wir an das der <ulink
                url="http://httpd.apache.org/">Apache Web Server</ulink> verwendet wird. Zend
            Framework arbeitet auch perfekt mit anderen Web Server -- inklusive Microsoft
            Internet Information Server, Lighttpd, Nginx und andere -- aber die meisten
            Entwickler sollten zumindest mit Apache umgehen können, und es bietet eine einfache
            Einführung in Zend Framework's Verzeichnisstruktur und die Möglichkeiten des
            Rewritings.
        </para>

        <para>
            Um den eigenen VHost zu erstellen muss man den Ort der eigenen
            <filename>httpd.conf</filename> Datei kennen und potentiell auch wo andere
            Konfigurationsdateien platziert sind. Einige übliche Orte sind:
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <filename>/etc/httpd/httpd.conf</filename> (Fedora, RHEL, und andere)
                </para>
            </listitem>

            <listitem>
                <para>
                    <filename>/etc/apache2/httpd.conf</filename> (Debian, Ubuntu, und andere)
                </para>
            </listitem>

            <listitem>
                <para>
                    <filename>/usr/local/zend/etc/httpd.conf</filename> (Zend Server auf *nix
                    Maschinen)
                </para>
            </listitem>

            <listitem>
                <para>
                    <filename>C:\Program Files\Zend\Apache2\conf</filename> (Zend Server auf Windows
                    Maschinen)
                </para>
            </listitem>
        </itemizedlist>

        <para>
            In der eigenen <filename>httpd.conf</filename> (oder
            <filename>httpd-vhosts.conf</filename> auf anderen Systemen) muss man zwei Dinge tun.
            Erstens sicherstellen das der <varname>NameVirtualHost</varname> definiert ist;
            typischerweise wird man Ihn auf einen Wert von "*:80" setzen. Zweitens einen
            virtuellen Host definieren:
        </para>

        <programlisting language="apache"><![CDATA[
<VirtualHost *:80>
    ServerName quickstart.local
    DocumentRoot /path/to/quickstart/public

    SetEnv APPLICATION_ENV "development"

    <Directory /path/to/quickstart/public>
        DirectoryIndex index.php
        AllowOverride All
        Order allow,deny
        Allow from all
    </Directory>
</VirtualHost>
]]></programlisting>

        <para>
            Es gilt verschiedene Dinge zu beachten. Erstens ist zu beachten dass die
            <varname>DocumentRoot</varname> Einstellung das Unterverzeichnis
            <filename>public</filename> des eigenen Projekts spezifiziert; dies bedeutet das nur
            Dateien in diesem Verzeichnis jemals direkt vom Server serviert werden. Zweitens sind
            die Direktiven <varname>AllowOverride</varname>, <varname>Order</varname>, und
            <varname>Allow</varname> zu beachten; diese erlauben uns <filename>htacess</filename>
            Dateien in unserem Projekt zu verwenden. Wärend der Entwicklung ist das eine gute
            Praxis, da es verhindert den Web Server konstant zurücksetzen zu müssen wenn man
            Änderungen in den Site Direktiven macht; trotzdem sollte man in der Produktion den
            Inhalt der <filename>htacess</filename> Datei in die Server Konfiguration verschieben
            und diese deaktivieren. Drittens ist die <varname>SetEnv</varname> Direktive zu
            beachten. Was wir hier erledigen ist das Setzen einer Umgebungsvariable für den
            eigenen virtuellen Host; diese Variable wird in der <filename>index.php</filename>
            geholt und verwendet um die Konstante <constant>APPLICATION_ENV</constant> für unsere
            Zend Framework Anwendung zu setzen. In der Produktion kann diese Direktive unterdrückt
            werden (in diesem Fall wird es auf den Standardwert "production" verweisen) oder Sie
            explizit auf "production" setzen.
        </para>

        <para>
            Letztendlich muss man einen Eintrag in der eigenen <filename>hosts</filename> Datei
            hinzufügen welche mit dem Wert korrespondiert der in der <varname>ServerName</varname>
            Direktive plaziert wurde. Auf *nix-artigen Systemen ist das normalerweise
            <filename>/etc/hosts</filename>; auf Windows findet man typischerweise
            <filename>C:\WINDOWS\system32\drivers\etc</filename> in Ihm. Unabhängig vom System
            sieht der Eintrag wie folgt aus:
        </para>

        <programlisting language="text"><![CDATA[
127.0.0.1 quickstart.local
]]></programlisting>

        <para>
            Den Webserver starten (oder ihn Restarten), und man sollte bereit sein weiterzumachen.
        </para>
    </sect2>

    <sect2 id="learning.quickstart.create-project.checkpoint">
        <title>Checkpoint</title>

        <para>
            An diesem Punkt sollte man in der Lage sein die initiale Zend Framework Anwendung
            auszuführen. Der Browser sollte auf den Servernamen zeigen welcher im vorherigen
            Abschnitt konfiguriert wurde; ab diesem Zeitpunkt sollte man in der Lage sein die
            Startseite zu sehen.
        </para>
    </sect2>
</sect1>
