/**
  * @see	\wcf\system\user\object\watch\IUserObjectWatch::validateObjectID()
  */
 public function validateObjectID($objectID)
 {
     $category = CategoryHandler::getInstance()->getCategory($objectID);
     if ($category === null) {
         throw new IllegalLinkException();
     }
     $category = new NewsCategory($category);
     if (!$category->isAccessible()) {
         throw new PermissionDeniedException();
     }
 }
 /**
  * Returns a list with category ids of accessible news categories.
  * 
  * @param	array		$permissions
  * @return	array<integer>
  */
 public static function getAccessibleCategoryIDs(array $permissions = array('canViewCategory'))
 {
     $categoryIDs = array();
     foreach (CategoryHandler::getInstance()->getCategories('de.voolia.news.category') as $category) {
         $result = true;
         $category = new NewsCategory($category);
         foreach ($permissions as $permission) {
             $result = $result && $category->getPermission($permission);
         }
         if ($result) {
             $categoryIDs[] = $category->categoryID;
         }
     }
     return $categoryIDs;
 }
 /**
  * Creates the AccessibleNewsList object.
  */
 public function __construct()
 {
     parent::__construct();
     // accessible news categories
     $accessibleCategoryIDs = NewsCategory::getAccessibleCategoryIDs();
     if (!empty($accessibleCategoryIDs)) {
         $this->getConditionBuilder()->add('news.newsID IN (SELECT newsID FROM news' . WCF_N . '_news_to_category WHERE categoryID IN (?))', array($accessibleCategoryIDs));
     } else {
         $this->getConditionBuilder()->add('1=0');
     }
     // default conditions
     if (!WCF::getSession()->getPermission('mod.news.canReadDeactivatedNews')) {
         $this->getConditionBuilder()->add('news.isActive = 1');
     }
     if (!WCF::getSession()->getPermission('mod.news.canReadDeletedNews')) {
         $this->getConditionBuilder()->add('news.isDeleted = 0');
     }
     if (!WCF::getSession()->getPermission('mod.news.canReadFutureNews')) {
         if (WCF::getUser()->userID) {
             $this->getConditionBuilder()->add('(news.isPublished = 1 OR news.userID = ?)', array(WCF::getUser()->userID));
         } else {
             $this->getConditionBuilder()->add('news.isPublished = 1');
         }
     }
     // apply language filter
     if (LanguageFactory::getInstance()->multilingualismEnabled() && count(WCF::getUser()->getLanguageIDs())) {
         $this->getConditionBuilder()->add('(news.languageID IN (?) OR news.languageID IS NULL)', array(WCF::getUser()->getLanguageIDs()));
     }
 }
 /**
  * Loads the news entries.
  */
 protected function loadNews()
 {
     $this->news = array();
     if (empty($this->newsIDs)) {
         return;
     }
     $this->newsIDs = array_unique($this->newsIDs);
     $categoryIDs = NewsCategory::getAccessibleCategoryIDs();
     if (empty($categoryIDs)) {
         return;
     }
     $newsList = new NewsList();
     $newsList->getConditionBuilder()->add('news.newsID IN (?)', array($this->newsIDs));
     $newsList->getConditionBuilder()->add('news.newsID IN (SELECT newsID FROM news' . WCF_N . '_news_to_category WHERE categoryID IN (?))', array($categoryIDs));
     // default conditions
     if (!WCF::getSession()->getPermission('mod.news.canReadDeactivatedNews')) {
         $newsList->getConditionBuilder()->add('news.isActive = 1');
     }
     if (!WCF::getSession()->getPermission('mod.news.canReadDeletedNews')) {
         $newsList->getConditionBuilder()->add('news.isDeleted = 0');
     }
     if (!WCF::getSession()->getPermission('mod.news.canReadFutureNews')) {
         if (WCF::getUser()->userID) {
             $newsList->getConditionBuilder()->add('(news.isPublished = 1 OR news.userID = ?)', array(WCF::getUser()->userID));
         } else {
             $newsList->getConditionBuilder()->add('news.isPublished = 1');
         }
     }
     $newsList->readObjects();
     $this->news = $newsList->getObjects();
 }
 /**
  * Sets the breadcrumbs.
  * 
  * @param	\news\data\category\NewsCategory	$category
  * @param	\news\data\news\News			$news
  */
 public function setBreadcrumbs(array $parentCategories = array(), NewsCategory $category = null, News $news = null)
 {
     if (PageMenu::getInstance()->getLandingPage()->menuItem != 'news.header.menu.news') {
         WCF::getBreadcrumbs()->add(new Breadcrumb(WCF::getLanguage()->get('news.header.menu.news'), LinkHandler::getInstance()->getLink('NewsOverview', array('application' => 'news'))));
     }
     foreach ($parentCategories as $parentCategory) {
         WCF::getBreadcrumbs()->add($parentCategory->getBreadcrumb());
     }
     if ($category !== null) {
         WCF::getBreadcrumbs()->add($category->getBreadcrumb());
     }
     if ($news !== null) {
         if ($news->isArchived) {
             WCF::getBreadcrumbs()->add(new Breadcrumb(WCF::getLanguage()->get('news.header.menu.news.archive'), LinkHandler::getInstance()->getLink('NewsArchive', array('application' => 'news'))));
         }
         WCF::getBreadcrumbs()->add($news->getBreadcrumb());
     }
 }
 /**
  * Creates a new DeletedEntryList object.
  */
 public function __construct()
 {
     parent::__construct();
     // accessible news categories
     $accessibleCategoryIDs = NewsCategory::getAccessibleCategoryIDs();
     if (!empty($accessibleCategoryIDs)) {
         $this->getConditionBuilder()->add('news.newsID IN (SELECT newsID FROM news' . WCF_N . '_news_to_category WHERE categoryID IN (?))', array($accessibleCategoryIDs));
     } else {
         $this->getConditionBuilder()->add('1=0');
     }
     // load only deleted news
     $this->getConditionBuilder()->add('news.isDeleted = ?', array(1));
 }
 /**
  * Creates a new TaggedNewsList object.
  * 
  * @param	\wcf\data\tag\Tag	$tag
  */
 public function __construct(Tag $tag)
 {
     ViewableNewsList::__construct();
     $this->getConditionBuilder()->add('tag_to_object.objectTypeID = ? AND tag_to_object.languageID = ? AND tag_to_object.tagID = ?', array(TagEngine::getInstance()->getObjectTypeID('de.voolia.news.entry'), $tag->languageID, $tag->tagID));
     $this->getConditionBuilder()->add('news.newsID = tag_to_object.objectID');
     // accessible news categories
     $accessibleCategoryIDs = NewsCategory::getAccessibleCategoryIDs();
     if (!empty($accessibleCategoryIDs)) {
         $this->getConditionBuilder()->add('news.newsID IN (SELECT newsID FROM news' . WCF_N . '_news_to_category WHERE categoryID IN (?))', array(NewsCategory::getAccessibleCategoryIDs()));
     } else {
         $this->getConditionBuilder()->add('1=0');
     }
 }
 /**
  * @see	\wcf\page\IPage::readParameters()
  */
 public function readParameters()
 {
     parent::readParameters();
     if (empty($this->objectIDs)) {
         $this->objectIDs = NewsCategory::getAccessibleCategoryIDs();
     } else {
         foreach ($this->objectIDs as $objectID) {
             // get category
             $category = NewsCategory::getCategory($objectID);
             // check permissions and category
             if (!$category->isAccessible()) {
                 throw new PermissionDeniedException();
             }
             if ($category === null) {
                 throw new IllegalLinkException();
             }
         }
     }
 }
 /**
  * @see	\wcf\system\search\ISearchableObjectType::getConditions()
  */
 public function getConditions(IForm $form = null)
 {
     $conditionBuilder = new PreparedStatementConditionBuilder();
     // accessible news category ids
     $categoryIDs = NewsCategory::getAccessibleCategoryIDs();
     if (empty($categoryIDs)) {
         throw new PermissionDeniedException();
     }
     $conditionBuilder->add($this->getTableName() . '.newsID IN (SELECT newsID FROM news' . WCF_N . '_news_to_category WHERE categoryID IN (?))', array($categoryIDs));
     // set default conditions for news
     $conditionBuilder->add($this->getTableName() . '.isActive = 1');
     $conditionBuilder->add($this->getTableName() . '.isDeleted = 0');
     if (WCF::getUser()->userID) {
         if (!WCF::getSession()->getPermission('mod.news.canReadFutureNews')) {
             $conditionBuilder->add($this->getTableName() . '.isPublished = 1 OR ' . $this->getTableName() . '.userID = ?', array(WCF::getUser()->userID));
         }
     } else {
         $conditionBuilder->add($this->getTableName() . '.isPublished = 1');
     }
     return $conditionBuilder;
 }
 /**
  * @see	wcf\system\menu\page\PageMenuItemProvider::getNotifications()
  */
 public function getNotifications()
 {
     if ($this->notifications === null) {
         $this->notifications = 0;
         if (WCF::getUser()->userID) {
             // load the user storage data
             UserStorageHandler::getInstance()->loadStorage(array(WCF::getUser()->userID));
             // get the news ids
             $data = UserStorageHandler::getInstance()->getStorage(array(WCF::getUser()->userID), 'newsUnreadEntries');
             // cache does not exist or is outdated
             if ($data[WCF::getUser()->userID] === null) {
                 $categoryIDs = NewsCategory::getAccessibleCategoryIDs();
                 if (!empty($categoryIDs)) {
                     $conditionBuilder = new PreparedStatementConditionBuilder();
                     $conditionBuilder->add("news.newsID IN (SELECT newsID FROM news" . WCF_N . "_news_to_category WHERE categoryID IN (?))", array($categoryIDs));
                     $conditionBuilder->add("news.time > ?", array(VisitTracker::getInstance()->getVisitTime('de.voolia.news.entry')));
                     $conditionBuilder->add("news.isActive = 1 AND news.isDeleted = 0 AND news.isPublished = 1");
                     $conditionBuilder->add("tracked_visit.visitTime IS NULL");
                     // apply language filter
                     if (LanguageFactory::getInstance()->multilingualismEnabled() && count(WCF::getUser()->getLanguageIDs())) {
                         $conditionBuilder->add('(news.languageID IN (?) OR news.languageID IS NULL)', array(WCF::getUser()->getLanguageIDs()));
                     }
                     // count news
                     $sql = "SELECT \t\tCOUNT(*) AS count\n\t\t\t\t\t\t\tFROM \t\tnews" . WCF_N . "_news news\n\t\t\t\t\t\t\tLEFT JOIN \twcf" . WCF_N . "_tracked_visit tracked_visit\n\t\t\t\t\t\t\tON \t\t(tracked_visit.objectTypeID = " . VisitTracker::getInstance()->getObjectTypeID('de.voolia.news.entry') . " AND tracked_visit.objectID = news.newsID AND tracked_visit.userID = " . WCF::getUser()->userID . ")\n\t\t\t\t\t\t\t" . $conditionBuilder;
                     $statement = WCF::getDB()->prepareStatement($sql);
                     $statement->execute($conditionBuilder->getParameters());
                     $row = $statement->fetchArray();
                     $this->notifications = $row['count'];
                 }
                 // update the user storage data
                 UserStorageHandler::getInstance()->update(WCF::getUser()->userID, 'newsUnreadEntries', $this->notifications);
             } else {
                 $this->notifications = $data[WCF::getUser()->userID];
             }
         }
     }
     return $this->notifications;
 }
 /**
  * Validates the tags.
  */
 protected function validateTags()
 {
     // check whether the user can/must set tags because of the category selection.
     $canSetTags = true;
     $canCreateNewsWithoutTags = true;
     foreach ($this->categoryIDs as $categoryID) {
         $category = CategoryHandler::getInstance()->getCategory($categoryID);
         $category = new NewsCategory($category);
         // check permissions
         if (!$category->getPermission('canSetTags')) {
             $canSetTags = false;
         }
         if (!$category->getPermission('canCreateNewsWithoutTags')) {
             $canCreateNewsWithoutTags = false;
         }
         // we have everything we need :-)
         if (!$canSetTags && !$canCreateNewsWithoutTags) {
             break;
         }
     }
     if (empty($this->tags)) {
         if ($canSetTags && !$canCreateNewsWithoutTags) {
             throw new UserInputException('tags', 'empty');
         }
     } else {
         if (!$canSetTags) {
             // user can't set tags => ignore them
             $this->tags = array();
         }
     }
 }
 /**
  * @see	\wcf\page\MultipleLinkPage::initObjectList()
  */
 protected function initObjectList()
 {
     if ($this->categoryID) {
         $this->objectList = new NewsCategoryList(array($this->categoryID));
     } else {
         if (NEWS_INDEX_CATEGORIES) {
             $categoryIDs = array_intersect(explode("\n", NEWS_INDEX_CATEGORIES), NewsCategory::getAccessibleCategoryIDs());
             $this->objectList = new NewsCategoryList($categoryIDs);
         } else {
             parent::initObjectList();
             if ($this->user) {
                 $this->objectList->getConditionBuilder()->add('news.userID = ?', array($this->user->userID));
             }
         }
     }
     // exclude archives news from overview.
     $this->objectList->getConditionBuilder()->add('news.isArchived = 0');
     if (!empty($this->letter)) {
         if ($this->letter == '#') {
             $this->objectList->getConditionBuilder()->add("SUBSTRING(news.subject,1,1) IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9')");
         } else {
             $this->objectList->getConditionBuilder()->add("news.subject LIKE ?", array($this->letter . '%'));
         }
     }
 }
 /**
  * @see	\wcf\page\MultipleLinkPage::initObjectList()
  */
 protected function initObjectList()
 {
     $this->objectList = new NewsCategoryList(NewsCategory::getSubscribedCategoryIDs());
 }