【问题标题】:CakePHP - Using the RSS Helper without RequestHandler ComponentCakePHP - 在没有 RequestHandler 组件的情况下使用 RSS Helper
【发布时间】:2010-10-13 04:04:55
【问题描述】:

我已经设置了 RSS 助手(使用 CakePHP 1.3.4)并且一切正常 - 我可以通过 /news/feed.rss 访问我的提要 - 如 http://book.cakephp.org/view/1461/Creating-an-RSS-feed-with-the-RssHelper 中的示例

但我希望能够在 sudo 中有条件地执行此操作,例如:

if (!empty($var)) {
    switch ($var) {
        case one :
            $xml = $this->method->find('$var conditions...');
            ... use RSS Helper to serve results as XML.
        case two :
            $xml = $this->method->find('other $var conditions...');
            ... use RSS Helper to serve results as XML.
    }
}

我可以在这种情况下使用 RSS Helper 吗?我使用什么调用/语法?

【问题讨论】:

    标签: cakephp cakephp-1.3


    【解决方案1】:

    有两种方法可以做到这一点。

    基本上你可以像这样传递一个变量:

    http://yourserver.com/news/feed.rss?recent=20
    

    然后在控制器中您可以使用

    访问此变量
    $this->params['url']['recent']; //20
    

    或者您可以像这样在路由器文件中添加一行:

    Router::connect('/feed-:recent/*', array('plugin'=>false, 'controller' => 'news', 'action' => 'feed'), array('recent'=>'[0-9]+'));
    

    这样您的网址将如下所示:

    http://yourserver.com/news/feed-20.rss
    

    最后我相信这样的 url 也会起作用:

    http://yourserver.com/news/feed.rss/recent:20
    

    【讨论】:

    • 谢谢 Nik - 所以在这种情况下,您仍会使用 RequestHandler 组件,但会限制来自查询字符串 var 的 SQL 查询。我尝试了类似的东西,但是当我在 .rss 扩展之后添加参数时出现错误,但我使用 /var 语法而不是 ?foo=bar - 基本错误!我把我的解决方案放在下面,但我想我会试试你的,哪个更简单。
    【解决方案2】:

    您可以像任何其他控制器调用一样将参数传递给函数。

    IE

            public function rss( $limit = 20, $topic = null ){
                if( !$topic ){
                    $xml = $this->Article->find( 'all', array( 'limit' => $limit ));
                    ...
                } else {
                    $xml = $this->Article->find( 'all', array( 'limit' => $limit, 'conditions' => array( 'Article.topic' => $topic )));
                }
                ...
            }
        }
    ?>
    

    然后您可以通过以下方式访问 rss 提要:http://domain/articles/rss.rss

    如果需要传参数:http://domain/articles/rss/100.rss(100条结果全部取)

    或者像这样:http://domain/articles/rss/10/obama.rss(获取所有主题为“obama”并返回 10 个项目。

    【讨论】:

      【解决方案3】:

      RequestHandler 允许您使用像 /posts/index.rss 这样的 url,它会自动加载 RSS Helper 并将输出发送到 /views/posts/rss/index.ctp,并使用 /views/layouts/ 的布局rss/default.ctp.

      但如果您想单独使用 RSS Helper,您需要:

      1) 将其包含在控制器中

      var $helpers = array('Rss');
      

      2) 在您的控制器操作中,您需要指定输出的去向,所以

      $this->render('/posts/rss/index','/rss/default');
      

      在这种情况下,我还在第二个参数中指定了要使用的布局。第一个 arg - index.ctp 文件位置是相对于您的 views/ 目录的。第二个参数 - 布局相对于您的 views/layouts/ 目录。

      所以我在我的 posts_controller 中有一个方法,我用它来识别需要哪个提要(通过传递的 var),然后找到帖子并将它们发送到正确的视图和布局:

      function rss(){
          if (!empty($this->params['pass'])){
                  $ops=array(
                      'conditions'=>'where feedname_id=' . $this->params['pass'][0],
                      'order' => 'Post.created DESC',
                      'limit' => 10
                  );
              $this->set('posts', $this->Post->find('all',$ops));
              $this->render('/posts/rss/index','/rss/default');
          } else {
              $this->redirect(array('controller'=>'feednames','action'=>'index'));
          }
      }
      

      可能有更好的编码方式 - 如果有,请告诉我。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-09
        • 1970-01-01
        • 2011-03-15
        • 2014-08-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-27
        相关资源
        最近更新 更多