Completed
Push — master ( b77cfe...000f93 )
by Julito
22:58 queued 11:19
created

get_all_annoucement_by_user_course()   B

Complexity

Conditions 6
Paths 5

Size

Total Lines 51
Code Lines 29

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 6
eloc 29
nc 5
nop 2
dl 0
loc 51
rs 8.6588
c 0
b 0
f 0

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
/* For licensing terms, see /license.txt */
3
4
use Chamilo\CourseBundle\Entity\CAnnouncement;
5
use Chamilo\CourseBundle\Entity\CItemProperty;
6
7
/**
8
 * Include file with functions for the announcements module.
9
 *
10
 * @author jmontoya
11
 *
12
 * @package chamilo.announcements
13
 *
14
 * @todo use OOP
15
 */
16
class AnnouncementManager
17
{
18
    /**
19
     * Constructor.
20
     */
21
    public function __construct()
22
    {
23
    }
24
25
    /**
26
     * @return array
27
     */
28
    public static function getTags()
29
    {
30
        $tags = [
31
            '((user_name))',
32
            '((user_firstname))',
33
            '((user_lastname))',
34
            '((user_official_code))',
35
            '((course_title))',
36
            '((course_link))',
37
        ];
38
39
        $tags[] = '((teachers))';
40
41
        $extraField = new ExtraField('user');
42
        $extraFields = $extraField->get_all(['filter = ?' => 1]);
43
        if (!empty($extraFields)) {
44
            foreach ($extraFields as $extra) {
45
                $tags[] = "((extra_".$extra['variable']."))";
46
            }
47
        }
48
        $sessionId = api_get_session_id();
49
        if (!empty($sessionId)) {
50
            $tags[] = '((coaches))';
51
            $tags[] = '((general_coach))';
52
            $tags[] = '((general_coach_email))';
53
        }
54
55
        return $tags;
56
    }
57
58
    /**
59
     * @param int    $userId
60
     * @param string $content
61
     * @param string $courseCode
62
     * @param int    $sessionId
63
     *
64
     * @return string
65
     */
66
    public static function parseContent(
67
        $userId,
68
        $content,
69
        $courseCode,
70
        $sessionId = 0
71
    ) {
72
        $readerInfo = api_get_user_info($userId, false, false, true, true);
73
        $courseInfo = api_get_course_info($courseCode);
74
        $teacherList = CourseManager::getTeacherListFromCourseCodeToString($courseInfo['code']);
75
76
        $generalCoachName = '';
77
        $generalCoachEmail = '';
78
        $coaches = '';
79
        if (!empty($sessionId)) {
80
            $sessionInfo = api_get_session_info($sessionId);
81
            $coaches = CourseManager::get_coachs_from_course_to_string(
82
                $sessionId,
83
                $courseInfo['real_id']
84
            );
85
86
            $generalCoach = api_get_user_info($sessionInfo['id_coach']);
87
            $generalCoachName = $generalCoach['complete_name'];
88
            $generalCoachEmail = $generalCoach['email'];
89
        }
90
91
        $data = [];
92
        $data['user_name'] = '';
93
        $data['user_firstname'] = '';
94
        $data['user_lastname'] = '';
95
        $data['user_official_code'] = '';
96
        if (!empty($readerInfo)) {
97
            $data['user_name'] = $readerInfo['username'];
98
            $data['user_firstname'] = $readerInfo['firstname'];
99
            $data['user_lastname'] = $readerInfo['lastname'];
100
            $data['user_official_code'] = $readerInfo['official_code'];
101
        }
102
103
        $data['course_title'] = $courseInfo['name'];
104
        $courseLink = api_get_course_url($courseCode, $sessionId);
105
        $data['course_link'] = Display::url($courseLink, $courseLink);
106
        $data['teachers'] = $teacherList;
107
108
        if (!empty($readerInfo)) {
109
            $extraField = new ExtraField('user');
110
            $extraFields = $extraField->get_all(['filter = ?' => 1]);
111
            if (!empty($extraFields)) {
112
                foreach ($extraFields as $extra) {
113
                    $data["extra_".$extra['variable']] = '';
114
                }
115
            }
116
117
            if (!empty($readerInfo['extra'])) {
118
                foreach ($readerInfo['extra'] as $extra) {
119
                    if (isset($extra['value'])) {
120
                        /** @var \Chamilo\CoreBundle\Entity\ExtraFieldValues $value */
121
                        $value = $extra['value'];
122
                        $data['extra_'.$value->getField()->getVariable()] = $value->getValue();
123
                    }
124
                }
125
            }
126
        }
127
128
        if (!empty(api_get_session_id())) {
129
            $data['coaches'] = $coaches;
130
            $data['general_coach'] = $generalCoachName;
131
            $data['general_coach_email'] = $generalCoachEmail;
132
        }
133
134
        $tags = self::getTags();
135
        foreach ($tags as $tag) {
136
            $simpleTag = str_replace(['((', '))'], '', $tag);
137
            $value = isset($data[$simpleTag]) ? $data[$simpleTag] : '';
138
            $content = str_replace($tag, $value, $content);
139
        }
140
141
        return $content;
142
    }
143
144
    /**
145
     * Gets all announcements from a course.
146
     *
147
     * @param array $course_info
148
     * @param int   $session_id
149
     *
150
     * @return array html with the content and count of announcements or false otherwise
151
     */
152
    public static function get_all_annoucement_by_course($course_info, $session_id = 0)
153
    {
154
        $session_id = intval($session_id);
155
        $courseId = $course_info['real_id'];
156
157
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
158
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
159
160
        $sql = "SELECT DISTINCT 
161
                    announcement.id, 
162
                    announcement.title, 
163
                    announcement.content
164
				FROM $tbl_announcement announcement 
165
				INNER JOIN $tbl_item_property i
166
				ON (announcement.id = i.ref AND announcement.c_id = i.c_id)
167
				WHERE
168
                    i.tool='announcement' AND
169
                    announcement.session_id  = '$session_id' AND
170
                    announcement.c_id = $courseId AND
171
                    i.c_id = $courseId
172
				ORDER BY display_order DESC";
173
        $rs = Database::query($sql);
174
        $num_rows = Database::num_rows($rs);
175
        if ($num_rows > 0) {
176
            $list = [];
177
            while ($row = Database::fetch_array($rs)) {
178
                $list[] = $row;
179
            }
180
181
            return $list;
182
        }
183
184
        return false;
185
    }
186
187
    /**
188
     * This functions switches the visibility a course resource
189
     * using the visibility field in 'item_property'.
190
     *
191
     * @param array $courseInfo
192
     * @param int   $id         ID of the element of the corresponding type
193
     *
194
     * @return bool False on failure, True on success
195
     */
196
    public static function change_visibility_announcement($courseInfo, $id)
197
    {
198
        $session_id = api_get_session_id();
199
        $item_visibility = api_get_item_visibility(
200
            $courseInfo,
201
            TOOL_ANNOUNCEMENT,
202
            $id,
203
            $session_id
204
        );
205
        if ($item_visibility == '1') {
206
            api_item_property_update(
207
                $courseInfo,
208
                TOOL_ANNOUNCEMENT,
209
                $id,
210
                'invisible',
211
                api_get_user_id()
212
            );
213
        } else {
214
            api_item_property_update(
215
                $courseInfo,
216
                TOOL_ANNOUNCEMENT,
217
                $id,
218
                'visible',
219
                api_get_user_id()
220
            );
221
        }
222
223
        return true;
224
    }
225
226
    /**
227
     * Deletes an announcement.
228
     *
229
     * @param array $courseInfo the course array
230
     * @param int   $id         the announcement id
231
     */
232
    public static function delete_announcement($courseInfo, $id)
233
    {
234
        api_item_property_update(
235
            $courseInfo,
236
            TOOL_ANNOUNCEMENT,
237
            $id,
238
            'delete',
239
            api_get_user_id()
240
        );
241
    }
242
243
    /**
244
     * Deletes all announcements by course.
245
     *
246
     * @param array $courseInfo the course array
247
     */
248
    public static function delete_all_announcements($courseInfo)
249
    {
250
        $announcements = self::get_all_annoucement_by_course(
251
            $courseInfo,
252
            api_get_session_id()
253
        );
254
        if (!empty($announcements)) {
255
            foreach ($announcements as $annon) {
256
                api_item_property_update(
257
                    $courseInfo,
258
                    TOOL_ANNOUNCEMENT,
259
                    $annon['id'],
260
                    'delete',
261
                    api_get_user_id()
262
                );
263
            }
264
        }
265
    }
266
267
    /**
268
     * @param string $title
269
     * @param int    $courseId
270
     * @param int    $sessionId
271
     * @param int    $visibility 1 or 0
272
     *
273
     * @return mixed
274
     */
275
    public static function getAnnouncementsByTitle(
276
        $title,
277
        $courseId,
278
        $sessionId = 0,
279
        $visibility = 1
280
    ) {
281
        $dql = "SELECT a
282
                FROM ChamiloCourseBundle:CAnnouncement a 
283
                JOIN ChamiloCourseBundle:CItemProperty ip
284
                WITH a.id = ip.ref AND a.cId = ip.course
285
                WHERE
286
                    ip.tool = 'announcement' AND                        
287
                    a.cId = :course AND
288
                    a.sessionId = :session AND
289
                    a.title like :title AND
290
                    ip.visibility = :visibility
291
                ORDER BY a.displayOrder DESC";
292
293
        $qb = Database::getManager()->createQuery($dql);
294
        $result = $qb->execute(
295
            [
296
                'course' => $courseId,
297
                'session' => $sessionId,
298
                'visibility' => $visibility,
299
                'title' => "%$title%",
300
            ]
301
        );
302
303
        return $result;
304
    }
305
306
    /**
307
     * @param int $announcementId
308
     * @param int $courseId
309
     * @param int $userId
310
     *
311
     * @return array
312
     */
313
    public static function getAnnouncementInfoById(
314
        $announcementId,
315
        $courseId,
316
        $userId
317
    ) {
318
        if (api_is_allowed_to_edit(false, true) ||
319
            (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())
320
        ) {
321
            $dql = "SELECT a, ip
322
                    FROM ChamiloCourseBundle:CAnnouncement a 
323
                    JOIN ChamiloCourseBundle:CItemProperty ip
324
                    WITH a.id = ip.ref AND a.cId = ip.course
325
                    WHERE                        
326
                        a.id = :announcement AND
327
                        ip.tool = 'announcement' AND                        
328
                        a.cId = :course
329
                    ORDER BY a.displayOrder DESC";
330
        } else {
331
            $group_list = GroupManager::get_group_ids($courseId, api_get_user_id());
332
333
            if (empty($group_list)) {
334
                $group_list[] = 0;
335
            }
336
337
            if (api_get_user_id() != 0) {
338
                $dql = "SELECT a, ip
339
                        FROM ChamiloCourseBundle:CAnnouncement a 
340
                        JOIN ChamiloCourseBundle:CItemProperty ip
341
                        WITH a.id = ip.ref AND a.cId = ip.course
342
                        WHERE                      
343
                            a.id = :announcement AND
344
                            ip.tool='announcement' AND
345
                            (
346
                                ip.toUser = $userId OR
347
                                ip.group IN ('0', '".implode("', '", $group_list)."') OR
348
                                ip.group IS NULL
349
                            ) AND
350
                            ip.visibility = '1' AND                       
351
                            ip.course = :course
352
                        ORDER BY a.displayOrder DESC";
353
            } else {
354
                $dql = "SELECT a, ip
355
                        FROM ChamiloCourseBundle:CAnnouncement a 
356
                        JOIN ChamiloCourseBundle:CItemProperty ip
357
                        WITH a.id = ip.ref AND a.cId = ip.course 
358
                        WHERE                            
359
                            a.id = :announcement AND
360
                            ip.tool = 'announcement' AND
361
                            (ip.group = '0' OR ip.group IS NULL) AND
362
                            ip.visibility = '1' AND                            
363
                            ip.course = :course";
364
            }
365
        }
366
367
        $qb = Database::getManager()->createQuery($dql);
368
        $result = $qb->execute(
369
            [
370
                'announcement' => $announcementId,
371
                'course' => $courseId,
372
            ]
373
        );
374
375
        return [
376
            'announcement' => $result[0],
377
            'item_property' => $result[1],
378
        ];
379
    }
380
381
    /**
382
     * Displays one specific announcement.
383
     *
384
     * @param int $id, the id of the announcement you want to display
385
     *
386
     * @return string
387
     */
388
    public static function displayAnnouncement($id)
389
    {
390
        if ($id != strval(intval($id))) {
391
            return null;
392
        }
393
394
        global $charset;
395
396
        $html = '';
397
        $result = self::getAnnouncementInfoById(
398
            $id,
399
            api_get_course_int_id(),
400
            api_get_user_id()
401
        );
402
        /** @var CAnnouncement $announcement */
403
        $announcement = $result['announcement'];
404
        /** @var CItemProperty $itemProperty */
405
        $itemProperty = $result['item_property'];
406
407
        if (empty($announcement) || empty($itemProperty)) {
408
            return '';
409
        }
410
411
        $title = $announcement->getTitle();
412
        $content = $announcement->getContent();
413
414
        $html .= "<table height=\"100\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" class=\"data_table\">";
415
        $html .= "<tr><td><h2>".$title."</h2></td></tr>";
416
417
        if (api_is_allowed_to_edit(false, true) ||
418
            (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())
419
        ) {
420
            $modify_icons = "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=modify&id=".$id."\">".
421
                Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL)."</a>";
422
423
            $image_visibility = 'invisible';
424
            $alt_visibility = get_lang('Visible');
425
            if ($itemProperty->getVisibility() === 1) {
426
                $image_visibility = 'visible';
427
                $alt_visibility = get_lang('Hide');
428
            }
429
            global $stok;
430
            $modify_icons .= "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=showhide&id=".$id."&sec_token=".$stok."\">".
431
                Display::return_icon($image_visibility.'.png', $alt_visibility, '', ICON_SIZE_SMALL)."</a>";
432
433
            if (api_is_allowed_to_edit(false, true)) {
434
                $modify_icons .= "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=delete&id=".$id."&sec_token=".$stok."\" onclick=\"javascript:if(!confirm('".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES, $charset))."')) return false;\">".
435
                    Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL).
436
                    "</a>";
437
            }
438
            $html .= "<tr><th style='text-align:right'>$modify_icons</th></tr>";
439
        }
440
441
        //$toUser = $itemProperty->getToUser();
442
        //$toUserId = !empty($toUser) ? $toUser->getId() : 0;
443
        // The user id is always the current one.
444
        $toUserId = api_get_user_id();
445
        $content = self::parseContent(
446
            $toUserId,
447
            $content,
448
            api_get_course_id(),
449
            api_get_session_id()
450
        );
451
452
        $html .= "<tr><td>$content</td></tr>";
453
        $html .= "<tr>";
454
        $html .= "<td class=\"announcements_datum\">".get_lang('LastUpdateDate')." : ";
455
        $lastEdit = $itemProperty->getLasteditDate();
456
        $html .= Display::dateToStringAgoAndLongDate($lastEdit);
457
        $html .= "</td></tr>";
458
459
        if (api_is_allowed_to_edit(false, true)) {
460
            $sent_to = self::sent_to('announcement', $id);
461
            $sent_to_form = self::sent_to_form($sent_to);
462
            $html .= Display::tag(
463
                'td',
464
                get_lang('SentTo').': '.$sent_to_form,
465
                ['class' => 'announcements_datum']
466
            );
467
        }
468
        $attachment_list = self::get_attachment($id);
469
470
        if (count($attachment_list) > 0) {
471
            $html .= "<tr><td>";
472
            $realname = $attachment_list['path'];
473
            $user_filename = $attachment_list['filename'];
474
            $full_file_name = 'download.php?'.api_get_cidreq().'&file='.$realname;
475
            $html .= '<br/>';
476
            $html .= Display::return_icon('attachment.gif', get_lang('Attachment'));
477
            $html .= '<a href="'.$full_file_name.' "> '.$user_filename.' </a>';
478
            $html .= ' - <span class="forum_attach_comment" >'.$attachment_list['comment'].'</span>';
479
            if (api_is_allowed_to_edit(false, true)) {
480
                $url = api_get_self()."?".api_get_cidreq().
481
                    "&action=delete_attachment&id_attach=".$attachment_list['id']."&sec_token=".$stok;
482
                $html .= Display::url(
483
                    Display::return_icon(
484
                        'delete.png',
485
                        get_lang('Delete'),
486
                        '',
487
                        16
488
                    ),
489
                    $url
490
                );
491
            }
492
            $html .= '</td></tr>';
493
        }
494
        $html .= "</table>";
495
496
        return $html;
497
    }
498
499
    /**
500
     * @param array $courseInfo
501
     *
502
     * @return int
503
     */
504
    public static function getLastAnnouncementOrder($courseInfo)
505
    {
506
        if (empty($courseInfo)) {
507
            return 0;
508
        }
509
510
        if (!isset($courseInfo['real_id'])) {
511
            return false;
512
        }
513
514
        $courseId = $courseInfo['real_id'];
515
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT);
516
        $sql = "SELECT MAX(display_order)
517
                FROM $table
518
                WHERE c_id = $courseId ";
519
        $result = Database::query($sql);
520
521
        $order = 0;
522
        if (Database::num_rows($result)) {
523
            $row = Database::fetch_array($result);
524
            $order = (int) $row[0] + 1;
525
        }
526
527
        return $order;
528
    }
529
530
    /**
531
     * Store an announcement in the database (including its attached file if any).
532
     *
533
     * @param array  $courseInfo
534
     * @param int    $sessionId
535
     * @param string $title                Announcement title (pure text)
536
     * @param string $newContent           Content of the announcement (can be HTML)
537
     * @param array  $sentTo               Array of users and groups to send the announcement to
538
     * @param array  $file                 uploaded file $_FILES
539
     * @param string $file_comment         Comment describing the attachment
540
     * @param string $end_date
541
     * @param bool   $sendToUsersInSession
542
     * @param int    $authorId
543
     *
544
     * @return int false on failure, ID of the announcement on success
545
     */
546
    public static function add_announcement(
547
        $courseInfo,
548
        $sessionId,
549
        $title,
550
        $newContent,
551
        $sentTo,
552
        $file = [],
553
        $file_comment = null,
554
        $end_date = null,
555
        $sendToUsersInSession = false,
556
        $authorId = 0
557
    ) {
558
        if (empty($courseInfo)) {
559
            return false;
560
        }
561
562
        if (!isset($courseInfo['real_id'])) {
563
            return false;
564
        }
565
566
        $courseId = $courseInfo['real_id'];
567
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
568
569
        $authorId = empty($authorId) ? api_get_user_id() : $authorId;
570
571
        if (empty($end_date)) {
572
            $end_date = api_get_utc_datetime();
573
        }
574
575
        $order = self::getLastAnnouncementOrder($courseInfo);
576
577
        // store in the table announcement
578
        $params = [
579
            'c_id' => $courseId,
580
            'content' => $newContent,
581
            'title' => $title,
582
            'end_date' => $end_date,
583
            'display_order' => $order,
584
            'session_id' => (int) $sessionId,
585
        ];
586
587
        $last_id = Database::insert($tbl_announcement, $params);
588
589
        if (empty($last_id)) {
590
            return false;
591
        } else {
592
            $sql = "UPDATE $tbl_announcement SET id = iid WHERE iid = $last_id";
593
            Database::query($sql);
594
595
            if (!empty($file)) {
596
                self::add_announcement_attachment_file(
597
                    $last_id,
598
                    $file_comment,
599
                    $_FILES['user_upload']
600
                );
601
            }
602
603
            // store in item_property (first the groups, then the users
604
            if (empty($sentTo) ||
605
                (!empty($sentTo) && isset($sentTo[0]) && $sentTo[0] == 'everyone')
606
            ) {
607
                // The message is sent to EVERYONE, so we set the group to 0
608
                api_item_property_update(
609
                    $courseInfo,
610
                    TOOL_ANNOUNCEMENT,
611
                    $last_id,
612
                    'AnnouncementAdded',
613
                    $authorId,
614
                    '0',
615
                    null,
616
                    null,
617
                    null,
618
                    $sessionId
619
                );
620
            } else {
621
                $send_to = CourseManager::separateUsersGroups($sentTo);
622
                $batchSize = 20;
623
                $em = Database::getManager();
624
                // Storing the selected groups
625
                if (is_array($send_to['groups']) &&
626
                    !empty($send_to['groups'])
627
                ) {
628
                    $counter = 1;
629
                    foreach ($send_to['groups'] as $group) {
630
                        $groupInfo = GroupManager::get_group_properties($group);
631
                        api_item_property_update(
632
                            $courseInfo,
633
                            TOOL_ANNOUNCEMENT,
634
                            $last_id,
635
                            'AnnouncementAdded',
636
                            $authorId,
637
                            $groupInfo
638
                        );
639
640
                        if (($counter % $batchSize) === 0) {
641
                            $em->flush();
642
                            $em->clear();
643
                        }
644
                        $counter++;
645
                    }
646
                }
647
648
                // Storing the selected users
649
                if (is_array($send_to['users'])) {
650
                    $counter = 1;
651
                    foreach ($send_to['users'] as $user) {
652
                        api_item_property_update(
653
                            $courseInfo,
654
                            TOOL_ANNOUNCEMENT,
655
                            $last_id,
656
                            'AnnouncementAdded',
657
                            $authorId,
658
                            '',
659
                            $user
660
                        );
661
662
                        if (($counter % $batchSize) === 0) {
663
                            $em->flush();
664
                            $em->clear();
665
                        }
666
                        $counter++;
667
                    }
668
                }
669
            }
670
671
            if ($sendToUsersInSession) {
672
                self::addAnnouncementToAllUsersInSessions($last_id);
673
            }
674
675
            return $last_id;
676
        }
677
    }
678
679
    /**
680
     * @param $title
681
     * @param $newContent
682
     * @param $to
683
     * @param $to_users
684
     * @param array  $file
685
     * @param string $file_comment
686
     * @param bool   $sendToUsersInSession
687
     *
688
     * @return bool|int
689
     */
690
    public static function add_group_announcement(
691
        $title,
692
        $newContent,
693
        $to,
694
        $to_users,
695
        $file = [],
696
        $file_comment = '',
697
        $sendToUsersInSession = false
698
    ) {
699
        $courseInfo = api_get_course_info();
700
701
        // Database definitions
702
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT);
703
        $order = self::getLastAnnouncementOrder($courseInfo);
704
705
        $now = api_get_utc_datetime();
706
        $courseId = api_get_course_int_id();
707
708
        // store in the table announcement
709
        $params = [
710
            'c_id' => $courseId,
711
            'content' => $newContent,
712
            'title' => $title,
713
            'end_date' => $now,
714
            'display_order' => $order,
715
            'session_id' => api_get_session_id(),
716
        ];
717
718
        $last_id = Database::insert($table, $params);
719
720
        // Store the attach file
721
        if ($last_id) {
722
            $sql = "UPDATE $table SET id = iid 
723
                    WHERE iid = $last_id";
724
            Database::query($sql);
725
726
            if (!empty($file)) {
727
                self::add_announcement_attachment_file(
728
                    $last_id,
729
                    $file_comment,
730
                    $file
731
                );
732
            }
733
734
            // Store in item_property (first the groups, then the users)
735
            //if (!isset($to_users)) {
736
            if (isset($to_users[0]) && $to_users[0] === 'everyone') {
737
                // when no user is selected we send it to everyone
738
                $send_to = CourseManager::separateUsersGroups($to);
739
                // storing the selected groups
740
                if (is_array($send_to['groups'])) {
741
                    foreach ($send_to['groups'] as $group) {
742
                        $groupInfo = GroupManager::get_group_properties($group);
743
                        api_item_property_update(
744
                            $courseInfo,
745
                            TOOL_ANNOUNCEMENT,
746
                            $last_id,
747
                            'AnnouncementAdded',
748
                            api_get_user_id(),
749
                            $groupInfo
750
                        );
751
                    }
752
                }
753
            } else {
754
                $send_to_groups = CourseManager::separateUsersGroups($to);
755
                $send_to_users = CourseManager::separateUsersGroups($to_users);
756
                $to_groups = $send_to_groups['groups'];
757
                $to_users = $send_to_users['users'];
758
                // storing the selected users
759
                if (is_array($to_users) && is_array($to_groups)) {
760
                    foreach ($to_groups as $group) {
761
                        $groupInfo = GroupManager::get_group_properties($group);
762
                        foreach ($to_users as $user) {
763
                            api_item_property_update(
764
                                $courseInfo,
765
                                TOOL_ANNOUNCEMENT,
766
                                $last_id,
767
                                'AnnouncementAdded',
768
                                api_get_user_id(),
769
                                $groupInfo,
770
                                $user
771
                            );
772
                        }
773
                    }
774
                }
775
            }
776
777
            if ($sendToUsersInSession) {
778
                self::addAnnouncementToAllUsersInSessions($last_id);
779
            }
780
        }
781
782
        return $last_id;
783
    }
784
785
    /**
786
     * This function stores the announcement item in the announcement table
787
     * and updates the item_property table.
788
     *
789
     * @param int    $id                   id of the announcement
790
     * @param string $title
791
     * @param string $newContent
792
     * @param array  $to                   users that will receive the announcement
793
     * @param mixed  $file                 attachment
794
     * @param string $file_comment         file comment
795
     * @param bool   $sendToUsersInSession
796
     */
797
    public static function edit_announcement(
798
        $id,
799
        $title,
800
        $newContent,
801
        $to,
802
        $file = [],
803
        $file_comment = '',
804
        $sendToUsersInSession = false
805
    ) {
806
        $courseInfo = api_get_course_info();
807
        $courseId = api_get_course_int_id();
808
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
809
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT);
810
        $id = intval($id);
811
812
        $params = [
813
            'title' => $title,
814
            'content' => $newContent,
815
        ];
816
817
        Database::update(
818
            $table,
819
            $params,
820
            ['c_id = ? AND id = ?' => [$courseId, $id]]
821
        );
822
823
        // save attachment file
824
        $row_attach = self::get_attachment($id);
825
826
        $id_attach = 0;
827
        if ($row_attach) {
828
            $id_attach = intval($row_attach['id']);
829
        }
830
831
        if (!empty($file)) {
832
            if (empty($id_attach)) {
833
                self::add_announcement_attachment_file(
834
                    $id,
835
                    $file_comment,
836
                    $file
837
                );
838
            } else {
839
                self::edit_announcement_attachment_file(
840
                    $id_attach,
841
                    $file,
842
                    $file_comment
843
                );
844
            }
845
        }
846
847
        // We remove everything from item_property for this
848
        $sql = "DELETE FROM $tbl_item_property
849
                WHERE c_id = $courseId AND ref='$id' AND tool='announcement'";
850
        Database::query($sql);
851
852
        if ($sendToUsersInSession) {
853
            self::addAnnouncementToAllUsersInSessions($id);
854
        }
855
856
        // store in item_property (first the groups, then the users
857
        if (!empty($to)) {
858
            // !is_null($to): when no user is selected we send it to everyone
859
            $send_to = CourseManager::separateUsersGroups($to);
860
861
            // storing the selected groups
862
            if (is_array($send_to['groups'])) {
863
                foreach ($send_to['groups'] as $group) {
864
                    $groupInfo = GroupManager::get_group_properties($group);
865
                    if (empty($groupInfo)) {
866
                        // Probably the group id and iid are different try checking the iid
867
                        $groupInfo = GroupManager::get_group_properties($group, true);
868
                    }
869
                    if ($groupInfo) {
870
                        api_item_property_update(
871
                            $courseInfo,
872
                            TOOL_ANNOUNCEMENT,
873
                            $id,
874
                            'AnnouncementUpdated',
875
                            api_get_user_id(),
876
                            $groupInfo
877
                        );
878
                    }
879
                }
880
            }
881
882
            // storing the selected users
883
            if (is_array($send_to['users'])) {
884
                foreach ($send_to['users'] as $user) {
885
                    api_item_property_update(
886
                        $courseInfo,
887
                        TOOL_ANNOUNCEMENT,
888
                        $id,
889
                        'AnnouncementUpdated',
890
                        api_get_user_id(),
891
                        0,
892
                        $user
893
                    );
894
                }
895
            }
896
897
            // Send to everyone
898
            if (isset($to[0]) && $to[0] === 'everyone') {
899
                api_item_property_update(
900
                    $courseInfo,
901
                    TOOL_ANNOUNCEMENT,
902
                    $id,
903
                    'AnnouncementUpdated',
904
                    api_get_user_id(),
905
                    0
906
                );
907
            }
908
        } else {
909
            // the message is sent to everyone, so we set the group to 0
910
            api_item_property_update(
911
                $courseInfo,
912
                TOOL_ANNOUNCEMENT,
913
                $id,
914
                'AnnouncementUpdated',
915
                api_get_user_id(),
916
                0
917
            );
918
        }
919
    }
920
921
    /**
922
     * @param int $announcementId
923
     */
924
    public static function addAnnouncementToAllUsersInSessions($announcementId)
925
    {
926
        $courseCode = api_get_course_id();
927
        $courseInfo = api_get_course_info();
928
        $sessionList = SessionManager::get_session_by_course(api_get_course_int_id());
929
930
        if (!empty($sessionList)) {
931
            foreach ($sessionList as $sessionInfo) {
932
                $sessionId = $sessionInfo['id'];
933
                $userList = CourseManager::get_user_list_from_course_code(
934
                    $courseCode,
935
                    $sessionId
936
                );
937
938
                if (!empty($userList)) {
939
                    foreach ($userList as $user) {
940
                        api_item_property_update(
941
                            $courseInfo,
942
                            TOOL_ANNOUNCEMENT,
943
                            $announcementId,
944
                            "AnnouncementUpdated",
945
                            api_get_user_id(),
946
                            0,
947
                            $user['user_id'],
948
                            0,
949
                            0,
950
                            $sessionId
951
                        );
952
                    }
953
                }
954
            }
955
        }
956
    }
957
958
    /**
959
     * @param int $insert_id
960
     *
961
     * @return bool
962
     */
963
    public static function update_mail_sent($insert_id)
964
    {
965
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT);
966
        if ($insert_id != strval(intval($insert_id))) {
967
            return false;
968
        }
969
        $insert_id = intval($insert_id);
970
        $courseId = api_get_course_int_id();
971
        // store the modifications in the table tbl_annoucement
972
        $sql = "UPDATE $table SET email_sent='1'
973
                WHERE c_id = $courseId AND id = $insert_id";
974
        Database::query($sql);
975
    }
976
977
    /**
978
     * Gets all announcements from a user by course.
979
     *
980
     * @param string course db
981
     * @param int user id
982
     *
983
     * @return array html with the content and count of announcements or false otherwise
984
     */
985
    public static function get_all_annoucement_by_user_course($course_code, $user_id)
986
    {
987
        $course_info = api_get_course_info($course_code);
988
        $courseId = $course_info['real_id'];
989
990
        if (empty($user_id)) {
991
            return false;
992
        }
993
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
994
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
995
        if (!empty($user_id) && is_numeric($user_id)) {
996
            $user_id = (int) $user_id;
997
            $sql = "SELECT DISTINCT 
998
                        announcement.title, 
999
                        announcement.content, 
1000
                        display_order
1001
					FROM $tbl_announcement announcement 
1002
					INNER JOIN $tbl_item_property ip
1003
					ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1004
					WHERE
1005
						announcement.c_id = $courseId AND
1006
						ip.c_id = $courseId AND						
1007
						ip.tool='announcement' AND
1008
						(
1009
						  ip.insert_user_id='$user_id' AND
1010
						  (ip.to_group_id='0' OR ip.to_group_id IS NULL)
1011
						)
1012
						AND ip.visibility='1'
1013
						AND announcement.session_id  = 0
1014
					ORDER BY display_order DESC";
1015
            $rs = Database::query($sql);
1016
            $num_rows = Database::num_rows($rs);
1017
            $content = '';
1018
            $i = 0;
1019
            $result = [];
1020
            if ($num_rows > 0) {
1021
                while ($myrow = Database::fetch_array($rs)) {
1022
                    $content .= '<strong>'.$myrow['title'].'</strong><br /><br />';
1023
                    $content .= $myrow['content'];
1024
                    $i++;
1025
                }
1026
                $result['content'] = $content;
1027
                $result['count'] = $i;
1028
1029
                return $result;
1030
            }
1031
1032
            return false;
1033
        }
1034
1035
        return false;
1036
    }
1037
1038
    /**
1039
     * Returns announcement info from its id.
1040
     *
1041
     * @param int $courseId
1042
     * @param int $id
1043
     *
1044
     * @return array
1045
     */
1046
    public static function get_by_id($courseId, $id)
1047
    {
1048
        $id = intval($id);
1049
        $courseId = $courseId ? intval($courseId) : api_get_course_int_id();
1050
1051
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
1052
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
1053
1054
        $sql = "SELECT DISTINCT 
1055
                    announcement.id, 
1056
                    announcement.title, 
1057
                    announcement.content,
1058
                    ip.to_group_id
1059
               FROM $tbl_announcement announcement
1060
               INNER JOIN $tbl_item_property ip
1061
               ON
1062
                    announcement.id = ip.ref AND
1063
                    announcement.c_id = ip.c_id
1064
               WHERE
1065
                    announcement.c_id = $courseId AND
1066
                    ip.tool='announcement' AND
1067
                    announcement.id = $id
1068
                ";
1069
        $result = Database::query($sql);
1070
        if (Database::num_rows($result)) {
1071
            return Database::fetch_array($result);
1072
        }
1073
1074
        return [];
1075
    }
1076
1077
    /**
1078
     * this function gets all the groups of the course,
1079
     * not including linked courses.
1080
     */
1081
    public static function get_course_groups()
1082
    {
1083
        $session_id = api_get_session_id();
1084
        if ($session_id != 0) {
1085
            $new_group_list = CourseManager::get_group_list_of_course(
1086
                api_get_course_id(),
1087
                $session_id,
1088
                1
1089
            );
1090
        } else {
1091
            $new_group_list = CourseManager::get_group_list_of_course(
1092
                api_get_course_id(),
1093
                0,
1094
                1
1095
            );
1096
        }
1097
1098
        return $new_group_list;
1099
    }
1100
1101
    /**
1102
     * This tools loads all the users and all the groups who have received
1103
     * a specific item (in this case an announcement item).
1104
     *
1105
     * @param string $tool
1106
     * @param int    $id
1107
     *
1108
     * @return array
1109
     */
1110
    public static function load_edit_users($tool, $id)
1111
    {
1112
        $table = Database::get_course_table(TABLE_ITEM_PROPERTY);
1113
        $tool = Database::escape_string($tool);
1114
        $id = (int) $id;
1115
        $courseId = api_get_course_int_id();
1116
1117
        $sql = "SELECT to_user_id, to_group_id FROM $table
1118
                WHERE c_id = $courseId AND tool='$tool' AND ref = $id";
1119
        $result = Database::query($sql);
1120
        $to = [];
1121
        while ($row = Database::fetch_array($result)) {
1122
            // This is the iid of c_group_info
1123
            $toGroup = $row['to_group_id'];
1124
            switch ($toGroup) {
1125
                // it was send to one specific user
1126
                case null:
1127
                    $to[] = "USER:".$row['to_user_id'];
1128
                    break;
1129
                // it was sent to everyone
1130
                case 0:
1131
                    return 'everyone';
1132
                    break;
0 ignored issues
show
Unused Code introduced by
break is not strictly necessary here and could be removed.

The break statement is not necessary if it is preceded for example by a return statement:

switch ($x) {
    case 1:
        return 'foo';
        break; // This break is not necessary and can be left off.
}

If you would like to keep this construct to be consistent with other case statements, you can safely mark this issue as a false-positive.

Loading history...
1133
                default:
1134
                    $to[] = "GROUP:".$toGroup;
1135
            }
1136
        }
1137
1138
        return $to;
1139
    }
1140
1141
    /**
1142
     * constructs the form to display all the groups and users the message has been sent to.
1143
     *
1144
     * @param array $sent_to_array
1145
     *                             input:
1146
     *                             $sent_to_array is a 2 dimensional array containing the groups and the users
1147
     *                             the first level is a distinction between groups and users:
1148
     *                             $sent_to_array['groups'] * and $sent_to_array['users']
1149
     *                             $sent_to_array['groups'] (resp. $sent_to_array['users']) is also an array
1150
     *                             containing all the id's of the groups (resp. users) who have received this message.
1151
     *
1152
     * @return string
1153
     *
1154
     * @author Patrick Cool <patrick.cool@>
1155
     */
1156
    public static function sent_to_form($sent_to_array)
1157
    {
1158
        // we find all the names of the groups
1159
        $group_names = self::get_course_groups();
1160
1161
        // we count the number of users and the number of groups
1162
        if (isset($sent_to_array['users'])) {
1163
            $number_users = count($sent_to_array['users']);
1164
        } else {
1165
            $number_users = 0;
1166
        }
1167
        if (isset($sent_to_array['groups'])) {
1168
            $number_groups = count($sent_to_array['groups']);
1169
        } else {
1170
            $number_groups = 0;
1171
        }
1172
        $total_numbers = $number_users + $number_groups;
1173
1174
        // starting the form if there is more than one user/group
1175
        $output = [];
1176
        if ($total_numbers > 1) {
1177
            // outputting the name of the groups
1178
            if (is_array($sent_to_array['groups'])) {
1179
                foreach ($sent_to_array['groups'] as $group_id) {
1180
                    $output[] = $group_names[$group_id]['name'];
1181
                }
1182
            }
1183
1184
            if (isset($sent_to_array['users'])) {
1185
                if (is_array($sent_to_array['users'])) {
1186
                    foreach ($sent_to_array['users'] as $user_id) {
1187
                        $user_info = api_get_user_info($user_id);
1188
                        $output[] = $user_info['complete_name_with_username'];
1189
                    }
1190
                }
1191
            }
1192
        } else {
1193
            // there is only one user/group
1194
            if (isset($sent_to_array['users']) and is_array($sent_to_array['users'])) {
1195
                $user_info = api_get_user_info($sent_to_array['users'][0]);
1196
                $output[] = api_get_person_name($user_info['firstname'], $user_info['lastname']);
1197
            }
1198
            if (isset($sent_to_array['groups']) and
1199
                is_array($sent_to_array['groups']) and
1200
                isset($sent_to_array['groups'][0]) and
1201
                $sent_to_array['groups'][0] !== 0
1202
            ) {
1203
                $group_id = $sent_to_array['groups'][0];
1204
                $output[] = "&nbsp;".$group_names[$group_id]['name'];
1205
            }
1206
            if (empty($sent_to_array['groups']) and empty($sent_to_array['users'])) {
1207
                $output[] = "&nbsp;".get_lang('Everybody');
1208
            }
1209
        }
1210
1211
        if (!empty($output)) {
1212
            $output = array_filter($output);
1213
            if (count($output) > 0) {
1214
                $output = implode(', ', $output);
1215
            }
1216
1217
            return $output;
1218
        }
1219
    }
1220
1221
    /**
1222
     * Returns all the users and all the groups a specific announcement item
1223
     * has been sent to.
1224
     *
1225
     * @param    string  The tool (announcement, agenda, ...)
1226
     * @param    int     ID of the element of the corresponding type
1227
     *
1228
     * @return array Array of users and groups to whom the element has been sent
1229
     */
1230
    public static function sent_to($tool, $id)
1231
    {
1232
        $table = Database::get_course_table(TABLE_ITEM_PROPERTY);
1233
        $tool = Database::escape_string($tool);
1234
        $id = (int) $id;
1235
1236
        $sent_to_group = [];
1237
        $sent_to = [];
1238
        $courseId = api_get_course_int_id();
1239
1240
        $sql = "SELECT to_group_id, to_user_id
1241
                FROM $table
1242
                WHERE c_id = $courseId AND tool = '$tool' AND ref=".$id;
1243
        $result = Database::query($sql);
1244
1245
        while ($row = Database::fetch_array($result)) {
1246
            // if to_user_id <> 0 then it is sent to a specific user
1247
            if ($row['to_user_id'] != 0) {
1248
                $sent_to_user[] = $row['to_user_id'];
1249
                continue;
1250
            }
1251
1252
            // if to_group_id is null then it is sent to a specific user
1253
            // if to_group_id = 0 then it is sent to everybody
1254
            if ($row['to_group_id'] != 0) {
1255
                $sent_to_group[] = $row['to_group_id'];
1256
            }
1257
        }
1258
1259
        if (isset($sent_to_group)) {
1260
            $sent_to['groups'] = $sent_to_group;
1261
        }
1262
1263
        if (isset($sent_to_user)) {
1264
            $sent_to['users'] = $sent_to_user;
1265
        }
1266
1267
        return $sent_to;
1268
    }
1269
1270
    /**
1271
     * Show a list with all the attachments according to the post's id.
1272
     *
1273
     * @param int $announcementId
1274
     *
1275
     * @return array with the post info
1276
     *
1277
     * @author Arthur Portugal
1278
     *
1279
     * @version November 2009, dokeos 1.8.6.2
1280
     */
1281
    public static function get_attachment($announcementId)
1282
    {
1283
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT);
1284
        $announcementId = intval($announcementId);
1285
        $courseId = api_get_course_int_id();
1286
        $row = [];
1287
        $sql = 'SELECT id, path, filename, comment 
1288
                FROM '.$table.'
1289
				WHERE c_id = '.$courseId.' AND announcement_id = '.$announcementId;
1290
        $result = Database::query($sql);
1291
        if (Database::num_rows($result) != 0) {
1292
            $row = Database::fetch_array($result, 'ASSOC');
1293
        }
1294
1295
        return $row;
1296
    }
1297
1298
    /**
1299
     * This function add a attachment file into announcement.
1300
     *
1301
     * @param int  announcement id
1302
     * @param string file comment
1303
     * @param array  uploaded file $_FILES
1304
     *
1305
     * @return int -1 if failed, 0 if unknown (should not happen), 1 if success
1306
     */
1307
    public static function add_announcement_attachment_file(
1308
        $announcement_id,
1309
        $file_comment,
1310
        $file
1311
    ) {
1312
        $courseInfo = api_get_course_info();
1313
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT);
1314
        $return = 0;
1315
        $announcement_id = intval($announcement_id);
1316
        $courseId = api_get_course_int_id();
1317
1318
        if (is_array($file) && $file['error'] == 0) {
1319
            // TODO: This path is obsolete. The new document repository scheme should be kept in mind here.
1320
            $courseDir = $courseInfo['path'].'/upload/announcements';
1321
            $sys_course_path = api_get_path(SYS_COURSE_PATH);
1322
            $updir = $sys_course_path.$courseDir;
1323
1324
            // Try to add an extension to the file if it hasn't one
1325
            $new_file_name = add_ext_on_mime(stripslashes($file['name']), $file['type']);
1326
            // user's file name
1327
            $file_name = $file['name'];
1328
1329
            if (!filter_extension($new_file_name)) {
1330
                $return = -1;
1331
                echo Display::return_message(get_lang('UplUnableToSaveFileFilteredExtension'), 'error');
1332
            } else {
1333
                $new_file_name = uniqid('');
1334
                $new_path = $updir.'/'.$new_file_name;
1335
1336
                // This file is copy here but its cleaned in api_mail_html in api.lib.php
1337
                copy($file['tmp_name'], $new_path);
1338
1339
                $params = [
1340
                    'c_id' => $courseId,
1341
                    'filename' => $file_name,
1342
                    'comment' => $file_comment,
1343
                    'path' => $new_file_name,
1344
                    'announcement_id' => $announcement_id,
1345
                    'size' => intval($file['size']),
1346
                ];
1347
1348
                $insertId = Database::insert($table, $params);
1349
                if ($insertId) {
1350
                    $sql = "UPDATE $table SET id = iid 
1351
                            WHERE iid = $insertId";
1352
                    Database::query($sql);
1353
                }
1354
1355
                $return = 1;
1356
            }
1357
        }
1358
1359
        return $return;
1360
    }
1361
1362
    /**
1363
     * This function edit a attachment file into announcement.
1364
     *
1365
     * @param int attach id
1366
     * @param array uploaded file $_FILES
1367
     * @param string file comment
1368
     *
1369
     * @return int
1370
     */
1371
    public static function edit_announcement_attachment_file(
1372
        $id_attach,
1373
        $file,
1374
        $file_comment
1375
    ) {
1376
        $courseInfo = api_get_course_info();
1377
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT);
1378
        $return = 0;
1379
        $courseId = api_get_course_int_id();
1380
1381
        if (is_array($file) && $file['error'] == 0) {
1382
            // TODO: This path is obsolete. The new document repository scheme should be kept in mind here.
1383
            $courseDir = $courseInfo['path'].'/upload/announcements';
1384
            $sys_course_path = api_get_path(SYS_COURSE_PATH);
1385
            $updir = $sys_course_path.$courseDir;
1386
1387
            // Try to add an extension to the file if it hasn't one
1388
            $new_file_name = add_ext_on_mime(
1389
                stripslashes($file['name']),
1390
                $file['type']
1391
            );
1392
            // user's file name
1393
            $file_name = $file['name'];
1394
1395
            if (!filter_extension($new_file_name)) {
1396
                $return = -1;
1397
                echo Display::return_message(
1398
                    get_lang('UplUnableToSaveFileFilteredExtension'),
1399
                    'error'
1400
                );
1401
            } else {
1402
                $new_file_name = uniqid('');
1403
                $new_path = $updir.'/'.$new_file_name;
1404
                copy($file['tmp_name'], $new_path);
1405
                $safe_file_comment = Database::escape_string($file_comment);
1406
                $safe_file_name = Database::escape_string($file_name);
1407
                $safe_new_file_name = Database::escape_string($new_file_name);
1408
                $id_attach = intval($id_attach);
1409
                $sql = "UPDATE $table SET 
1410
                            filename = '$safe_file_name', 
1411
                            comment = '$safe_file_comment', 
1412
                            path = '$safe_new_file_name', 
1413
                            size ='".intval($file['size'])."'
1414
					 	WHERE c_id = $courseId AND id = '$id_attach'";
1415
                $result = Database::query($sql);
1416
                if ($result === false) {
1417
                    $return = -1;
1418
                    echo Display::return_message(
1419
                        get_lang('UplUnableToSaveFile'),
1420
                        'error'
1421
                    );
1422
                } else {
1423
                    $return = 1;
1424
                }
1425
            }
1426
        }
1427
1428
        return $return;
1429
    }
1430
1431
    /**
1432
     * This function delete a attachment file by id.
1433
     *
1434
     * @param int $id attachment file Id
1435
     *
1436
     * @return bool
1437
     */
1438
    public static function delete_announcement_attachment_file($id)
1439
    {
1440
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT);
1441
        $id = intval($id);
1442
        $courseId = api_get_course_int_id();
1443
        if (empty($courseId) || empty($id)) {
1444
            return false;
1445
        }
1446
        $sql = "DELETE FROM $table
1447
                WHERE c_id = $courseId AND id = $id";
1448
        Database::query($sql);
1449
1450
        return true;
1451
    }
1452
1453
    /**
1454
     * @param array $courseInfo
1455
     * @param int   $sessionId
1456
     * @param int   $announcementId
1457
     * @param bool  $sendToUsersInSession
1458
     * @param bool  $sendToDrhUsers
1459
     * @param Monolog\Handler\HandlerInterface logger
1460
     * @param int $senderId
1461
     */
1462
    public static function sendEmail(
1463
        $courseInfo,
1464
        $sessionId,
1465
        $announcementId,
1466
        $sendToUsersInSession = false,
1467
        $sendToDrhUsers = false,
1468
        $logger = null,
1469
        $senderId = 0
1470
    ) {
1471
        $email = new AnnouncementEmail($courseInfo, $sessionId, $announcementId, $logger);
1472
        $email->send($sendToUsersInSession, $sendToDrhUsers, $senderId);
1473
    }
1474
1475
    /**
1476
     * @param $stok
1477
     * @param $announcement_number
1478
     * @param bool   $getCount
1479
     * @param null   $start
0 ignored issues
show
Documentation Bug introduced by
Are you sure the doc-type for parameter $start is correct as it would always require null to be passed?
Loading history...
Documentation Bug introduced by
Are you sure the doc-type for parameter $limit is correct as it would always require null to be passed?
Loading history...
1480
     * @param null   $limit
1481
     * @param string $sidx
1482
     * @param string $sord
1483
     * @param string $titleToSearch
1484
     * @param int    $userIdToSearch
1485
     * @param int    $userId
1486
     * @param int    $courseId
1487
     * @param int    $sessionId
1488
     *
1489
     * @return array
1490
     */
1491
    public static function getAnnouncements(
1492
        $stok,
1493
        $announcement_number,
1494
        $getCount = false,
1495
        $start = null,
1496
        $limit = null,
1497
        $sidx = '',
1498
        $sord = '',
1499
        $titleToSearch = '',
1500
        $userIdToSearch = 0,
1501
        $userId = 0,
1502
        $courseId = 0,
1503
        $sessionId = 0
1504
    ) {
1505
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
1506
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
1507
1508
        $user_id = $userId ?: api_get_user_id();
1509
        $group_id = api_get_group_id();
1510
        $session_id = $sessionId ?: api_get_session_id();
1511
        if (empty($courseId)) {
1512
            $courseInfo = api_get_course_info();
1513
            $courseId = $courseInfo['real_id'];
1514
        } else {
1515
            $courseId = (int) $courseId;
1516
            $courseInfo = api_get_course_info_by_id($courseId);
1517
        }
1518
1519
        if (empty($courseInfo)) {
1520
            return [];
1521
        }
1522
1523
        $condition_session = api_get_session_condition(
1524
            $session_id,
1525
            true,
1526
            true,
1527
            'announcement.session_id'
1528
        );
1529
1530
        $group_memberships = GroupManager::get_group_ids(
1531
            $courseId,
1532
            api_get_user_id()
1533
        );
1534
        $allowUserEditSetting = api_get_course_setting('allow_user_edit_announcement');
1535
1536
        $select = ' DISTINCT 
1537
                        announcement.*, 
1538
                        ip.visibility, 
1539
                        ip.to_group_id, 
1540
                        ip.insert_user_id, 
1541
                        ip.insert_date, 
1542
                        ip.lastedit_date';
1543
        $groupBy = ' GROUP BY announcement.iid';
1544
        if ($getCount) {
1545
            $groupBy = '';
1546
            $select = ' COUNT(DISTINCT announcement.iid) count';
1547
        }
1548
1549
        $searchCondition = '';
1550
        if (!empty($titleToSearch)) {
1551
            $titleToSearch = Database::escape_string($titleToSearch);
1552
            $searchCondition .= " AND (title LIKE '%$titleToSearch%')";
1553
        }
1554
1555
        if (!empty($userIdToSearch)) {
1556
            $userIdToSearch = intval($userIdToSearch);
1557
            $searchCondition .= " AND (ip.insert_user_id = $userIdToSearch)";
1558
        }
1559
1560
        $allowOnlyGroup = api_get_configuration_value('hide_base_course_announcements_in_group');
1561
        $extraGroupCondition = '';
1562
        if ($allowOnlyGroup) {
1563
            $extraGroupCondition = " AND ip.to_group_id = $group_id ";
1564
        }
1565
1566
        if (api_is_allowed_to_edit(false, true) ||
1567
            ($allowUserEditSetting && !api_is_anonymous())
1568
        ) {
1569
            // A.1. you are a course admin with a USER filter
1570
            // => see only the messages of this specific user + the messages of the group (s)he is member of.
1571
1572
            //if (!empty($user_id)) {
1573
            if (0) {
1574
                if (is_array($group_memberships) &&
1575
                    count($group_memberships) > 0
1576
                ) {
1577
                    $sql = "SELECT $select
1578
                            FROM $tbl_announcement announcement 
1579
                            INNER JOIN $tbl_item_property ip
1580
                            ON (announcement.id = ip.ref AND ip.c_id = announcement.c_id)
1581
                            WHERE
1582
                                announcement.c_id = $courseId AND
1583
                                ip.c_id = $courseId AND                                
1584
                                ip.tool = 'announcement' AND
1585
                                (
1586
                                    ip.to_user_id = $user_id OR
1587
                                    ip.to_group_id IS NULL OR
1588
                                    ip.to_group_id IN (0, ".implode(", ", $group_memberships).")
1589
                                ) AND
1590
                                ip.visibility IN ('1', '0')
1591
                                $condition_session
1592
                                $searchCondition
1593
                            ORDER BY display_order DESC";
1594
                } else {
1595
                    $sql = "SELECT $select
1596
                            FROM $tbl_announcement announcement 
1597
                            INNER JOIN $tbl_item_property ip
1598
                            ON (announcement.id = ip.ref AND ip.c_id = announcement.c_id)
1599
                            WHERE
1600
                                announcement.c_id = $courseId AND
1601
                                ip.c_id = $courseId AND
1602
                                ip.tool ='announcement' AND
1603
                                (ip.to_user_id = $user_id OR ip.to_group_id='0' OR ip.to_group_id IS NULL) AND
1604
                                ip.visibility IN ('1', '0')
1605
                            $condition_session
1606
                            $searchCondition
1607
                            ORDER BY display_order DESC";
1608
                }
1609
            } elseif ($group_id != 0) {
1610
                // A.2. you are a course admin with a GROUP filter
1611
                // => see only the messages of this specific group
1612
                $sql = "SELECT $select
1613
                        FROM $tbl_announcement announcement 
1614
                        INNER JOIN $tbl_item_property ip
1615
                        ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1616
                        WHERE
1617
                            ip.tool='announcement' AND
1618
                            announcement.c_id = $courseId AND
1619
                            ip.c_id = $courseId AND
1620
                            ip.visibility<>'2' AND
1621
                            (ip.to_group_id = $group_id OR ip.to_group_id='0' OR ip.to_group_id IS NULL)
1622
                            $condition_session
1623
                            $searchCondition
1624
                            $extraGroupCondition
1625
                        $groupBy
1626
                        ORDER BY display_order DESC";
1627
            } else {
1628
                // A.3 you are a course admin without any group or user filter
1629
                // A.3.a you are a course admin without user or group filter but WITH studentview
1630
                // => see all the messages of all the users and groups without editing possibilities
1631
                if (isset($isStudentView) && $isStudentView == 'true') {
1632
                    $sql = "SELECT $select
1633
                            FROM $tbl_announcement announcement 
1634
                            INNER JOIN $tbl_item_property ip
1635
                            ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1636
                            WHERE
1637
                                ip.tool='announcement' AND
1638
                                announcement.c_id = $courseId AND
1639
                                ip.c_id = $courseId AND                                
1640
                                ip.visibility='1'
1641
                                $condition_session
1642
                                $searchCondition
1643
                            $groupBy
1644
                            ORDER BY display_order DESC";
1645
                } else {
1646
                    // A.3.a you are a course admin without user or group filter and WTIHOUT studentview (= the normal course admin view)
1647
                    // => see all the messages of all the users and groups with editing possibilities
1648
                    $sql = "SELECT $select
1649
                            FROM $tbl_announcement announcement 
1650
                            INNER JOIN $tbl_item_property ip
1651
                            ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1652
                            WHERE
1653
                                ip.tool = 'announcement' AND
1654
                                announcement.c_id = $courseId AND
1655
                                ip.c_id = $courseId  AND
1656
                                (ip.visibility='0' OR ip.visibility='1')
1657
                                $condition_session
1658
                                $searchCondition
1659
                            $groupBy
1660
                            ORDER BY display_order DESC";
1661
                }
1662
            }
1663
        } else {
1664
            // STUDENT
1665
            if (is_array($group_memberships) && count($group_memberships) > 0) {
1666
                if ($allowUserEditSetting && !api_is_anonymous()) {
1667
                    if ($group_id == 0) {
1668
                        // No group
1669
                        $cond_user_id = " AND (
1670
                            ip.lastedit_user_id = '".$user_id."' OR (
1671
                                (ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) OR
1672
                                (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships)."))
1673
                            )
1674
                        ) ";
1675
                    } else {
1676
                        $cond_user_id = " AND (
1677
                            ip.lastedit_user_id = '".$user_id."' OR ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".$group_id.")
1678
                        )";
1679
                        $cond_user_id .= $extraGroupCondition;
1680
                    }
1681
                } else {
1682
                    if ($group_id == 0) {
1683
                        $cond_user_id = " AND (
1684
                            (ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships)."))
1685
                        ) ";
1686
                    } else {
1687
                        $cond_user_id = " AND (
1688
                            (ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".$group_id."))
1689
                        )";
1690
                        $cond_user_id .= $extraGroupCondition;
1691
                    }
1692
                }
1693
1694
                $sql = "SELECT $select
1695
                        FROM $tbl_announcement announcement INNER JOIN
1696
                        $tbl_item_property ip
1697
                        ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1698
                        WHERE
1699
                            announcement.c_id = $courseId AND
1700
                            ip.c_id = $courseId AND                            
1701
                            ip.tool='announcement' 
1702
                            $cond_user_id
1703
                            $condition_session
1704
                            $searchCondition
1705
                            AND ip.visibility='1'
1706
                        $groupBy
1707
                        ORDER BY display_order DESC";
1708
            } else {
1709
                if ($user_id) {
1710
                    if ($allowUserEditSetting && !api_is_anonymous()) {
1711
                        $cond_user_id = " AND (
1712
                            ip.lastedit_user_id = '".api_get_user_id()."' OR
1713
                            ((ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND (ip.to_group_id='0' OR ip.to_group_id IS NULL))
1714
                        ) ";
1715
                    } else {
1716
                        $cond_user_id = " AND ((ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND (ip.to_group_id='0' OR ip.to_group_id IS NULL) ) ";
1717
                    }
1718
1719
                    $sql = "SELECT $select
1720
						FROM $tbl_announcement announcement 
1721
						INNER JOIN $tbl_item_property ip
1722
						ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1723
						WHERE
1724
    						announcement.c_id = $courseId AND
1725
							ip.c_id = $courseId AND    						
1726
    						ip.tool='announcement'
1727
    						$cond_user_id
1728
    						$condition_session
1729
    						$searchCondition
1730
    						AND ip.visibility='1'
1731
    						AND announcement.session_id IN(0, ".$session_id.")
1732
                        $groupBy
1733
						ORDER BY display_order DESC";
1734
                } else {
1735
                    if (($allowUserEditSetting && !api_is_anonymous())) {
1736
                        $cond_user_id = " AND (
1737
                            ip.lastedit_user_id = '".$user_id."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL
1738
                        )";
1739
                    } else {
1740
                        $cond_user_id = " AND ip.to_group_id='0' OR ip.to_group_id IS NULL ";
1741
                    }
1742
1743
                    $sql = "SELECT $select
1744
                            FROM $tbl_announcement announcement 
1745
                            INNER JOIN $tbl_item_property ip
1746
                            ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1747
                            WHERE
1748
                                announcement.c_id = $courseId AND
1749
                                ip.c_id = $courseId AND                            
1750
                                ip.tool='announcement'
1751
                                $cond_user_id
1752
                                $condition_session
1753
                                $searchCondition  AND
1754
                                ip.visibility='1' AND
1755
                                announcement.session_id IN ( 0,".api_get_session_id().")
1756
                            $groupBy
1757
                            ";
1758
                }
1759
            }
1760
        }
1761
1762
        if (!is_null($start) && !is_null($limit)) {
1763
            $start = intval($start);
1764
            $limit = intval($limit);
1765
            $sql .= " LIMIT $start, $limit";
1766
        }
1767
1768
        $result = Database::query($sql);
1769
        if ($getCount) {
1770
            $result = Database::fetch_array($result, 'ASSOC');
1771
1772
            return $result['count'];
1773
        }
1774
1775
        $iterator = 1;
1776
        $bottomAnnouncement = $announcement_number;
1777
        $displayed = [];
1778
        $results = [];
1779
        $actionUrl = api_get_path(WEB_CODE_PATH).'announcements/announcements.php?'.api_get_cidreq();
1780
        $emailIcon = '<i class="fa fa-envelope-o" title="'.get_lang('AnnounceSentByEmail').'"></i>';
1781
        $attachmentIcon = '<i class="fa fa-paperclip" title="'.get_lang('Attachment').'"></i>';
1782
1783
        $editIcon = Display::return_icon(
1784
            'edit.png',
1785
            get_lang('Edit'),
1786
            '',
1787
            ICON_SIZE_SMALL
1788
        );
1789
1790
        $deleteIcon = Display::return_icon(
1791
            'delete.png',
1792
            get_lang('Delete'),
1793
            '',
1794
            ICON_SIZE_SMALL
1795
        );
1796
1797
        $isTutor = false;
1798
        if (!empty($group_id)) {
1799
            $groupInfo = GroupManager::get_group_properties(api_get_group_id());
1800
            //User has access in the group?
1801
            $isTutor = GroupManager::is_tutor_of_group(
1802
                api_get_user_id(),
1803
                $groupInfo
1804
            );
1805
        }
1806
1807
        while ($row = Database::fetch_array($result, 'ASSOC')) {
1808
            if (!in_array($row['id'], $displayed)) {
1809
                $sent_to_icon = '';
1810
                // the email icon
1811
                if ($row['email_sent'] == '1') {
1812
                    $sent_to_icon = ' '.$emailIcon;
1813
                }
1814
                $groupReference = ($row['to_group_id'] > 0) ? ' <span class="label label-info">'.get_lang('Group').'</span> ' : '';
1815
                $title = $row['title'].$groupReference.$sent_to_icon;
1816
                $item_visibility = api_get_item_visibility(
1817
                    $courseInfo,
1818
                    TOOL_ANNOUNCEMENT,
1819
                    $row['id'],
1820
                    $session_id
1821
                );
1822
                $row['visibility'] = $item_visibility;
1823
1824
                // show attachment list
1825
                $attachment_list = self::get_attachment($row['id']);
1826
1827
                $attachment_icon = '';
1828
                if (count($attachment_list) > 0) {
1829
                    $attachment_icon = ' '.$attachmentIcon;
1830
                }
1831
1832
                /* TITLE */
1833
                $user_info = api_get_user_info($row['insert_user_id']);
1834
                $username = sprintf(get_lang("LoginX"), $user_info['username']);
1835
1836
                $username_span = Display::tag(
1837
                    'span',
1838
                    $user_info['complete_name'],
1839
                    ['title' => $username]
1840
                );
1841
1842
                $title = Display::url(
1843
                    $title.$attachment_icon,
1844
                    $actionUrl.'&action=view&id='.$row['id']
1845
                );
1846
1847
                // we can edit if : we are the teacher OR the element belongs to
1848
                // the session we are coaching OR the option to allow users to edit is on
1849
                if (api_is_allowed_to_edit(false, true) ||
1850
                    (api_is_session_general_coach() && api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $row['id'])) ||
1851
                    (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous()) ||
1852
                    ($row['to_group_id'] == $group_id && $isTutor)
1853
                ) {
1854
                    $modify_icons = "<a href=\"".$actionUrl."&action=modify&id=".$row['id']."\">".$editIcon."</a>";
1855
                    if ($row['visibility'] == 1) {
1856
                        $image_visibility = "visible";
1857
                        $alt_visibility = get_lang('Hide');
1858
                    } else {
1859
                        $image_visibility = "invisible";
1860
                        $alt_visibility = get_lang('Visible');
1861
                    }
1862
                    $modify_icons .= "<a href=\"".$actionUrl."&action=showhide&id=".$row['id']."&sec_token=".$stok."\">".
1863
                        Display::return_icon($image_visibility.'.png', $alt_visibility, '', ICON_SIZE_SMALL)."</a>";
1864
1865
                    // DISPLAY MOVE UP COMMAND only if it is not the top announcement
1866
                    if ($iterator != 1) {
1867
                        $modify_icons .= "<a href=\"".$actionUrl."&action=move&up=".$row["id"]."&sec_token=".$stok."\">".
1868
                            Display::return_icon('up.gif', get_lang('Up'))."</a>";
1869
                    } else {
1870
                        $modify_icons .= Display::return_icon('up_na.gif', get_lang('Up'));
1871
                    }
1872
                    if ($iterator < $bottomAnnouncement) {
1873
                        $modify_icons .= "<a href=\"".$actionUrl."&action=move&down=".$row["id"]."&sec_token=".$stok."\">".
1874
                            Display::return_icon('down.gif', get_lang('Down'))."</a>";
1875
                    } else {
1876
                        $modify_icons .= Display::return_icon('down_na.gif', get_lang('Down'));
1877
                    }
1878
                    if (api_is_allowed_to_edit(false, true)) {
1879
                        $modify_icons .= "<a href=\"".$actionUrl."&action=delete&id=".$row['id']."&sec_token=".$stok."\" onclick=\"javascript:if(!confirm('".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES, api_get_system_encoding()))."')) return false;\">".
1880
                            $deleteIcon."</a>";
1881
                    }
1882
                    $iterator++;
1883
                } else {
1884
                    $modify_icons = Display::url(
1885
                        Display::return_icon('default.png'),
1886
                        $actionUrl.'&action=view&id='.$row['id']
1887
                    );
1888
                }
1889
1890
                $announcement = [
1891
                    'id' => $row['id'],
1892
                    'title' => $title,
1893
                    'username' => $username_span,
1894
                    'insert_date' => api_convert_and_format_date(
1895
                        $row['insert_date'],
1896
                        DATE_TIME_FORMAT_LONG
1897
                    ),
1898
                    'lastedit_date' => api_convert_and_format_date(
1899
                        $row['lastedit_date'],
1900
                        DATE_TIME_FORMAT_LONG
1901
                    ),
1902
                    'actions' => $modify_icons,
1903
                ];
1904
1905
                $results[] = $announcement;
1906
            }
1907
            $displayed[] = $row['id'];
1908
        }
1909
1910
        return $results;
1911
    }
1912
1913
    /**
1914
     * @return int
1915
     */
1916
    public static function getNumberAnnouncements()
1917
    {
1918
        // Maximum title messages to display
1919
        $maximum = '12';
1920
        // Database Table Definitions
1921
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
1922
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
1923
1924
        $session_id = api_get_session_id();
1925
        $courseInfo = api_get_course_info();
1926
        $courseId = $courseInfo['real_id'];
1927
        $userId = api_get_user_id();
1928
        $condition_session = api_get_session_condition(
1929
            $session_id,
1930
            true,
1931
            true,
1932
            'announcement.session_id'
1933
        );
1934
1935
        if (api_is_allowed_to_edit(false, true)) {
1936
            // check teacher status
1937
            if (empty($_GET['origin']) || $_GET['origin'] !== 'learnpath') {
1938
                if (api_get_group_id() == 0) {
1939
                    $group_condition = '';
1940
                } else {
1941
                    $group_condition = " AND (ip.to_group_id='".api_get_group_id()."' OR ip.to_group_id = 0 OR ip.to_group_id IS NULL)";
1942
                }
1943
1944
                $sql = "SELECT 
1945
                            announcement.*, 
1946
                            ip.visibility, 
1947
                            ip.to_group_id, 
1948
                            ip.insert_user_id
1949
                        FROM $tbl_announcement announcement 
1950
                        INNER JOIN $tbl_item_property ip
1951
                        ON (announcement.c_id = ip.c_id AND announcement.id = ip.ref)
1952
                        WHERE
1953
                            announcement.c_id = $courseId AND
1954
                            ip.c_id = $courseId AND                    
1955
                            ip.tool = 'announcement' AND
1956
                            ip.visibility <> '2'
1957
                            $group_condition
1958
                            $condition_session
1959
                        GROUP BY ip.ref
1960
                        ORDER BY display_order DESC
1961
                        LIMIT 0, $maximum";
1962
            }
1963
        } else {
1964
            // students only get to see the visible announcements
1965
            if (empty($_GET['origin']) || $_GET['origin'] !== 'learnpath') {
1966
                $group_memberships = GroupManager::get_group_ids(
1967
                    $courseInfo['real_id'],
1968
                    $userId
1969
                );
1970
1971
                if ((api_get_course_setting('allow_user_edit_announcement') &&
1972
                    !api_is_anonymous())
1973
                ) {
1974
                    if (api_get_group_id() == 0) {
1975
                        $cond_user_id = " AND (
1976
                        ip.lastedit_user_id = '".$userId."' OR (
1977
                            ip.to_user_id='".$userId."' OR
1978
                            ip.to_group_id IN (0, ".implode(", ", $group_memberships).") OR
1979
                            ip.to_group_id IS NULL
1980
                            )
1981
                        )
1982
                        ";
1983
                    } else {
1984
                        $cond_user_id = " AND (
1985
                            ip.lastedit_user_id = '".$userId."'OR
1986
                            ip.to_group_id IN (0, ".api_get_group_id().") OR
1987
                            ip.to_group_id IS NULL
1988
                        )";
1989
                    }
1990
                } else {
1991
                    if (api_get_group_id() == 0) {
1992
                        $cond_user_id = " AND (
1993
                            ip.to_user_id='".$userId."' OR
1994
                            ip.to_group_id IN (0, ".implode(", ", $group_memberships).") OR
1995
                            ip.to_group_id IS NULL
1996
                        ) ";
1997
                    } else {
1998
                        $cond_user_id = " AND (
1999
                            ip.to_user_id='".$userId."' OR
2000
                            ip.to_group_id IN (0, ".api_get_group_id().") OR
2001
                            ip.to_group_id IS NULL
2002
                        ) ";
2003
                    }
2004
                }
2005
2006
                // the user is member of several groups => display personal announcements AND
2007
                // his group announcements AND the general announcements
2008
                if (is_array($group_memberships) && count($group_memberships) > 0) {
2009
                    $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
2010
                            FROM $tbl_announcement announcement 
2011
                            INNER JOIN $tbl_item_property ip
2012
                            ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
2013
                            WHERE
2014
                                announcement.c_id = $courseId AND
2015
                                ip.c_id = $courseId AND                                
2016
                                ip.tool='announcement' AND 
2017
                                ip.visibility='1'
2018
                                $cond_user_id
2019
                                $condition_session
2020
                            GROUP BY ip.ref
2021
                            ORDER BY display_order DESC
2022
                            LIMIT 0, $maximum";
2023
                } else {
2024
                    // the user is not member of any group
2025
                    // this is an identified user => show the general announcements AND his personal announcements
2026
                    if ($userId) {
2027
                        if ((api_get_course_setting('allow_user_edit_announcement') &&
2028
                            !api_is_anonymous())
2029
                        ) {
2030
                            $cond_user_id = " AND (
2031
                                ip.lastedit_user_id = '".$userId."' OR
2032
                                ( ip.to_user_id='".$userId."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL)
2033
                            ) ";
2034
                        } else {
2035
                            $cond_user_id = " AND ( ip.to_user_id='".$userId."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL) ";
2036
                        }
2037
                        $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
2038
                                FROM $tbl_announcement announcement 
2039
                                INNER JOIN $tbl_item_property ip
2040
                                ON (announcement.c_id = ip.c_id AND announcement.id = ip.ref)
2041
                                WHERE
2042
                                    announcement.c_id = $courseId AND
2043
                                    ip.c_id = $courseId AND 
2044
                                    ip.tool='announcement' AND 
2045
                                    ip.visibility='1'
2046
                                    $cond_user_id
2047
                                    $condition_session
2048
                                GROUP BY ip.ref
2049
                                ORDER BY display_order DESC
2050
                                LIMIT 0, $maximum";
2051
                    } else {
2052
                        if (api_get_course_setting('allow_user_edit_announcement')) {
2053
                            $cond_user_id = " AND (
2054
                                ip.lastedit_user_id = '".api_get_user_id()."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL
2055
                            ) ";
2056
                        } else {
2057
                            $cond_user_id = " AND ip.to_group_id='0' ";
2058
                        }
2059
2060
                        // the user is not identiefied => show only the general announcements
2061
                        $sql = "SELECT 
2062
                                    announcement.*, 
2063
                                    ip.visibility, 
2064
                                    ip.to_group_id, 
2065
                                    ip.insert_user_id
2066
                                FROM $tbl_announcement announcement 
2067
                                INNER JOIN $tbl_item_property ip
2068
                                ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
2069
                                WHERE
2070
                                    announcement.c_id = $courseId AND
2071
                                    ip.c_id = $courseId AND 
2072
                                    ip.tool='announcement' AND 
2073
                                    ip.visibility='1' AND 
2074
                                    ip.to_group_id='0'
2075
                                    $condition_session
2076
                                GROUP BY ip.ref
2077
                                ORDER BY display_order DESC
2078
                                LIMIT 0, $maximum";
2079
                    }
2080
                }
2081
            }
2082
        }
2083
2084
        $result = Database::query($sql);
2085
2086
        return Database::num_rows($result);
2087
    }
2088
}
2089