# フィードの読み込み

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

    $feed = Zend_Feed::import('http://feeds.example.com/feedName');

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

    // テキストファイルからフィードを読み込みます
    $feedFromFile = Zend_Feed::importFile('feed.xml');

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

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

## 独自のフィード

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

### 独自の配列の読み込み

    // フィードを配列から読み込みます
    $atomFeedFromArray = Zend_Feed::importArray($array);

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

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

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

    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(
                // 二番目のエントリ以降のデータ
            )
        )
    );

参考

- RSS 2.0 の仕様: RSS 2.0

- Atom の仕様: RFC 4287

- WFW の仕様: Well Formed Web

- iTunes の仕様: iTunes Technical Specifications

### 独自のデータソースの読み込み

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

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

これが、`Zend_Feed::importBuilder()` の使用例です。

    // 独自のビルダソースからフィードを読み込みます
    $atomFeedFromArray =
        Zend_Feed::importBuilder(new Zend_Feed_Builder($array));

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

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

### フィードの内容の出力

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

    assert($feed instanceof Zend_Feed_Abstract);

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

    // http ヘッダを送信し、フィードを出力します
    $feed->send();