开发者

CakePHP - Using the RSS Helper without RequestHandler Component

I have set up the RSS Helper (with CakePHP 1.3.4) and all is working - I can access my feeds by /news/feed.rss - as exampled at http://book.cakephp.org/view/1461/Creating-an-RSS-feed-with-the-RssHelper

But I want to be able to do this conditionally, in sudo, something like:

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.
    }
}

Can I use the RSS Helper in this circumstanc开发者_StackOverflow中文版e? What calls/syntax do I use?


There are 2 ways to do this.

Basically you can pass a variable like this:

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

and then in the controller you can access this variable with

$this->params['url']['recent']; //20

Or you can add a line in your Router file like this:

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

This way your url will look like:

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

and finally I believe that url like this will work as well:

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


You can pass params to the function the same as any other controller call.

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

Then you can access the rss feed with: http://domain/articles/rss.rss

If you need to pass parameters: http://domain/articles/rss/100.rss (fetch all with 100 results)

Or like this: http://domain/articles/rss/10/obama.rss (fetch all with the topic "obama" and return 10 items.


The RequestHandler allows you to use a url like /posts/index.rss and it automatically loads the RSS Helper and sends the output to /views/posts/rss/index.ctp, and uses layout at /views/layouts/rss/default.ctp.

But if you want to use the RSS Helper on it's own you need to:

1) include it the controller

var $helpers = array('Rss');

2) in your controller action you need to specify where the output goes, so

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

In this case I also specified which layout to use in the 2nd argument. The first arg - the index.ctp file location is relative to your views/ directory. The second arg - the layout is relative to your views/layouts/ directory.

So I have a method in my posts_controller that I use to identify which feed is wanted (through a passed var) and subsequently finds the posts and sends them to the correct views and layouts:

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'));
    }
}

There might be better ways to code this - if so please let me know.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜