Use the library PicoFeed to generate RSS/Atom feeds

This commit is contained in:
Frederic Guillot
2016-07-26 22:23:58 -04:00
parent 3c228b4e2a
commit 9649f7ba82
6 changed files with 149 additions and 64 deletions

View File

@@ -2,7 +2,11 @@
namespace Kanboard\Controller;
use DateTime;
use Kanboard\Core\Controller\AccessForbiddenException;
use PicoFeed\Syndication\AtomFeedBuilder;
use PicoFeed\Syndication\AtomItemBuilder;
use PicoFeed\Syndication\FeedBuilder;
/**
* Atom/RSS Feed controller
@@ -27,10 +31,15 @@ class FeedController extends BaseController
throw AccessForbiddenException::getInstance()->withoutLayout();
}
$this->response->xml($this->template->render('feed/user', array(
'events' => $this->helper->projectActivity->getProjectsEvents($this->projectPermissionModel->getActiveProjectIds($user['id'])),
'user' => $user,
)));
$events = $this->helper->projectActivity->getProjectsEvents($this->projectPermissionModel->getActiveProjectIds($user['id']));
$feedBuilder = AtomFeedBuilder::create()
->withTitle(e('Project activities for %s', $this->helper->user->getFullname($user)))
->withFeedUrl($this->helper->url->to('FeedController', 'user', array('token' => $user['token']), '', true))
->withSiteUrl($this->helper->url->base())
->withDate(new DateTime());
$this->response->xml($this->buildFeedItems($events, $feedBuilder)->build());
}
/**
@@ -47,9 +56,44 @@ class FeedController extends BaseController
throw AccessForbiddenException::getInstance()->withoutLayout();
}
$this->response->xml($this->template->render('feed/project', array(
'events' => $this->helper->projectActivity->getProjectEvents($project['id']),
'project' => $project,
)));
$events = $this->helper->projectActivity->getProjectEvents($project['id']);
$feedBuilder = AtomFeedBuilder::create()
->withTitle(e('%s\'s activity', $project['name']))
->withFeedUrl($this->helper->url->to('FeedController', 'project', array('token' => $project['token']), '', true))
->withSiteUrl($this->helper->url->base())
->withDate(new DateTime());
$this->response->xml($this->buildFeedItems($events, $feedBuilder)->build());
}
/**
* Build feed items
*
* @access protected
* @param array $events
* @param FeedBuilder $feedBuilder
* @return FeedBuilder
*/
protected function buildFeedItems(array $events, FeedBuilder $feedBuilder)
{
foreach ($events as $event) {
$itemDate = new DateTime();
$itemDate->setTimestamp($event['date_creation']);
$itemUrl = $this->helper->url->to('TaskViewController', 'show', array('task_id' => $event['task_id']), '', true);
$feedBuilder
->withItem(AtomItemBuilder::create($feedBuilder)
->withTitle($event['event_title'])
->withUrl($itemUrl.'#event-'.$event['id'])
->withAuthor($event['author'])
->withPublishedDate($itemDate)
->withUpdatedDate($itemDate)
->withContent($event['event_content'])
);
}
return $feedBuilder;
}
}

View File

@@ -1,27 +0,0 @@
<?= '<?xml version="1.0" encoding="utf-8"?>' ?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
<title><?= t('%s\'s activity', $project['name']) ?></title>
<link rel="alternate" type="text/html" href="<?= $this->url->base() ?>"/>
<link rel="self" type="application/atom+xml" href="<?= $this->url->href('FeedController', 'project', array('token' => $project['token']), false, '', true) ?>"/>
<updated><?= date(DATE_ATOM) ?></updated>
<id><?= $this->url->href('FeedController', 'project', array('token' => $project['token']), false, '', true) ?></id>
<icon><?= $this->url->base() ?>assets/img/favicon.png</icon>
<?php foreach ($events as $e): ?>
<entry>
<title type="text"><?= $e['event_title'] ?></title>
<link rel="alternate" href="<?= $this->url->href('TaskViewController', 'show', array('task_id' => $e['task_id']), false, '', true) ?>"/>
<id><?= $e['id'].'-'.$e['event_name'].'-'.$e['task_id'].'-'.$e['date_creation'] ?></id>
<published><?= date(DATE_ATOM, $e['date_creation']) ?></published>
<updated><?= date(DATE_ATOM, $e['date_creation']) ?></updated>
<author>
<name><?= $this->text->e($e['author']) ?></name>
</author>
<content type="html">
<![CDATA[
<?= $e['event_content'] ?>
]]>
</content>
</entry>
<?php endforeach ?>
</feed>

View File

@@ -1,27 +0,0 @@
<?= '<?xml version="1.0" encoding="utf-8"?>' ?>
<feed xml:lang="en-US" xmlns="http://www.w3.org/2005/Atom">
<title><?= t('Project activities for %s', $user['name'] ?: $user['username']) ?></title>
<link rel="alternate" type="text/html" href="<?= $this->url->base() ?>"/>
<link rel="self" type="application/atom+xml" href="<?= $this->url->href('FeedController', 'user', array('token' => $user['token']), false, '', true) ?>"/>
<updated><?= date(DATE_ATOM) ?></updated>
<id><?= $this->url->href('FeedController', 'user', array('token' => $user['token']), false, '', true) ?></id>
<icon><?= $this->url->base() ?>assets/img/favicon.png</icon>
<?php foreach ($events as $e): ?>
<entry>
<title type="text"><?= $e['event_title'] ?></title>
<link rel="alternate" href="<?= $this->url->href('TaskViewController', 'show', array('task_id' => $e['task_id']), false, '', true) ?>"/>
<id><?= $e['id'].'-'.$e['event_name'].'-'.$e['task_id'].'-'.$e['date_creation'] ?></id>
<published><?= date(DATE_ATOM, $e['date_creation']) ?></published>
<updated><?= date(DATE_ATOM, $e['date_creation']) ?></updated>
<author>
<name><?= $this->text->e($e['author']) ?></name>
</author>
<content type="html">
<![CDATA[
<?= $e['event_content'] ?>
]]>
</content>
</entry>
<?php endforeach ?>
</feed>