summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--ajax/loadfeed.php36
-rw-r--r--controllers/controller.php15
-rw-r--r--controllers/news.controller.php95
-rw-r--r--js/items.js31
-rw-r--r--lib/item.php8
-rw-r--r--lib/itemmapper.php1
-rw-r--r--templates/main.php1
-rw-r--r--templates/part.items.php23
8 files changed, 147 insertions, 63 deletions
diff --git a/ajax/loadfeed.php b/ajax/loadfeed.php
index e90a6fd9f..4eaf0082d 100644
--- a/ajax/loadfeed.php
+++ b/ajax/loadfeed.php
@@ -16,44 +16,38 @@ OCP\JSON::checkAppEnabled('news');
OCP\JSON::callCheck();
session_write_close();
+require_once('news/controllers/controller.php');
+require_once('news/controllers/news.controller.php');
+
$userid = OCP\USER::getUser();
-$feedId = $_POST['id'];
-$feedType = $_POST['type'];
+$feedId = (int)$_POST['id'];
+$feedType = (int)$_POST['type'];
OCP\Config::setUserValue(OCP\USER::getUser(), 'news', 'lastViewedFeed', $feedId);
OCP\Config::setUserValue(OCP\USER::getUser(), 'news', 'lastViewedFeedType', $feedType);
+$showAll = OCP\Config::getUserValue(OCP\USER::getUser(), 'news', 'showAll');
+
+$newsController = new OCA\News\NewsController();
+$items = $newsController->getItems($feedType, $feedId, $showAll);
+$unreadItemCount = $newsController->getItemUnreadCount($feedType, $feedId);
+
$l = OC_L10N::get('news');
+
$itemsTpl = new OCP\Template("news", "part.items");
$itemsTpl->assign('lastViewedFeedId', $feedId);
+$itemsTpl->assign('lastViewedFeedType', $feedType);
+$itemsTpl->assign('items', $items, false);
$feedItems = $itemsTpl->fetchPage();
$itemMapper = new OCA\News\ItemMapper();
-switch ($feedId) {
- case -1:
- $feedTitle = $l->t('Starred');
- $unreadItemCount = $itemMapper->countAllStatus($feedId, OCA\News\StatusFlag::IMPORTANT);
- break;
-
- case -2:
- $feedTitle = $l->t('New articles');
- $unreadItemCount = $itemMapper->countEveryItemByStatus(OCA\News\StatusFlag::UNREAD);
- break;
-
- default:
- $feedMapper = new OCA\News\FeedMapper();
- $feed = $feedMapper->findById($feedId);
- $feedTitle = $feed->getTitle();
- $unreadItemCount = $itemMapper->countAllStatus($feedId, OCA\News\StatusFlag::UNREAD);
- break;
-}
+
OCP\JSON::success(array('data' => array( 'message' => $l->t('Feed loaded!'),
- 'feedTitle' => $feedTitle,
'feedItems' => $feedItems,
'unreadItemCount' => $unreadItemCount )));
diff --git a/controllers/controller.php b/controllers/controller.php
index 06234e8f4..82f60df76 100644
--- a/controllers/controller.php
+++ b/controllers/controller.php
@@ -16,11 +16,12 @@ class Controller {
protected $userId;
protected $trans;
-
+
public function __construct(){
$this->userId = \OCP\USER::getUser();
$this->trans = \OC_L10N::get('news');
+ $this->safeParams = array();
}
@@ -68,10 +69,12 @@ class Controller {
* The following values are always assigned: userId, trans
* @param $arguments an array with arguments in $templateVar => $content
* @param $template the name of the template
+ * @param $safeParams template parameters which should not be escaped
* @param $fullPage if true, it will render a full page, otherwise only a part
* defaults to true
*/
- protected function render($template, $arguments=array(), $fullPage=true){
+ protected function render($template, $arguments=array(), $safeParams=array(),
+ $fullPage=true){
if($fullPage){
$template = new \OCP\Template('news', $template, 'user');
@@ -80,7 +83,12 @@ class Controller {
}
foreach($arguments as $key => $value){
- $template->assign($key, $value);
+ if(array_key_exists($key, $safeParams)) {
+ $template->assign($key, $value, false);
+ } else {
+ $template->assign($key, $value, false);
+ }
+
}
$template->assign('userId', $this->userId);
@@ -88,6 +96,7 @@ class Controller {
$template->printPage();
}
+
}
?> \ No newline at end of file
diff --git a/controllers/news.controller.php b/controllers/news.controller.php
index 9695e85d1..ba3005b01 100644
--- a/controllers/news.controller.php
+++ b/controllers/news.controller.php
@@ -61,8 +61,8 @@ class NewsController extends Controller {
$itemMapper = new ItemMapper($this->userId);
// always show the last viewed feed on reload
- $lastViewedFeedId = $this->getUserValue('lastViewedFeed');
- $lastViewedFeedType = $this->getUserValue('lastViewedFeedType');
+ $lastViewedFeedId = (int)$this->getUserValue('lastViewedFeed');
+ $lastViewedFeedType = (int)$this->getUserValue('lastViewedFeedType');
$showAll = $this->getUserValue('showAll');
if( $lastViewedFeedId === null || $lastViewedFeedType === null) {
@@ -84,6 +84,7 @@ class NewsController extends Controller {
$feeds = $folderMapper->childrenOfWithFeeds(0);
$folderForest = $folderMapper->childrenOf(0); //retrieve all the folders
$starredCount = $itemMapper->countEveryItemByStatus(StatusFlag::IMPORTANT);
+ $items = $this->getItems($lastViewedFeedType, $lastViewedFeedId, $showAll);
$params = array(
'allfeeds' => $feeds,
@@ -92,12 +93,100 @@ class NewsController extends Controller {
'lastViewedFeedId' => $lastViewedFeedId,
'lastViewedFeedType' => $lastViewedFeedType,
'starredCount' => $starredCount,
+ 'items' => $items
);
- $this->render('main', $params);
+ $this->render('main', $params, array('items' => true));
}
+ /**
+ * Returns all items
+ * @param $feedType the type of the feed
+ * @param $feedId the id of the feed or folder
+ * @param $showAll if true, it will also include unread items
+ * @return an array with all items
+ */
+ public function getItems($feedType, $feedId, $showAll){
+ $items = array();
+ $itemMapper = new ItemMapper($this->userId);
+
+ // starred or subscriptions
+ if ($feedType == FeedType::STARRED || $feedId == FeedType::SUBSCRIPTIONS) {
+
+ if($feedType === FeedType::STARRED){
+ $statusFlag = StatusFlag::IMPORTANT;
+ }
+
+ if($feedType === FeedType::SUBSCRIPTIONS){
+ $statusFlag = StatusFlag::UNREAD;
+ }
+
+ $items = $itemMapper->findEveryItemByStatus($status);
+
+ // feed
+ } elseif ($feedType === FeedType::FEED){
+
+ if($showAll) {
+ $items = $itemMapper->findByFeedId($feedId);
+ } else {
+ $items = $itemMapper->findAllStatus($feedId, StatusFlag::UNREAD);
+ }
+
+ // folder
+ } elseif ($feedType === FeedType::FOLDER){
+ $feedMapper = new FeedMapper($this->userId);
+ $feeds = $feedMapper->findByFolderId($feedId);
+
+ foreach($feeds as $feed){
+ if($showAll) {
+ $items = array_merge($items, $itemMapper->findByFeedId($feed->getId()));
+ } else {
+ $items = array_merge($items,
+ $itemMapper->findAllStatus($feed->getId(), StatusFlag::UNREAD));
+ }
+ }
+ }
+
+ return $items;
+ }
+
+
+ /**
+ * Returns the unread count
+ * @param $feedType the type of the feed
+ * @param $feedId the id of the feed or folder
+ * @return the unread count
+ */
+ public function getItemUnreadCount($feedType, $feedId){
+ $unreadCount = 0;
+ $itemMapper = new ItemMapper($this->userId);
+
+ switch ($feedType) {
+ case FeedType::STARRED:
+ $unreadCount = $itemMapper->countAllStatus($feedId, StatusFlag::IMPORTANT);
+ break;
+
+ case FeedType::SUBSCRIPTIONS:
+ $unreadCount = $itemMapper->countEveryItemByStatus(StatusFlag::UNREAD);
+ break;
+
+ case FeedType::FOLDER:
+ $feedMapper = new FeedMapper($this->userId);
+ $feeds = $feedMapper->findByFolderId($feedId);
+ foreach($feeds as $feed){
+ $unreadCount += $itemMapper->countAllStatus($feed->getId(), StatusFlag::UNREAD);
+ }
+ break;
+
+ case FeedType::FEED:
+ $unreadCount = $itemMapper->countAllStatus($feedId, StatusFlag::UNREAD);
+ break;
+ }
+
+ return $unreadCount;
+ }
+
public function javascriptTests(){
$this->add3rdPartyScript('jasmine-1.2.0/jasmine.js');
$this->add3rdPartyStyle('jasmine-1.2.0/jasmine.css');
diff --git a/js/items.js b/js/items.js
index 8541b0031..278cd8890 100644
--- a/js/items.js
+++ b/js/items.js
@@ -70,7 +70,7 @@ var News = News || {};
* @param item the dom item
*/
Items.prototype._markItemAsReadTimeout = function(item) {
- var itemId = parseInt($(item).data('id'));
+ var itemId = parseInt($(item).data('id'), 10);
var itemOffset = $(item).position().top;
var cachedItem = this._itemCache.getItem(itemId);
if(itemOffset < 0){
@@ -133,7 +133,7 @@ var News = News || {};
var notJumped = true;
$('.feed_item').each(function(){
if(notJumped && $(this).position().top > 1){
- var id = parseInt($(this).data('id'));
+ var id = parseInt($(this).data('id'), 10);
self._jumpToElemenId(id);
notJumped = false;
}
@@ -150,7 +150,7 @@ var News = News || {};
if(notJumped && $(this).position().top >= 0){
var previous = $(this).prev();
if(previous.length > 0){
- var id = parseInt(previous.data('id'));
+ var id = parseInt(previous.data('id'), 10);
self._jumpToElemenId(id);
}
notJumped = false;
@@ -161,7 +161,7 @@ var News = News || {};
if(notJumped){
var $items = $('.feed_item');
if($items.length > 0){
- var id = parseInt($items.last().data('id'));
+ var id = parseInt($items.last().data('id'), 10);
self._jumpToElemenId(id);
}
}
@@ -220,7 +220,7 @@ var News = News || {};
* @return the jquery node
*/
Items.prototype._findNodeById = function(id) {
- id = parseInt(id);
+ id = parseInt(id, 10);
return this._$articleList.find('.feed_item[data-id="' + id + '"]');
};
@@ -258,7 +258,7 @@ var News = News || {};
* Returns an item from the cache
*/
ItemCache.prototype.getItem = function(itemId) {
- itemId = parseInt(itemId);
+ itemId = parseInt(itemId, 10);
return this._items[itemId];
};
@@ -309,7 +309,7 @@ var News = News || {};
switch(type){
- case MenuNodeType.Feed:
+ case News.MenuNodeType.Feed:
if(this._feeds[id] === undefined){
return pairs;
}
@@ -318,21 +318,24 @@ var News = News || {};
});
break;
- case MenuNodeType.Folder:
+ case News.MenuNodeType.Folder:
// this is a bit of a hack and not that beautiful^^
var feedIds = News.Objects.Menu.getFeedIdsOfFolder(id);
for(var i=0; i<feedIds.length; i++){
- pairs.concat(this._getItemIdTimestampPairs(MenuNodeType.Feed, feedIds[i]));
+ var feedPairs = this._getItemIdTimestampPairs(News.MenuNodeType.Feed, feedIds[i]);
+ for(var j=0; j<feedPairs.length; j++){
+ pairs.push(feedPairs[j]);
+ }
}
break;
- case MenuNodeType.Subscriptions:
+ case News.MenuNodeType.Subscriptions:
$.each(this._items, function(key, value){
pairs.push({key: value.getId(), value: value.getTimeStamp()});
});
break;
- case MenuNodeType.Starred:
+ case News.MenuNodeType.Starred:
$.each(this._items, function(key, value){
if(value.isImportant()){
pairs.push({key: value.getId(), value: value.getTimeStamp()});
@@ -412,14 +415,14 @@ var News = News || {};
var Item = function(html){
this._starred = false;
this._$html = $(html);
- this._id = parseInt(this._$html.data('id'));
- this._feedId = parseInt(this._$html.data('feedid'));
+ this._id = parseInt(this._$html.data('id'), 10);
+ this._feedId = parseInt(this._$html.data('feedid'), 10);
this._read = this._$html.hasClass('read');
this._locked = false;
this._important = this._$html.find('li.star').hasClass('important');
// get timestamp for sorting
var $stamp = this._$html.find('.timestamp');
- this._timestamp = parseInt($stamp.html());
+ this._timestamp = parseInt($stamp.html(), 10);
$stamp.remove();
// open all links in new tabs
this._$html.find('.body a').attr('target', '_blank');
diff --git a/lib/item.php b/lib/item.php
index 114751cfe..577b6d8e8 100644
--- a/lib/item.php
+++ b/lib/item.php
@@ -48,6 +48,14 @@ class Item {
}
}
+ public function getFeedId() {
+ return $this->feedId;
+ }
+
+ public function setFeedId($feedId) {
+ $this->feedId = $feedId;
+ }
+
public function getGuid() {
return $this->guid;
}
diff --git a/lib/itemmapper.php b/lib/itemmapper.php
index 41e4e3a29..2f4e295b2 100644
--- a/lib/itemmapper.php
+++ b/lib/itemmapper.php
@@ -44,6 +44,7 @@ class ItemMapper {
$item = new Item($url, $title, $guid, $body, $id);
$item->setStatus($row['status']);
$item->setAuthor($row['author']);
+ $item->setFeedId($row['feed_id']);
$item->setDate(Utils::dbtimestampToUnixtime($row['pub_date']));
return $item;
diff --git a/templates/main.php b/templates/main.php
index d0b0ec581..e2a27c324 100644
--- a/templates/main.php
+++ b/templates/main.php
@@ -20,7 +20,6 @@ if($_['showAll']) {
}
echo $this->inc("part.dialogues");
-
?>
<div id="leftcontent_news" class="leftcontent_news">
diff --git a/templates/part.items.php b/templates/part.items.php
index 296080eb8..e318a8466 100644
--- a/templates/part.items.php
+++ b/templates/part.items.php
@@ -1,25 +1,6 @@
<?php
-$feedId = isset($_['lastViewedFeedId']) ? $_['lastViewedFeedId'] : '';
-
-$itemMapper = new OCA\News\ItemMapper();
-
-$showAll = OCP\Config::getUserValue(OCP\USER::getUser(), 'news', 'showAll');
-
-$specialfeed = false;
-
-if ($feedId == -1 || $feedId == -2) { //TODO: change this values, too obscure
- $specialfeed = true;
- $status = ($feedId == -1) ? OCA\News\StatusFlag::IMPORTANT : OCA\News\StatusFlag::UNREAD;
- $items = $itemMapper->findEveryItemByStatus($status);
-}
-else {
- if($showAll) {
- $items = $itemMapper->findByFeedId($feedId);
- } else {
- $items = $itemMapper->findAllStatus($feedId, OCA\News\StatusFlag::UNREAD);
- }
-}
+$items = isset($_['items']) ? $_['items'] : '';
echo '<ul>';
foreach($items as $item) {
@@ -38,7 +19,7 @@ foreach($items as $item) {
$startTitle = $l->t('Mark as important');
}
- echo '<li class="feed_item ' . $newsItemClass .'" data-id="' . $item->getId() . '" data-feedid="' . $feedId . '">';
+ echo '<li class="feed_item ' . $newsItemClass .'" data-id="' . $item->getId() . '" data-feedid="' . $item->getFeedId() . '">';
echo '<span class="timestamp">' . $item->getDate() . '</span>';
echo '<h2 class="item_date"><time class="timeago" datetime="' .
date('c', $item->getDate()) . '">' . date('F j, Y, g:i a', $item->getDate()) . '</time>' . '</h2>';