Zend_Gdata を触ってみた。

Zend_Gdata で Youtube の検索を作ってみた。
わずかなコードで作れてしまった。
※ほとんどオフィシャルのドキュメントに書いてあることだけど・・。
http://framework.zend.com/manual/ja/zend.gdata.youtube.html#zend.gdata.youtube.videos


まずは、以下のURLより Zend_Gdata を取得。
http://framework.zend.com/download/webservices/


DL して展開する。
展開したディレクトリの中に library というディレクトリがあり、
その下に Zend/Gdata と、Gdata.php があるので、
それを他の Zend Framework のライブラリディレクトリにコピーする。

ZendFramework から使える、ということですが、ZendFramwork を使わなくとも独立して使える形になるとより嬉しいかもしれませんね。

http://phpspot.org/blog/archives/2007/12/google_data_php.html

PHPSPOT には上記のように、記述されていますが、
取得して展開した library ディレクトリ以下をまるっとinclude_pathに指定すれば、
外部ライブラリとして使えます。


今回は Zend Framework の一機能として使ってみたかったので、
既存の library ディレクトリにコピーした。
あと、自分の Zend FrameworkSmarty を組み込んでいる。


Zend FrameworkSmarty との連携は、以下の URL を参考にさせて貰った。
http://www.trekdevel.net/archives/118


module ディレクトリとして youtube というディレクトリを作り、
その下に contollers、views を設置。
controllers には indexController.php を、views には index.tpl と、list.tpl を設置。


indexController.php

<?php
require_once 'My/Controller/Action.php';
require_once 'Zend/Loader.php';

class Youtube_IndexController extends My_Controller_Action
{
    protected $_youTubeObj;

    public function init()
    {
        parent::init();
        // YouTube オブジェクトの生成
        Zend_Loader::loadClass('Zend_GData_YouTube');
        $this->_youTubeObj = new Zend_Gdata_YouTube();
    }

    public function indexAction()
    {
        // indexAction はなにもしない
    }
    public function listAction()
    {
        $query = $this->_youTubeObj->newVideoQuery();
        $startIndex = 0;
        $listCount = 20;
        if ($this->_request->getParam('page') != '') {
            $startIndex = $this->_request->getParam('page');
        }
        $query->startIndex = $startIndex;
        $searchWords = $this->_request->getParam('search');
        if ($searchWords == '') {
            $this->assign('error', '検索キーワードを入力して下さい。');
            return;
        }
        $query->videoQuery = $searchWords;
        $maxResults = 20;
        $query->maxResults = $maxResults;
        $orderBy = 'viewCount';
        $query->orderBy = $orderBy;
        
        $videoFeeds = $this->_youTubeObj->getVideoFeed($query);
        if (is_object($videoFeeds)) {
            $this->assign('videoFeeds', $videoFeeds);
        } else {
            $this->assign('error', '見つかりませんでした');
        }
        $nextPage = $listCount + $startIndex;
        $this->assign('search', $searchWords);
        $this->assign('prev_page', $startIndex);
        $this->assign('next_page', $nextPage);
    }
}

Smarty のオブジェクトは親クラスで生成しており、
設定もそこで行っている。


続いて、テンプレート。
index.tpl(抜粋)

<form action="/youtube/index/list" method="post">
    <input type="text" name="search" value="20" maxlength="128" />
    <input type="submit" name="btnSearch" value="検索" />
</form>


list.tpl(抜粋)

<h1>Youtube Search by Zend Framework</h1>
<p>{$smarty.now|date_format} 更新</p>
<p>
  {foreach from=$videoFeeds item="items" key="key" name="videoFeed"}
    <ul>
        <li>
          <img src="{$items->mediaGroup->thumbnail.0->url|escape}" />
        </li>
        <li>
          <a href="{$items->mediaGroup->player.0->url}" target="_blank">
            {$items->mediaGroup->title->text|escape}
          </a>
        </li>
        <li>{$items->mediaGroup->description->text|escape}</li>
    </ul>
  {/foreach}
</p>
<p>
<a href="/youtube/index/list/page/{$next_page|escape}/search/
{$search|escape}">次へ</a>
</p>


テンプレートに表示される結果は、
サムネイル画像、Youtube へのリンク、動画のタイトル、説明だけを表示した。
取得した結果は、videoFeeds にオブジェクトとして格納されているので、
foreach で回しながら、取得すれば良い。
今回はテンプレート側で処理を行ったが、コントローラ側で必要なものだけを
assign してやる方が良いかも。。。
いずれにせよ、結構簡単に作れてしまう。


あと、Zend_GData にはサンプルも入ってるので、それも参考になると思う。