コード例 #1
0
ファイル: StudipNews.class.php プロジェクト: ratbird/hope
 /**
  * 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;
 }