CakePHP - 使用没有RequestHandler组件的RSS助手

时间:2010-09-30 15:58:00

标签: cakephp cakephp-1.3

我已经设置了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帮助程序吗?我使用什么调用/语法?

3 个答案:

答案 0 :(得分: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

最后我相信像这样的网址也会起作用:

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

答案 1 :(得分:1)

您可以将params传递给与任何其他控制器调用相同的函数。

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 )));
            }
            ...
        }
    }
?>

然后您可以使用:http://domain/articles/rss.rss

访问RSS订阅源

如果您需要传递参数:http://domain/articles/rss/100.rss(获取所有100个结果)

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

答案 2 :(得分:0)

RequestHandler允许您使用类似/posts/index.rss的URL,它会自动加载RSS Helper并将输出发送到/views/posts/rss/index.ctp,并使用/ views / layouts /中的布局RSS / default.thtml中。

但是如果你想自己使用RSS Helper,你需要:

1)包含控制器

var $helpers = array('Rss');

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

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

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

所以我在posts_controller中有一个方法,用于识别需要哪个Feed(通过传递的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'));
    }
}

可能有更好的方法来编码 - 如果是这样,请告诉我。