2013年3月21日木曜日

[cakephp 1.3] RSSを出力する単純な例

  1. 拡張子でリソースの種類を判断できるよう、「{app}/config/routes.php」に Router::parseExtensions()を追加します。
  2. RSS用のデフォルトレイアウトビューファイル「{app}/views/layouts/rss/default.ctp」を追加します。
  3. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?php
    echo $this->Rss->header();
     
    if (!isset($channel)) {
     $channel = array();
    }
    if (!isset($channel['title'])) {
     $channel['title'] = $title_for_layout;
    }
     
    echo $this->Rss->document(
     $this->Rss->channel(
      array(), $channel, $content_for_layout
     )
    );
    ?>

    cake bake project すると、{app}/views/layouts に email,js,json,rss,xmlのフォルダーが 自動的に作成されるので必要はないがzipを展開しただけなら無いので作成が必要。

  4. データをRSS出力するためのビューファイル「{app}/views/posts/rss/index.ctp」を作成します。
  5. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    <?php
    /* サイト情報の設定 */
     
    $this->set('channel', array(
        'title' =>'サイトタイトル', // サイトのタイトル
        'description' => 'サイトの説明', // サイトの説明
        'link' => array('controller' => 'osusume', 'action' => 'ichiran/tochi'),
      )
    );
     
    echo $rss->items($posts, 'rss_transform');
     
    function rss_transform($item) {
      return array('title' => $item['Post']['title'],
        'link' => array('controller' => 'posts', 'action' => 'view', 'ext' => 'rss', $item['Post']['id']),
        'guid' => array('controller' => 'posts', 'action' => 'view', 'ext' => 'rss', $item['Post']['id']),
        'description' => strip_tags($item['Post']['abstract']),
        'pubDate' => $item['Post']['created'],
      );
    }
     
    ?>
  6. コントローラーにコンポーネントRequestHandlerを追加します。
  7. function beforeFilter()を追加します。 rssの時にdebug設定が0でないとContent-Typeがtext/htmlになるようなので、 debug設定を0にしてJSONのときのContent-Typeがapplication/jsonになるようにします。 (4.と5.はapp_controller.phpに設定してしまってもよいかもしれません)
  8. function index()にRSS出力するデータをセットします。
  9. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php // {app}/controllers/posts_controller.php
    class PostsController extends AppController {
      var $name = 'Posts';
      var $helpers = array('Html', 'Form');
      var $components = array('RequestHandler');
       
      function beforeFilter() {
        if ($this->RequestHandler->ext == 'rss') {
          Configure::write('debug', 0);
        }
      }
     
      function index() {
        if ($this->RequestHandler->ext == 'rss') {
          $posts = $this->Post->find('all', array('limit' => 20,'order' => 'Post.created'));
          $this->set(compact('posts'));
        }
      }
    }
    ?>
CakePHP(1.3)でJSON出力する単純な例を参考にしました。

[cakephp 1.3] JSON出力する単純な例

  1. 拡張子でリソースの種類を判断できるよう、「{app}/config/routes.php」に Router::parseExtensions()を追加します。
  2. JSON用のデフォルトレイアウトビューファイル「{app}/views/layouts/json/default.ctp」を追加します。
  3. 1
    <?php echo $content_for_layout; ?>

    cake bake project すると、{app}/views/layouts に email,js,json,rss,xmlのフォルダーが 自動的に作成されるので必要はないがzipを展開しただけなら無いので作成が必要。

  4. データをJSON出力するためのビューファイル「{app}/views/posts/json/index.ctp」を作成します。
  5. 1
    <?php echo json_encode($users) ?>
  6. コントローラーにコンポーネントRequestHandlerを追加します。
  7. debug設定が0でないとContent-Typeがtext/htmlになるようなので、 debug設定を0にしてJSONのときのContent-Typeがapplication/jsonになるようにします。 (4.と5.はapp_controller.phpに設定してしまってもよいかもしれません)
  8. JSON出力するデータをセットします。
  9. 1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <?php // {app}/controllers/posts_controller.php
    class UsersController extends AppController {
      var $name = 'Posts';
      var $helpers = array('Html', 'Form');
      var $components = array('RequestHandler');
       
      function beforeFilter() {
        if ($this->RequestHandler->ext == 'json') {
          Configure::write('debug', 0);
        }
      }
     
      function index() {
        if ($this->RequestHandler->ext == 'json') {
          $posts = $this->Post->find('all', array('limit' => 20,'order' => 'Post.created'));
          $this->set(compact('posts'));
        }
      }
    }
    ?>
CakePHP(1.3)でJSON出力する単純な例を参考にしました。

2013年3月18日月曜日

[cakephp 1.3] index.htmlで表示できるようにする。もしくは routes.phpにRouter::parseExtensions()を追加すると。

まず、config/routes.phpにRouter::parseExtensions();を追加します。
こうすると普通のページを表示したとき、$this->params['url']['ext']に'html'が必ず付加されるようになります。
どういうことになっているかというと、
http://example.com/top/view が http://example.com/top/view.html と同じ扱いになる。
普通 http://example.com/top/view.html とすると、function view.html(){}が無いのでエラーになるが、
Router::parseExtensions();を追加するとエラーにはならず、
http://example.com/top/view.html とすると function view(){} を実行する。