/** * fetches set of news items from database * * @param string $user_id author id for news set * @param string $area area group for news set (global, inst, sem or user) * @param string $term search term for news topic * @param int $startdate return only news (still) visible after this date * @param int $enddate return only news (still) visible before this date * @param boolean $as_objects include StudipNews objects in result array * @param int $limit max size of returned news set * @return array set of news items */ public static function GetNewsRangesByFilter($user_id, $area = '', $term = '', $startdate = 0, $enddate = 0, $as_objects = false, $limit = 100) { $news_result = array(); if ($limit <= 0) { return $news_result; } $where_querypart = 'news.user_id = ?'; $query_vars = array($user_id); if ($startdate) { $where_querypart .= " AND (date+expire) > ?"; $query_vars[] = $startdate; } if ($enddate) { $where_querypart .= " AND date < ?"; $query_vars[] = $enddate; } if ($term) { $where_querypart .= " AND topic LIKE CONCAT('%', ?, '%')"; $query_vars[] = $term; } switch ($area) { case 'global': $select_querypart = 'CONCAT(news_id, "_studip") AS idx, range_id, news.* '; $from_querypart = 'news_range INNER JOIN news USING(news_id)'; $where_querypart .= ' AND range_id = ?'; $order_querypart = 'news.date DESC, news.chdate DESC'; $query_vars[] = 'studip'; break; case 'sem': $select_querypart = 'CONCAT(news_id, "_", range_id) AS idx, range_id, seminare.Name AS title, ' . 'seminare.start_time AS start, news.*, seminare.start_time, sd1.name AS startsem, ' . 'IF(seminare.duration_time=-1, "' . _("unbegrenzt") . '", sd2.name) AS endsem '; $from_querypart = 'news INNER JOIN news_range USING(news_id) INNER JOIN seminare ON Seminar_id = range_id ' . 'LEFT JOIN semester_data sd1 ON (start_time BETWEEN sd1.beginn AND sd1.ende) ' . 'LEFT JOIN semester_data sd2 ON (start_time + duration_time BETWEEN sd2.beginn AND sd2.ende)'; $order_querypart = 'seminare.Name, news.date DESC, news.chdate DESC'; //$semester = new SemesterData(); break; case 'inst': $select_querypart = 'CONCAT(news_id, "_", range_id) AS idx, range_id, Institute.Name AS title, news.* '; $from_querypart = 'Institute INNER JOIN news_range ON Institut_id = range_id INNER JOIN news USING(news_id)'; $order_querypart = 'Institute.Name, news.date DESC, news.chdate DESC'; break; case 'user': $select_querypart = 'CONCAT(news_id, "_", auth_user_md5.user_id) AS idx, range_id, auth_user_md5.user_id AS userid, news.* '; $from_querypart = 'auth_user_md5 INNER JOIN news_range ON auth_user_md5.user_id = range_id INNER JOIN news USING(news_id)'; $order_querypart = 'auth_user_md5.Nachname, news.date DESC, news.chdate DESC'; break; default: foreach (array('global', 'inst', 'sem', 'user') as $type) { $add_news = StudipNews::GetNewsRangesByFilter($user_id, $type, $term, $startdate, $enddate, $as_objects, $limit); if (is_array($add_news)) { $limit = $limit - count($add_news[$type]); $news_result = array_merge($news_result, $add_news); } } return $news_result; } $query = "SELECT {$select_querypart}\n FROM {$from_querypart}\n WHERE {$where_querypart}\n ORDER BY {$order_querypart} LIMIT 0, ?"; $query_vars[] = $limit; $statement = DBManager::get()->prepare($query); $statement->execute($query_vars); $news_result = $statement->fetchGrouped(PDO::FETCH_ASSOC); if (is_array($news_result)) { foreach ($news_result as $id => $result) { //if (StudipNews::haveRangePermission($result['range_id'], 'edit')) { $objects[$area][$id]['range_id'] = $result['range_id']; $objects[$area][$id]['title'] = $result['title']; if ($area == 'sem') { $objects[$area][$id]['semester'] .= sprintf('(%s%s)', $result['startsem'], $result['startsem'] != $result['endsem'] ? ' - ' . $result['endsem'] : ''); } elseif ($area == 'user') { if ($GLOBALS['auth']->auth['uid'] == $result['userid']) { $objects[$area][$id]['title'] = _('Ankündigungen auf Ihrer Profilseite'); } else { $objects[$area][$id]['title'] = sprintf(_('Ankündigungen auf der Profilseite von %s'), get_fullname($result['userid'])); } } elseif ($area == 'global') { $objects[$area][$id]['title'] = _('Ankündigungen auf der Stud.IP Startseite'); } if ($as_objects) { $objects[$area][$id]['object'] = new StudipNews(); $objects[$area][$id]['object']->setData($result, true); $objects[$area][$id]['object']->setNew(false); } //} } } return $objects; }