12.2. フィードの読み込み

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

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

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

<?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 がスローされます。

12.2.1. 独自のフィード

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

12.2.1.1. 独自の配列の読み込み

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

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

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

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

<?php
array(
      'title'       => 'フィードのタイトル', // 必須
      'link'        => 'フィードへの正式な url', // 必須
      'lastUpdate'  => '更新日のタイムスタンプ', // 任意
      'published'   => '公開日のタイムスタンプ', // 任意
      'charset'     => 'テキストデータの文字セット', // 必須
      'description' => 'フィードについての短い説明', // 任意
      'author'      => 'フィードの作者/公開者', // 任意
      'email'       => '作者のメールアドレス', // 任意
      'webmaster'   => '技術的な問題の担当者のメールアドレス' // 任意、atom を使用している場合は無視されます
      'copyright'   => '著作権に関する情報', // 任意
      'image'       => '画像への url', // 任意
      'generator'   => '作成したツール', // 任意
      'language'    => 'フィードで使用している言語', // 任意
      'ttl'         => 'フィードを何分間キャッシュするか', // 任意、atom を使用している場合は無視されます
      'rating'      => 'チャネルの PICS レート', // 任意、atom を使用している場合は無視されます
      'cloud'       => array(
                             'domain'            => 'クラウドのドメイン、たとえば rpc.sys.com' // 必須
                             'port'              => '接続するポート' // 任意、デフォルトは 80
                             'path'              => 'クラウドのパス、たとえば /RPC2' // 必須
                             'registerProcedure' => 'コールするプロシージャ、たとえば myCloud.rssPleaseNotify' // 必須
                             'protocol'          => '使用するプロトコル、たとえば soap や xml-rpc' // 必須
                             ), // 更新を通知するクラウド // 任意、atom を使用している場合は無視されます
      'textInput'   => array(
                             'title'       => 'テキスト入力欄の Submit ボタンのラベル' // 必須,
                             'description' => 'テキスト入力欄についての説明' // 必須
                             'name'        => 'テキスト入力欄のテキストオブジェクトの名前' // 必須
                             'link'        => '入力内容を処理する CGI スクリプトの URL' // 必須
                             ) // フィードとともに表示させるテキスト入力ボックス // 任意、atom を使用している場合は無視されます
      'skipHours'   => array(
                             '24 時間形式の時間', // たとえば 13 (午後一時)
                             // 最大 24 行までで、値は 0 から 23 までの数値
                             ) // アグリゲータに対して、特定の時間に処理を飛ばすように伝えるヒント // 任意、atom を使用している場合は無視されます
      'skipDays '   => array(
                             'スキップする曜日', // たとえば Monday
                             // 最大 7 行までで、値は Monday、Tuesday、Wednesday、Thursday、Friday、Saturday あるいは Sunday
                             ) // アグリゲータに対して、特定の日に処理を飛ばすように伝えるヒント // 任意、atom を使用している場合は無視されます
      'itunes'      => array(
                             'author'       => 'Artist 列' // 任意、デフォルトは本体の author の値
                             'owner'        => array(
                                                     'name' => 'オーナーの名前' // 任意、デフォルトは本体の author の値
                                                     'email' => 'オーナーのメールアドレス' // 任意、デフォルトは本体の email の値
                                                     ) // ポッドキャストのオーナー // 任意
                             'image'        => 'アルバム/ポッドキャストの画像' // 任意、デフォルトは本体の image の値
                             'subtitle'     => '短い説明' // 任意、デフォルトは本体の description の値
                             'summary'      => '長い説明' // 任意、デフォルトは本体の description の値
                             'block'        => 'エピソードを表示しないようにする (yes|no)' // 任意
                             'category'     => array(
                                                     array('main' => 'メインカテゴリ', // 必須
                                                           'sub'  => 'サブカテゴリ' // 任意
                                                           ),
                                                     // 最大 3 行まで
                                                     ) // 'Category 列、および iTunes Music Store Browse での値' // 必須
                             'explicit'     => 'ペアレンタルコントロールの警告グラフィック (yes|no|clean)' // 任意
                             'keywords'     => '最大 12 件までのキーワードのカンマ区切りリスト' // 任意
                             'new-feed-url' => 'iTunes に対して新しいフィード URL の場所を通知するために使用する' // 任意
                             ) // Itunes 拡張データ // 任意、atom を使用している場合は無視されます
      'entries'     => array(
                             array(
                                   'title'        => 'フィードエントリのタイトル', // 必須
                                   'link'         => 'フィードエントリへの url', // 必須
                                   'description'  => 'フィードエントリの短いバージョン', // 必須、テキストのみで html を含まない
                                   'guid'         => '記事の id。存在しない場合は link の値を使用します', // 任意
                                   'content'      => '長いバージョン', // 任意、html を含めることが可能
                                   '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(
                                   // 二番目のエントリ以降のデータ
                                   )
                             )
       );

参考

12.2.1.2. 独自のデータソースの読み込み

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() の使用例です。

<?php
// 独自のビルダソースからフィードを読み込みます
$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');

12.2.1.3. フィードの内容の出力

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

<?php
assert($feed instanceof Zend_Feed_Abstract);

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

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