<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 24249 -->
<sect1 id="learning.quickstart.create-project">
    <title>プロジェクトを作成</title>

    <para>
        プロジェクトを作成するには、まず、Zend Frameworkをダウンロードして、解凍しなければいけません。
    </para>

    <sect2 id="learning.quickstart.create-project.install-zf">
        <title>Zend Framework をインストール</title>

        <para>
            全部揃った <acronym>PHP</acronym> スタックと一緒に Zend Framework
            を手に入れる最も簡単な方法は、<ulink
             url="http://www.zend.co.jp/product/zendserver.html">Zend Server</ulink>
            をインストールすることです。Zend Server には、
            多くの Linux ディストリビューションと互換性のある一般的なインストール・パッケージだけでなく、
            Mac OSX、Windows、Fedora Core および Ubuntu 用のネイティブのインストーラーがあります。
        </para>

        <para>
            Zend Server をインストールし終わると、Mac OSX および Linux の場合は
            <filename>/usr/local/zend/share/ZendFramework</filename> 配下に、
            Windows の場合は 
            <filename>C:\Program Files\Zend\ZendServer\share\ZendFramework</filename>
            配下にフレームワークのファイルが見つかるでしょう。
            <constant>include_path</constant>は、Zend Frameworkを含むように構成済みです。
        </para>

        <para>
            あるいは、<ulink
             url="http://framework.zend.com/download/latest">Zend Framework の最新版</ulink>
            をダウンロードして内容を解凍することができます。
            <!-- TODO  -->make a note of where you have done so.
        </para>

        <para>
            <filename>php.ini</filename> の <constant>include_path</constant> 設定に
            アーカイブの<filename>library/</filename>サブディレクトリへのパスを任意に追加できます。
        </para>

        <para>
            これで終わりです。これで Zend Framework がインストールされ、使えるようになりました。
        </para>
    </sect2>

    <sect2 id="learning.quickstart.create-project.create-project">
        <title>プロジェクトを作成</title>

        <note>
            <title>zf コマンドラインツール</title>


            <para>
                Zend Framework インストール先には <filename>bin/</filename> サブディレクトリがあり、
                UNIX ベースおよび Windows ベースのユーザーのために、それぞれスクリプト
                <filename>zf.sh</filename> および <filename>zf.bat</filename> を含みます。
                このスクリプトに絶対パスを書きとめてください。
            </para>


            <para>
                <command>zf</command> コマンドとの関係がわかっている場所ではどこでも
                スクリプトへの絶対パスに置き換えてください。Unix のようなシステムでは、シェルのエイリアス機能を使いたいかもしれません。
                <command>alias zf.sh=path/to/ZendFramework/bin/zf.sh</command>
            </para>

            <para>
                <command>zf</command> コマンドラインツール設定中に問題があった場合は、
                <link linkend="zend.tool.framework.clitool">マニュアル</link> を参照してください。
            </para>
        </note>

        <para>
            ターミナルを開きます。(Windows では<command>スタート -> ファイル名を指定して実行</command>
            、それから <command>cmd</command> を使用します)
            プロジェクトを開始したいディレクトリに進みます。それから、適切なスクリプトへのパスを使用して、下記のいずれかを実行します。
        </para>

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

        <para>
            このコマンドを実行すると、基本的なサイト構造が作成されます。そこには基になるコントローラやビューが含まれます。
            ツリーは下記のように見えます。
        </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>
            もしこの時点で Zend Framework を <constant>include_path</constant>
            に追加していないなら、<filename>library/</filename> ディレクトリにコピーするか、または symlink することを勧めます。
            いずれにせよ、Zend Framework インストール先の <filename>library/Zend/</filename>
            ディレクトリをプロジェクトの <filename>library/</filename> ディレクトリに再帰的にコピーするか、
            または symlink することが必要になるでしょう。Unix のようなシステムでは、それは下記のいずれかのように見えます。
        </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>
            Windows システムでは、これをエクスプローラから行なうのが最も簡単かもしれません。
        </para>

        <!-- TODO : to be translated -->
        <para>
            Now that the project is created, the main artifacts to begin understanding are the
            bootstrap, configuration, action controllers, and views.
        </para>
    </sect2>

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

        <para>
            Your <classname>Bootstrap</classname> class defines what resources and components to
            initialize. By default, Zend Framework's <link linkend="zend.controller.front">Front
                Controller</link> is initialized, and it uses the
            <filename>application/controllers/</filename> as the default directory in which to look
            for action controllers (more on that later). そのクラスは下記のように見えます。
        </para>

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

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

        <para>
            As you can see, not much is necessary to begin with.
        </para>
    </sect2>

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

        <para>
            While Zend Framework is itself configurationless, you often need to configure your
            application. The default configuration is placed in
            <filename>application/configs/application.ini</filename>, and contains some basic
            directives for setting your <acronym>PHP</acronym> environment (for instance, turning
            error reporting on and off), indicating the path to your bootstrap class (as well as its
            class name), and the path to your action controllers. それは下記のようになります。
        </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>
            Several things about this file should be noted. First, when using
            <acronym>INI</acronym>-style configuration, you can reference constants directly and
            expand them; <constant>APPLICATION_PATH</constant> is actually a constant. Additionally
            note that there are several sections defined: production, staging, testing, and
            development. The latter three inherit settings from the "production" environment. This
            is a useful way to organize configuration to ensure that appropriate settings are
            available in each stage of application development.
        </para>
    </sect2>

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

        <para>
            Your application's <emphasis>action controllers</emphasis> contain your application
            workflow, and do the work of mapping your requests to the appropriate models and views.
        </para>

        <para>
            An action controller should have one or more methods ending in "Action"; these methods
            may then be requested via the web. By default, Zend Framework URLs follow the schema
            <constant>/controller/action</constant>, where "controller" maps to the action
            controller name (minus the "Controller" suffix) and "action" maps to an action method
            (minus the "Action" suffix).
        </para>

        <para>
            Typically, you always need an <classname>IndexController</classname>, which is a
            fallback controller and which also serves the home page of the site, and an
            <classname>ErrorController</classname>, which is used to indicate things such as
            <acronym>HTTP</acronym> 404 errors (controller or action not found) and
            <acronym>HTTP</acronym> 500 errors (application errors).
        </para>

        <para>
            デフォルトの <classname>IndexController</classname> は下記の通りです。
        </para>

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

class IndexController extends Zend_Controller_Action
{

    public function init()
    {
        /* Initialize action controller here */
    }

    public function indexAction()
    {
        // action body
    }
}
]]></programlisting>

        <para>
            そして、デフォルトの <classname>ErrorController</classname> は下記の通りです。
        </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 error -- controller or action not found
                $this->getResponse()->setHttpResponseCode(404);
                $this->view->message = 'Page not found';
                break;
            default:
                // application error
                $this->getResponse()->setHttpResponseCode(500);
                $this->view->message = 'Application error';
                break;
        }

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

        <para>
            You'll note that (1) the <classname>IndexController</classname> contains no real code,
            and (2) the <classname>ErrorController</classname> makes reference to a "view" property.
            That leads nicely into our next subject.
        </para>
    </sect2>

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

        <para>
            Views in Zend Framework are written in plain old <acronym>PHP</acronym>. View scripts
            are placed in <filename>application/views/scripts/</filename>, where they are further
            categorized using the controller names. In our case, we have an
            <classname>IndexController</classname> and an <classname>ErrorController</classname>,
            and thus we have corresponding <filename>index/</filename> and
            <filename>error/</filename> subdirectories within our view scripts directory. Within
            these subdirectories, you will then find and create view scripts that correspond to each
            controller action exposed; in the default case, we thus have the view scripts
            <filename>index/index.phtml</filename> and <filename>error/error.phtml</filename>.
        </para>

        <para>
            View scripts may contain any markup you want, and use the <emphasis>&lt;?php</emphasis>
            opening tag and <emphasis>?&gt;</emphasis> closing tag to insert <acronym>PHP</acronym>
            directives.
        </para>

        <para>
            The following is what we install by default for the
            <filename>index/index.phtml</filename> view script:
        </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>Welcome to the <span id="zf-name">Zend Framework!</span><h1 />
    <h3>This is your project's main page<h3 />
    <div id="more-information">
        <p>
            <img src="http://framework.zend.com/images/PoweredBy_ZF_4LightBG.png" />
        </p>

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

        <para>
            The <filename>error/error.phtml</filename> view script is slightly more interesting as
            it uses some <acronym>PHP</acronym> conditionals:
        </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 Default Application</title>
</head>
<body>
  <h1>An error occurred</h1>
  <h2><?php echo $this->message ?></h2>

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

  <h3>Exception information:</h3>
  <p>
      <b>Message:</b> <?php echo $this->exception->getMessage() ?>
  </p>

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

  <h3>Request Parameters:</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>バーチャル・ホストを作成</title>

        <para>
            このクイックスタートの必要上、<ulink url="http://httpd.apache.org/">Apache Web サーバー</ulink>
            を使用すると仮定しています。Zend Framework は、他の Web サーバーでも申し分なく動作します。
            それには、Microsoft Internet Information Server、lighttpd、nginx などを含みます。
            しかし、大抵の開発者は少なくとも Apache をよく知っていなければなりません。
            そして、それはZend Framework のディレクトリ構造とリライト能力への簡単な導入を提示します。
        </para>

        <para>
            vhost を作成するには、<filename>httpd.conf</filename> ファイルの位置を知る必要があります。
            その場所には他の構成ファイルが格納されている可能性があります。いくつかの一般的な場所はこうです。
        </para>

        <itemizedlist>
            <listitem>
                <para>
                    <filename>/etc/httpd/httpd.conf</filename> (Fedora や RHEL など)
                </para>
            </listitem>

            <listitem>
                <para>
                    <filename>/etc/apache2/httpd.conf</filename> (Debian や Ubuntu など)
                </para>
            </listitem>

            <listitem>
                <para>
                    <filename>/usr/local/zend/etc/httpd.conf</filename> (Linux 版 Zend Server)
                </para>
            </listitem>

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

        <para>
            <filename>httpd.conf</filename> (一部のシステムでは <filename>httpd-vhosts.conf</filename>)
            内で行なうべきことが２つあります。
            １つ目は、<varname>NameVirtualHost</varname> が定義されていることを確実にすることです。
            一般的にはそれを "*:80" という値に設定します。
            ２つ目は、バーチャル・ホストを定義することです。
        </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>

        <!-- TODO : to be translated -->
        <para>
            There are several things to note. First, note that the <varname>DocumentRoot</varname>
            setting specifies the <filename>public</filename> subdirectory of our project; this
            means that only files under that directory can ever be served directly by the server.
            Second, note the <varname>AllowOverride</varname>, <varname>Order</varname>, and
            <varname>Allow</varname> directives; these are to allow us to use
            <filename>htacess</filename> files within our project. During development, this is a
            good practice, as it prevents the need to constantly restart the web server as you make
            changes to your site directives; however, in production, you should likely push the
            content of your <filename>htaccess</filename> file into your server configuration and
            disable this. Third, note the <varname>SetEnv</varname> directive. What we are doing
            here is setting an environment variable for your virtual host; this variable will be
            picked up in the <filename>index.php</filename> and used to set the
            <constant>APPLICATION_ENV</constant> constant for our Zend Framework application. In
            production, you can omit this directive (in which case it will default to the value
            "production") or set it explicitly to "production".
        </para>

        <para>
            Finally, you will need to add an entry in your <filename>hosts</filename> file
            corresponding to the value you place in your <varname>ServerName</varname> directive. On
            *nix-like systems, this is usually <filename>/etc/hosts</filename>; on Windows, you'll
            typically find it in <filename>C:\WINDOWS\system32\drivers\etc</filename>. Regardless of
            the system, the entry will look like the following:
        </para>

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

        <para>
            Start your webserver (or restart it), and you should be ready to go.
        </para>
    </sect2>

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

        <para>
            At this point, you should be able to fire up your initial Zend Framework application.
            Point your browser to the server name you configured in the previous section; you should
            be able to see a welcome page at this point.
        </para>
    </sect2>
</sect1>
