<?xml version="1.0" encoding="UTF-8"?>
<!-- Reviewed: no -->
<!-- EN-Revision: 17502 -->
<sect1 id="zend.feed.importing">
    <title>フィードの読み込み</title>

    <para>
        <classname>Zend_Feed</classname> を使用すると、フィードの取得が非常に簡単に行えます。
        フィードの <acronym>URI</acronym> がわかれば、単に <methodname>Zend_Feed::import()</methodname>
        メソッドを使用すればよいのです。
    </para>

    <programlisting language="php"><![CDATA[
$feed = Zend_Feed::import('http://feeds.example.com/feedName');
]]></programlisting>

    <para>
        <classname>Zend_Feed</classname> を使用して、ファイルや <acronym>PHP</acronym>
        文字列変数からフィードを読み込むこともできます。
    </para>

    <programlisting language="php"><![CDATA[
// テキストファイルからフィードを読み込みます
$feedFromFile = Zend_Feed::importFile('feed.xml');

// PHP の文字列変数からフィードを読み込みます
$feedFromPHP = Zend_Feed::importString($feedString);
]]></programlisting>

    <para>
        上のすべての例では、成功した場合に返されるのは
        <classname>Zend_Feed_Abstract</classname> を実装したクラスのオブジェクトで、
        フィードの形式によって異なります。もし上のメソッドで <acronym>RSS</acronym> フィードを取得したのなら、
        返されるオブジェクトは <classname>Zend_Feed_Rss</classname> です。一方、Atom
        フィードを読み込んだのなら <classname>Zend_Feed_Atom</classname>
        オブジェクトが返されます。読み込みに失敗したりフィードの形式がおかしかったりした場合は
        <classname>Zend_Feed_Exception</classname> がスローされます。
    </para>

    <sect2 id="zend.feed.importing.custom">
        <title>独自のフィード</title>

        <para>
            <classname>Zend_Feed</classname> を使用すると、独自のフィードを簡単に作成することができます。
            単に、配列を作成してそれを <classname>Zend_Feed</classname> で読み込むだけでいいのです。
            配列を読み込むには <methodname>Zend_Feed::importArray()</methodname> あるいは
            <methodname>Zend_Feed::importBuilder()</methodname> を使用します。
            この場合、<classname>Zend_Feed_Builder_Interface</classname>
            を実装した独自のデータソースによって配列がその場で算出されます。
        </para>

        <sect3 id="zend.feed.importing.custom.importarray">
            <title>独自の配列の読み込み</title>

            <programlisting language="php"><![CDATA[
// フィードを配列から読み込みます
$atomFeedFromArray = Zend_Feed::importArray($array);

// この行は、上と同じ意味です。
// デフォルトで Zend_Feed_Atom のインスタンスを返します
$atomFeedFromArray = Zend_Feed::importArray($array, 'atom');

// rss フィードを配列から読み込みます
$rssFeedFromArray = Zend_Feed::importArray($array, 'rss');
]]></programlisting>

            <para>
                配列の書式は、次のような構造になっていなければなりません。
            </para>

            <programlisting language="php"><![CDATA[
array(
    // 必須
    'title' => 'フィードのタイトル',
    'link'  => 'フィードへの正式な url',

    // 任意
    'lastUpdate' => '更新日のタイムスタンプ',
    'published'  => '公開日のタイムスタンプ',

    // 必須
    'charset' => 'テキストデータの文字セット',

    // 任意
    'description' => 'フィードについての短い説明',
    'author'      => 'フィードの作者/公開者',
    'email'       => '作者のメールアドレス',

    // 任意、atom を使用している場合は無視されます
    'webmaster' => '技術的な問題の担当者のメールアドレス',

    // 任意
    'copyright' => '著作権に関する情報',
    'image'     => '画像への url',
    'generator' => '作成したツール',
    'language'  => 'フィードで使用している言語',

    // 任意、atom を使用している場合は無視されます
    'ttl'    => 'フィードを何分間キャッシュするか',
    'rating' => 'チャネルの PICS レート',

    // 任意、atom を使用している場合は無視されます
    // 更新を通知するクラウド
    'cloud'       => array(
        // 必須
        'domain' => 'クラウドのドメイン、たとえば rpc.sys.com',

        // 任意、デフォルトは 80
        'port' => '接続するポート',

        // 必須
        'path'              => 'クラウドのパス、たとえば /RPC2',
        'registerProcedure' => 'コールするプロシージャ、たとえば myCloud.rssPleaseNotify',
        'protocol'          => '使用するプロトコル、たとえば soap や xml-rpc'
    ),

    // 任意、atom を使用している場合は無視されます
    // フィードとともに表示させるテキスト入力ボックス
    'textInput'   => array(
        // 必須
        'title'       => 'テキスト入力欄の Submit ボタンのラベル',
        'description' => 'テキスト入力欄についての説明',
        'name'        => 'テキスト入力欄のテキストオブジェクトの名前',
        'link'        => '入力内容を処理する CGI スクリプトの URL'
    ),

    // 任意、atom を使用している場合は無視されます
    // アグリゲータに対して、特定の時間に処理を飛ばすように伝えるヒント
    'skipHours' => array(
        // 最大 24 行までで、値は 0 から 23 までの数値
        // たとえば 13 (午後一時)
        '24 時間形式の時間'
    ),

    // 任意、atom を使用している場合は無視されます
    // アグリゲータに対して、特定の日に処理を飛ばすように伝えるヒント
    'skipDays ' => array(
        // 最大 7 行まで
        // 値は Monday、Tuesday、Wednesday、Thursday、Friday、Saturday あるいは Sunday
        // たとえば Monday
        'スキップする曜日'
    ),

    // 任意、atom を使用している場合は無視されます
    // Itunes 拡張データ
    'itunes' => array(
        // 任意、デフォルトは本体の author の値
        'author' => 'Artist 列',

        // 任意、デフォルトは本体の author の値
        // ポッドキャストのオーナー
        'owner' => array(
            'name'  => 'オーナーの名前',
            'email' => 'オーナーのメールアドレス'
        ),

        // 任意、デフォルトは本体の image の値
        'image' => 'アルバム/ポッドキャストの画像',

        // 任意、デフォルトは本体の description の値
        'subtitle' => '短い説明',
        'summary'  => '長い説明',

        // 任意
        'block' => 'エピソードを表示しないようにする (yes|no)',

        // 必須、Category 列および iTunes Music Store Browse での値
        'category' => array(
            // 最大 3 行まで
            array(
                // 必須
                'main' => 'メインカテゴリ',

                // 任意
                'sub'  => 'サブカテゴリ'
            )
        ),

        // 任意
        'explicit'     => 'ペアレンタルコントロールの警告グラフィック (yes|no|clean)',
        'keywords'     => '最大 12 件までのキーワードのカンマ区切りリスト',
        'new-feed-url' => 'iTunes に対して新しいフィード URL の場所を通知するために使用する'
    ),

    'entries' => array(
        array(
            // 必須
            'title' => 'フィードエントリのタイトル',
            'link'  => 'フィードエントリへの url',

            // 必須、テキストのみで html を含まない
            'description' => 'フィードエントリの短いバージョン',

            // 任意
            'guid' => '記事の id。'
                   .  '存在しない場合は link の値を使用します',

            // 任意、html を含めることが可能
            'content' => '長いバージョン',

            // 任意
            'lastUpdate' => '公開日のタイムスタンプ',
            'comments'   => 'フィードエントリに対するコメントページ',
            'commentRss' => '関連するコメントへのフィードの url',

            // 任意、フィードエントリの元のソース
            'source' => array(
                // 必須
                'title' => '元ソースのタイトル',
                'url'   => '元ソースへの url'
            ),

            // 任意、関連付けるカテゴリの一覧
            'category' => array(
                array(
                    // 必須
                    'term' => '最初のカテゴリのラベル',

                    // 任意
                    'scheme' => 'カテゴリのスキームを表す url'
                ),

                array(
                    // 二番目以降のカテゴリのデータ
                )
            ),

            // 任意、フィードエントリのエンクロージャの一覧
            'enclosure'    => array(
                array(
                    // 必須
                    'url' => 'リンクされたエンクロージャの url',

                    // 任意
                    'type' => 'エンクロージャの mime タイプ',
                    'length' => 'リンクされたコンテンツのサイズを表すオクテット数'
                ),

                array(
                    // 二番目以降のエンクロージャのデータ
                )
            )
        ),

        array(
            // 二番目のエントリ以降のデータ
        )
    )
);
]]></programlisting>

            <para>
                参考
            </para>

            <itemizedlist>
                <listitem>
                    <para>
                        <acronym>RSS</acronym> 2.0 の仕様: <ulink url="http://blogs.law.harvard.edu/tech/rss">RSS 2.0</ulink>
                    </para>
                </listitem>

                <listitem>
                    <para>
                        Atom の仕様: <ulink url="http://tools.ietf.org/html/rfc4287">RFC 4287</ulink>
                    </para>
                </listitem>

                <listitem>
                    <para>
                        <acronym>WFW</acronym> の仕様: <ulink url="http://wellformedweb.org/news/wfw_namespace_elements">Well
                            Formed Web</ulink>
                    </para>
                </listitem>

                <listitem>
                    <para>
                        iTunes の仕様: <ulink
                            url="http://www.apple.com/itunes/store/podcaststechspecs.html">iTunes
                            Technical Specifications</ulink>
                    </para>
                </listitem>
            </itemizedlist>
        </sect3>

        <sect3 id="zend.feed.importing.custom.importbuilder">
            <title>独自のデータソースの読み込み</title>

            <para>
                <classname>Zend_Feed_Builder_Interface</classname> を実装した任意のデータソースから、
                <classname>Zend_Feed</classname> のインスタンスを作成することができます。単に
                <methodname>getHeader()</methodname> メソッドおよび <methodname>getEntries()</methodname>
                メソッドを実装するだけで、自分で作成したオブジェクトが
                <methodname>Zend_Feed::importBuilder()</methodname> で使用できるようになります。
                <classname>Zend_Feed_Builder</classname> は、これを単純に実装したものです。
                コンストラクタで配列を受け取り、ちょっとした検証を行い、
                そして <methodname>importBuilder()</methodname> メソッドで使用できるようにします。
                <methodname>getHeader()</methodname> メソッドは <classname>Zend_Feed_Builder_Header</classname>
                のインスタンスを返さなければなりません。また <methodname>getEntries()</methodname> は
                <classname>Zend_Feed_Builder_Entry</classname> のインスタンスの配列を返さなければなりません。
            </para>

            <note>
                <para>
                    <classname>Zend_Feed_Builder</classname> は、使用法を説明するための具体的な実装例です。
                    実際に使用する際には、
                    <classname>Zend_Feed_Builder_Interface</classname>
                    を実装した独自のクラスを作成することを推奨します。
                </para>
            </note>

            <para>
                これが、<methodname>Zend_Feed::importBuilder()</methodname> の使用例です。
            </para>

            <programlisting language="php"><![CDATA[
// 独自のビルダソースからフィードを読み込みます
$atomFeedFromArray =
    Zend_Feed::importBuilder(new Zend_Feed_Builder($array));

// この行は、上と同じ意味です。
// デフォルトで Zend_Feed_Atom のインスタンスを返します
$atomFeedFromArray =
    Zend_Feed::importArray(new Zend_Feed_Builder($array), 'atom');

// 独自のビルダ配列から rss フィードを読み込みます
$rssFeedFromArray =
    Zend_Feed::importArray(new Zend_Feed_Builder($array), 'rss');
]]></programlisting>

        </sect3>

        <sect3 id="zend.feed.importing.custom.dump">

            <title>フィードの内容の出力</title>

            <para>
                <classname>Zend_Feed_Abstract</classname> インスタンスの内容を出力するには、
                <code>send()</code> メソッドあるいは <code>saveXml()</code> メソッドを使用します。
            </para>

            <programlisting language="php"><![CDATA[
assert($feed instanceof Zend_Feed_Abstract);

// フィードを標準出力に出力します
print $feed->saveXML();

// http ヘッダを送信し、フィードを出力します
$feed->send();
]]></programlisting>
        </sect3>
    </sect2>
</sect1>
<!--
vim:se ts=4 sw=4 et:
-->
