ハマりポイントがあまりにも多かったので自分用にメモ
やりたかった事は単純で、自分の動画リストをページ送りで取得したかっただけ。
サンプルソースは確かに動くのだけど、
パラメータを追加したいとか、ちょっとした指定でとたんにサンプルソースは使えなくなる。
Zend_Gdata_YouTubeの出来がちょっと酷い。
getUserUploads()
は引数$locationを与えれば、クエリーされると思いきやソースを見たら全然違った。
\Zend\Gdata\YouTube.php
public function getUserUploads($user = null, $location = null) { if ($user !== null) { $uri = self::USER_URI . '/' . $user . '/' . self::UPLOADS_URI_SUFFIX; } else if ($location instanceof Zend_Gdata_Query) { $uri = $location->getQueryUrl(); } else { $uri = $location; } return parent::getFeed($uri, 'Zend_Gdata_YouTube_VideoFeed'); }
なんじゃこりゃー
$userを与えたら他は無視という仕様。
パラメータを付けるならリクエストURLから全部書けってどういうことさ。
他にもgetVideoEntry()
getUserProfile()
・・・いろいろ関数はあるが、パラメータをつけたいときは全て無駄。
結局はgetVideoFeed()
と同じ動作になる。
ってことでgetUserUploads()
を使わず、Zend_Paginatorも使って目的の動作をさせるためにこう書いた。
$url = sprintf(
'%s/%s/%s',
Zend_Gdata_YouTube::USER_URI,
$username,
Zend_Gdata_YouTube::UPLOADS_URI_SUFFIX
);
$query = new Zend_Gdata_Query($url);
$query->setMaxResults($limit)
->setStartIndex($this->_getParam('p', 1))
->setParam('orderby', 'published');
$yt = new Zend_Gdata_YouTube();
$videoFeed = $yt->getVideoFeed($query);
$adapter = new Zend_Paginator_Adapter_Null($videoFeed->totalResults->getText());
$paginator = new Zend_Paginator($adapter);
$paginator->setCurrentPageNumber($this->_getParam('p', 1))
->setItemCountPerPage($limit)
->setPageRange(5);
Zend_Paginator_Adapterの種類はNull
最初Zend_Paginator_Adapter_Arrayじゃないのかなと思ったけど、Array型は全配列が存在するときに使う。
・・・実際どんな場面に利用できるのかイメージできないけど。
YoutubeAPIが返すトータル件数を取得するときは$videoFeed->totalResults
で参照するのではなく->getText()
をチェインする。
こんな基本動作が、公式サンプルには全く書かれてない・・。
たったこれだけでとても苦労した。
参考
ZEND FRAMEWORK – Zend Paginator with Gdata Youtube
コメント