diff options
-rw-r--r-- | ajax/loadfeed.php | 36 | ||||
-rw-r--r-- | controllers/controller.php | 15 | ||||
-rw-r--r-- | controllers/news.controller.php | 95 | ||||
-rw-r--r-- | js/items.js | 31 | ||||
-rw-r--r-- | lib/item.php | 8 | ||||
-rw-r--r-- | lib/itemmapper.php | 1 | ||||
-rw-r--r-- | templates/main.php | 1 | ||||
-rw-r--r-- | templates/part.items.php | 23 |
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>'; |