symfony askeet Day 11

feedを配信する。

  • headにfeedへのリンクを入れる。

headにfeedへのリンクを入れる。

<?php echo auto_discovery_link_tag('rss','feed/popular') ?>

これだけでいいのか。
HTMLでも1行だけど、auto_discovery_link_tagを使った方がすごい楽。

プラグインをインストールする。

symfony plugin-install http://plugins.symfony-project.com/sfFeedPlugin

で、実行されるはずが

Warning: require_once(PEAR/Remote.php): failed to open stream: No such file or directory in /opt/local/lib/php/data/symfony/tasks/sfPakePlugins.php on line 155

Fatal error: require_once(): Failed opening required 'PEAR/Remote.php' (include_path='/Users/shota/education/enomoto/askeet2/lib:/Users/shota/education/enomoto/askeet2/apps//lib::/opt/local/lib/php/symfony/vendor:.:/opt/local/lib/php') in /opt/local/lib/php/data/symfony/tasks/sfPakePlugins.php on line 155

PEAR/Remote.phpが読み込めないというエラーが出た。
でも、sfFeedPluginは必要なのでどうにかダウンロードできないかと
直接http://plugins.symfony-project.com/sfFeedPluginにブラウザ上でアクセスしてみたら
ファイルが落ちてきた。ファイルを解凍すると中にsfFeedPlugin-1.X.Xとかいうフォルダがあるので
名称をsfFeedPluginに変えてaskeet2/plugins/に設置する。
そして、設置したら

symfony cc

キャッシュをクリアします。

アクションを作る

symfony init-module frontend feed

あとはアクションを書くと。
場所: askeet2/apps/frontend/modules/feed/actions/actions.class.php

  public function executePopular()
  {
    // 質問
    $c = new Criteria();
    $c->addDescendingOrderByColumn(QuestionPeer::INTERESTED_USERS);
    $c->setLimit(sfConfig::get('app_feed_max'));
    $questions = QuestionPeer::doSelectJoinUser($c);

    $feed = sfFeed::newInstance('rss201rev2');

    // チャンネル
    $feed->setTitle('askeet!で人気の質問');
    $feed->setLink('@homepage');
    $feed->setDescription('質問するなら答えるなら投票するなら askeet!');

    // 項目
    $feed->setFeedItemsRouteName('@question');
    $feed->setItems($questions);

    $this->feed = $feed;
  }

rss201rev2というのはRSS 2.01というフォーマットをしているらしい。
資料:http://develop.ddo.jp/symfony/book/jp/1.0/syndication.html

表示件数を指定する。

場所: askeet2/apps/frontend/config/app.yml

# default values
all:
  pager:
    homepage_max: 2
  feed:
    max: 10

feed表示は10件までという指定ができた。

layout.phpを読み込まないようにする。

このまま表示するとlayout.phpが読み込まれてしまう。
そうするとRSS feedにならない。
なので、layout.phpを読み込まないようにする。
場所: askeet2/apps/frontend/modules/feed/config/view.yml

all:
  has_layout: off
  template:   feed

テンプレートを書く。

場所: askeet2/apps/frontend/modules/feed/templates/feedSuccess.php

<?php echo $feed->getFeed() ?>

ルーティングに追加

場所: askeet2/apps/frontend/config/routing.yml

feed_popular_questions:
  url:   /feed/popular
  param: { module: feed, action: popular }

RSSをリンクする

場所: askeet2/apps/frontend/modules/sidebar/templates/_default.php

<?php use_helper('Global') ?>
<?php echo link_to('新しい質問をする。','question/add') ?>

<ul>
  <li><?php echo link_to('人気の質問。','question/list') ?><?php echo link_to_feed('人気の質問。','feed/popular') ?></li>
  <li><?php echo link_to('最新の質問。','question/recent') ?></li>
  <li><?php echo link_to('最新の回答。','answer/recent') ?></li>
</ul>

おーできた。