Passed
Pull Request — 1.11.x (#4094)
by Angel Fernando Quiroz
11:24
created

AnnouncementManager::add_announcement()   D

Complexity

Conditions 19
Paths 86

Size

Total Lines 129
Code Lines 79

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 79
nc 86
nop 10
dl 0
loc 129
c 0
b 0
f 0
cc 19
rs 4.5166

How to fix   Long Method    Complexity    Many Parameters   

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:

Many Parameters

Methods with many parameters are not only hard to understand, but their parameters also often become inconsistent when you need more, or different data.

There are several approaches to avoid long parameter lists:

1
<?php
2
/* For licensing terms, see /license.txt */
3
4
use Chamilo\CoreBundle\Entity\ExtraField as ExtraFieldEntity;
5
use Chamilo\CoreBundle\Entity\ExtraFieldValues;
6
use Chamilo\CourseBundle\Entity\CAnnouncement;
7
use Chamilo\CourseBundle\Entity\CCalendarEvent;
8
use Chamilo\CourseBundle\Entity\CItemProperty;
9
10
/**
11
 * Include file with functions for the announcements module.
12
 *
13
 * @author jmontoya
14
 *
15
 * @package chamilo.announcements
16
 *
17
 * @todo use OOP
18
 */
19
class AnnouncementManager
20
{
21
    /**
22
     * Constructor.
23
     */
24
    public function __construct()
25
    {
26
    }
27
28
    /**
29
     * @return array
30
     */
31
    public static function getTags()
32
    {
33
        $tags = [
34
            '((user_name))',
35
            '((user_email))',
36
            '((user_firstname))',
37
            '((user_lastname))',
38
            '((user_official_code))',
39
            '((course_title))',
40
            '((course_link))',
41
        ];
42
43
        $tags[] = '((teachers))';
44
45
        $extraField = new ExtraField('user');
46
        $extraFields = $extraField->get_all(['filter = ?' => 1]);
47
        if (!empty($extraFields)) {
48
            foreach ($extraFields as $extra) {
49
                $tags[] = "((extra_".$extra['variable']."))";
50
            }
51
        }
52
        $sessionId = api_get_session_id();
53
        if (!empty($sessionId)) {
54
            $tags[] = '((coaches))';
55
            $tags[] = '((general_coach))';
56
            $tags[] = '((general_coach_email))';
57
        }
58
59
        return $tags;
60
    }
61
62
    /**
63
     * @param int    $userId
64
     * @param string $content
65
     * @param string $courseCode
66
     * @param int    $sessionId
67
     *
68
     * @return string
69
     */
70
    public static function parseContent(
71
        $userId,
72
        $content,
73
        $courseCode,
74
        $sessionId = 0
75
    ) {
76
        $readerInfo = api_get_user_info($userId, false, false, true, true, false, true);
77
        $courseInfo = api_get_course_info($courseCode);
78
        $teacherList = '';
79
        if ($courseInfo) {
80
            $teacherList = CourseManager::getTeacherListFromCourseCodeToString($courseInfo['code']);
81
        }
82
        $generalCoachName = '';
83
        $generalCoachEmail = '';
84
        $coaches = '';
85
        if (!empty($sessionId)) {
86
            $sessionInfo = api_get_session_info($sessionId);
87
            $coaches = CourseManager::get_coachs_from_course_to_string(
88
                $sessionId,
89
                $courseInfo['real_id']
90
            );
91
92
            $generalCoach = api_get_user_info($sessionInfo['id_coach']);
93
            $generalCoachName = $generalCoach['complete_name'];
94
            $generalCoachEmail = $generalCoach['email'];
95
        }
96
97
        $data = [];
98
        $data['user_name'] = '';
99
        $data['user_firstname'] = '';
100
        $data['user_lastname'] = '';
101
        $data['user_official_code'] = '';
102
        $data['user_email'] = '';
103
        if (!empty($readerInfo)) {
104
            $data['user_name'] = $readerInfo['username'];
105
            $data['user_email'] = $readerInfo['email'];
106
            $data['user_firstname'] = $readerInfo['firstname'];
107
            $data['user_lastname'] = $readerInfo['lastname'];
108
            $data['user_official_code'] = $readerInfo['official_code'];
109
        }
110
111
        $data['course_title'] = $courseInfo['name'] ?? '';
112
        $courseLink = api_get_course_url($courseCode, $sessionId);
113
        $data['course_link'] = Display::url($courseLink, $courseLink);
114
        $data['teachers'] = $teacherList;
115
116
        if (!empty($readerInfo)) {
117
            $extraField = new ExtraField('user');
118
            $extraFields = $extraField->get_all(['filter = ?' => 1]);
119
            if (!empty($extraFields)) {
120
                foreach ($extraFields as $extra) {
121
                    $data['extra_'.$extra['variable']] = '';
122
                }
123
            }
124
125
            if (!empty($readerInfo['extra'])) {
126
                foreach ($readerInfo['extra'] as $extra) {
127
                    if (isset($extra['value'])) {
128
                        /** @var \Chamilo\CoreBundle\Entity\ExtraFieldValues $value */
129
                        $value = $extra['value'];
130
                        if ($value instanceof ExtraFieldValues) {
131
                            $field = $value->getField();
132
                            if ($field instanceof ExtraFieldEntity) {
133
                                $data['extra_'.$field->getVariable()] = $value->getValue();
134
                            }
135
                        }
136
                    }
137
                }
138
            }
139
        }
140
141
        if (!empty($sessionId)) {
142
            $data['coaches'] = $coaches;
143
            $data['general_coach'] = $generalCoachName;
144
            $data['general_coach_email'] = $generalCoachEmail;
145
        }
146
147
        $tags = self::getTags();
148
        foreach ($tags as $tag) {
149
            $simpleTag = str_replace(['((', '))'], '', $tag);
150
            $value = isset($data[$simpleTag]) ? $data[$simpleTag] : '';
151
            $content = str_replace($tag, $value, $content);
152
        }
153
154
        return $content;
155
    }
156
157
    /**
158
     * Gets all announcements from a course.
159
     *
160
     * @param array $course_info
161
     * @param int   $session_id
162
     *
163
     * @return array html with the content and count of announcements or false otherwise
164
     */
165
    public static function get_all_annoucement_by_course($course_info, $session_id = 0)
166
    {
167
        $session_id = (int) $session_id;
168
        $courseId = $course_info['real_id'];
169
170
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
171
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
172
173
        $sql = "SELECT DISTINCT
174
                    announcement.id,
175
                    announcement.title,
176
                    announcement.content
177
				FROM $tbl_announcement announcement
178
				INNER JOIN $tbl_item_property i
179
				ON (announcement.id = i.ref AND announcement.c_id = i.c_id)
180
				WHERE
181
                    i.tool='announcement' AND
182
                    announcement.session_id  = '$session_id' AND
183
                    announcement.c_id = $courseId AND
184
                    i.c_id = $courseId
185
				ORDER BY display_order DESC";
186
        $rs = Database::query($sql);
187
        $num_rows = Database::num_rows($rs);
188
        if ($num_rows > 0) {
189
            $list = [];
190
            while ($row = Database::fetch_array($rs)) {
191
                $list[] = $row;
192
            }
193
194
            return $list;
195
        }
196
197
        return false;
198
    }
199
200
    /**
201
     * This functions switches the visibility a course resource
202
     * using the visibility field in 'item_property'.
203
     *
204
     * @param array $courseInfo
205
     * @param int   $id         ID of the element of the corresponding type
206
     *
207
     * @return bool False on failure, True on success
208
     */
209
    public static function change_visibility_announcement($courseInfo, $id)
210
    {
211
        $session_id = api_get_session_id();
212
        $item_visibility = api_get_item_visibility(
213
            $courseInfo,
214
            TOOL_ANNOUNCEMENT,
215
            $id,
216
            $session_id
217
        );
218
        if ($item_visibility == '1') {
219
            api_item_property_update(
220
                $courseInfo,
221
                TOOL_ANNOUNCEMENT,
222
                $id,
223
                'invisible',
224
                api_get_user_id()
225
            );
226
        } else {
227
            api_item_property_update(
228
                $courseInfo,
229
                TOOL_ANNOUNCEMENT,
230
                $id,
231
                'visible',
232
                api_get_user_id()
233
            );
234
        }
235
236
        return true;
237
    }
238
239
    /**
240
     * Deletes an announcement.
241
     *
242
     * @param array $courseInfo the course array
243
     * @param int   $id         the announcement id
244
     */
245
    public static function delete_announcement($courseInfo, $id)
246
    {
247
        api_item_property_update(
248
            $courseInfo,
249
            TOOL_ANNOUNCEMENT,
250
            $id,
251
            'delete',
252
            api_get_user_id()
253
        );
254
    }
255
256
    /**
257
     * Deletes all announcements by course.
258
     *
259
     * @param array $courseInfo the course array
260
     */
261
    public static function delete_all_announcements($courseInfo)
262
    {
263
        $announcements = self::get_all_annoucement_by_course(
264
            $courseInfo,
265
            api_get_session_id()
266
        );
267
        if (!empty($announcements)) {
268
            foreach ($announcements as $annon) {
269
                api_item_property_update(
270
                    $courseInfo,
271
                    TOOL_ANNOUNCEMENT,
272
                    $annon['id'],
273
                    'delete',
274
                    api_get_user_id()
275
                );
276
            }
277
        }
278
    }
279
280
    /**
281
     * @param string $title
282
     * @param int    $courseId
283
     * @param int    $sessionId
284
     * @param int    $visibility 1 or 0
285
     *
286
     * @return mixed
287
     */
288
    public static function getAnnouncementsByTitle(
289
        $title,
290
        $courseId,
291
        $sessionId = 0,
292
        $visibility = 1
293
    ) {
294
        $dql = "SELECT a
295
                FROM ChamiloCourseBundle:CAnnouncement a
296
                JOIN ChamiloCourseBundle:CItemProperty ip
297
                WITH a.id = ip.ref AND a.cId = ip.course
298
                WHERE
299
                    ip.tool = 'announcement' AND
300
                    a.cId = :course AND
301
                    a.sessionId = :session AND
302
                    a.title like :title AND
303
                    ip.visibility = :visibility
304
                ORDER BY a.displayOrder DESC";
305
306
        $qb = Database::getManager()->createQuery($dql);
307
        $result = $qb->execute(
308
            [
309
                'course' => $courseId,
310
                'session' => $sessionId,
311
                'visibility' => $visibility,
312
                'title' => "%$title%",
313
            ]
314
        );
315
316
        return $result;
317
    }
318
319
    /**
320
     * @param int $announcementId
321
     * @param int $courseId
322
     * @param int $userId
323
     * @param int $groupId
324
     *
325
     * @return array
326
     */
327
    public static function getAnnouncementInfoById(
328
        $announcementId,
329
        $courseId,
330
        $userId,
331
        $groupId = 0
332
    ) {
333
        $announcementId = (int) $announcementId;
334
        $courseId = (int) $courseId;
335
        $userId = (int) $userId;
336
        $groupId = (int) $groupId;
337
338
        if (api_is_allowed_to_edit(false, true) ||
339
            (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())
340
        ) {
341
            $dql = "SELECT a, ip
342
                    FROM ChamiloCourseBundle:CAnnouncement a
343
                    JOIN ChamiloCourseBundle:CItemProperty ip
344
                    WITH a.id = ip.ref AND a.cId = ip.course
345
                    WHERE
346
                        a.id = :announcement AND
347
                        ip.tool = 'announcement' AND
348
                        a.cId = :course
349
                    ORDER BY a.displayOrder DESC";
350
        } else {
351
            $groupList[] = $groupId;
352
353
            if (api_get_user_id() != 0) {
354
                $extraGroupCondition = '';
355
                if (!empty($groupId)) {
356
                    $groupProperties = GroupManager::get_group_properties($groupId);
357
                    if ($groupProperties['announcements_state'] == GroupManager::TOOL_PRIVATE_BETWEEN_USERS) {
358
                        $extraGroupCondition = " AND (
359
                            ip.toUser = $userId AND ip.group = $groupId OR
360
                            (ip.group IN ('0') OR ip.group IS NULL) OR
361
                            (ip.group = $groupId AND (ip.toUser IS NULL OR ip.toUser = 0))
362
                        )";
363
                    }
364
                }
365
366
                $dql = "SELECT a, ip
367
                        FROM ChamiloCourseBundle:CAnnouncement a
368
                        JOIN ChamiloCourseBundle:CItemProperty ip
369
                        WITH a.id = ip.ref AND a.cId = ip.course
370
                        WHERE
371
                            a.id = :announcement AND
372
                            ip.tool='announcement' AND
373
                            (
374
                                ip.toUser = $userId OR
375
                                ip.group IN ('0', '".$groupId."') OR
376
                                ip.group IS NULL
377
                            ) AND
378
                            ip.visibility = '1' AND
379
                            ip.course = :course
380
                            $extraGroupCondition
381
                        ORDER BY a.displayOrder DESC";
382
            } else {
383
                $dql = "SELECT a, ip
384
                        FROM ChamiloCourseBundle:CAnnouncement a
385
                        JOIN ChamiloCourseBundle:CItemProperty ip
386
                        WITH a.id = ip.ref AND a.cId = ip.course
387
                        WHERE
388
                            a.id = :announcement AND
389
                            ip.tool = 'announcement' AND
390
                            (ip.group = '0' OR ip.group IS NULL) AND
391
                            ip.visibility = '1' AND
392
                            ip.course = :course";
393
            }
394
        }
395
396
        $qb = Database::getManager()->createQuery($dql);
397
        $result = $qb->execute(
398
            [
399
                'announcement' => $announcementId,
400
                'course' => $courseId,
401
            ]
402
        );
403
404
        if (!empty($result)) {
405
            return [
406
                'announcement' => $result[0],
407
                'item_property' => $result[1],
408
            ];
409
        }
410
411
        return [];
412
    }
413
414
    /**
415
     * Displays one specific announcement.
416
     *
417
     * @param int $id the id of the announcement you want to display
418
     *
419
     * @return string
420
     */
421
    public static function displayAnnouncement($id)
422
    {
423
        $id = (int) $id;
424
425
        if (empty($id)) {
426
            return '';
427
        }
428
429
        global $charset;
430
431
        $html = '';
432
        $result = self::getAnnouncementInfoById(
433
            $id,
434
            api_get_course_int_id(),
435
            api_get_user_id(),
436
            api_get_group_id()
437
        );
438
439
        if (empty($result)) {
440
            return '';
441
        }
442
443
        /** @var CAnnouncement $announcement */
444
        $announcement = $result['announcement'];
445
        /** @var CItemProperty $itemProperty */
446
        $itemProperty = $result['item_property'];
447
448
        if (empty($announcement) || empty($itemProperty)) {
449
            return '';
450
        }
451
452
        $title = Security::remove_XSS($announcement->getTitle());
453
        $content = $announcement->getContent();
454
455
        $html .= "<table height=\"100\" width=\"100%\" cellpadding=\"5\" cellspacing=\"0\" class=\"table table-hover table-striped data_table\">";
456
        $html .= "<tr><td><h2>".$title."</h2></td></tr>";
457
458
        if (api_is_allowed_to_edit(false, true) ||
459
            (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous())
460
        ) {
461
            $modify_icons = "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=modify&id=".$id."\">".
462
                Display::return_icon('edit.png', get_lang('Edit'), '', ICON_SIZE_SMALL)."</a>";
463
464
            $image_visibility = 'invisible';
465
            $alt_visibility = get_lang('Visible');
466
            if ($itemProperty->getVisibility() === 1) {
467
                $image_visibility = 'visible';
468
                $alt_visibility = get_lang('Hide');
469
            }
470
            global $stok;
471
            $modify_icons .= "<a href=\"".api_get_self()."?".api_get_cidreq()."&action=showhide&id=".$id."&sec_token=".$stok."\">".
472
                Display::return_icon($image_visibility.'.png', $alt_visibility, '', ICON_SIZE_SMALL)."</a>";
473
474
            if (api_is_allowed_to_edit(false, true)) {
475
                $modify_icons .= "<a 
476
                    href=\"".api_get_self()."?".api_get_cidreq()."&action=delete&id=".$id."&sec_token=".$stok."\" 
477
                    onclick=\"javascript:if(!confirm('".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES, $charset))."')) return false;\">".
478
                    Display::return_icon('delete.png', get_lang('Delete'), '', ICON_SIZE_SMALL).
479
                    "</a>";
480
            }
481
            $html .= "<tr><th style='text-align:right'>$modify_icons</th></tr>";
482
        }
483
484
        // The user id is always the current one.
485
        $toUserId = api_get_user_id();
486
        $content = Security::remove_XSS(self::parseContent(
487
            $toUserId,
488
            $content,
489
            api_get_course_id(),
490
            api_get_session_id()
491
        ));
492
493
        $html .= "<tr><td>$content</td></tr>";
494
        $html .= "<tr>";
495
        $html .= "<td class=\"announcements_datum\">".get_lang('LastUpdateDate')." : ";
496
        $lastEdit = $itemProperty->getLasteditDate();
497
        $html .= Display::dateToStringAgoAndLongDate($lastEdit);
498
        $html .= "</td></tr>";
499
500
        $allow = !api_get_configuration_value('hide_announcement_sent_to_users_info');
501
        if ($allow && api_is_allowed_to_edit(false, true)) {
502
            $sent_to = self::sent_to('announcement', $id);
503
            $sentToForm = self::sent_to_form($sent_to);
504
            $html .= Display::tag(
505
                'td',
506
                get_lang('SentTo').': '.$sentToForm,
507
                ['class' => 'announcements_datum']
508
            );
509
        }
510
        $attachment_list = self::get_attachment($id);
511
512
        if (count($attachment_list) > 0) {
513
            $html .= "<tr><td>";
514
            $realname = $attachment_list['path'];
515
            $user_filename = $attachment_list['filename'];
516
            $full_file_name = 'download.php?'.api_get_cidreq().'&file='.$realname;
517
            $html .= '<br/>';
518
            $html .= Display::return_icon('attachment.gif', get_lang('Attachment'));
519
            $html .= '<a href="'.$full_file_name.' "> '.$user_filename.' </a>';
520
            $html .= ' - <span class="forum_attach_comment" >'.Security::remove_XSS($attachment_list['comment']).'</span>';
521
            if (api_is_allowed_to_edit(false, true)) {
522
                $url = api_get_self()."?".api_get_cidreq().
523
                    "&action=delete_attachment&id_attach=".$attachment_list['id']."&sec_token=".$stok;
524
                $html .= Display::url(
525
                    Display::return_icon(
526
                        'delete.png',
527
                        get_lang('Delete'),
528
                        '',
529
                        16
530
                    ),
531
                    $url
532
                );
533
            }
534
            $html .= '</td></tr>';
535
        }
536
        $html .= '</table>';
537
538
        return $html;
539
    }
540
541
    /**
542
     * @param array $courseInfo
543
     *
544
     * @return int
545
     */
546
    public static function getLastAnnouncementOrder($courseInfo)
547
    {
548
        if (empty($courseInfo)) {
549
            return 0;
550
        }
551
552
        if (!isset($courseInfo['real_id'])) {
553
            return false;
554
        }
555
556
        $courseId = $courseInfo['real_id'];
557
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT);
558
        $sql = "SELECT MAX(display_order)
559
                FROM $table
560
                WHERE c_id = $courseId ";
561
        $result = Database::query($sql);
562
563
        $order = 0;
564
        if (Database::num_rows($result)) {
565
            $row = Database::fetch_array($result);
566
            $order = (int) $row[0] + 1;
567
        }
568
569
        return $order;
570
    }
571
572
    /**
573
     * Store an announcement in the database (including its attached file if any).
574
     *
575
     * @param array  $courseInfo
576
     * @param int    $sessionId
577
     * @param string $title                Announcement title (pure text)
578
     * @param string $newContent           Content of the announcement (can be HTML)
579
     * @param array  $sentTo               Array of users and groups to send the announcement to
580
     * @param array  $file                 uploaded file $_FILES
581
     * @param string $file_comment         Comment describing the attachment
582
     * @param string $end_date
583
     * @param bool   $sendToUsersInSession
584
     * @param int    $authorId
585
     *
586
     * @return int false on failure, ID of the announcement on success
587
     */
588
    public static function add_announcement(
589
        $courseInfo,
590
        $sessionId,
591
        $title,
592
        $newContent,
593
        $sentTo,
594
        $file = [],
595
        $file_comment = null,
596
        $end_date = null,
597
        $sendToUsersInSession = false,
598
        $authorId = 0
599
    ) {
600
        if (empty($courseInfo)) {
601
            return false;
602
        }
603
604
        if (!isset($courseInfo['real_id'])) {
605
            return false;
606
        }
607
608
        $courseId = $courseInfo['real_id'];
609
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
610
        $authorId = empty($authorId) ? api_get_user_id() : $authorId;
611
612
        if (empty($end_date)) {
613
            $end_date = api_get_utc_datetime();
614
        }
615
616
        $order = self::getLastAnnouncementOrder($courseInfo);
617
618
        // store in the table announcement
619
        $params = [
620
            'c_id' => $courseId,
621
            'content' => $newContent,
622
            'title' => $title,
623
            'end_date' => $end_date,
624
            'display_order' => $order,
625
            'session_id' => (int) $sessionId,
626
        ];
627
628
        $last_id = Database::insert($tbl_announcement, $params);
629
630
        if (empty($last_id)) {
631
            return false;
632
        } else {
633
            $sql = "UPDATE $tbl_announcement SET id = iid WHERE iid = $last_id";
634
            Database::query($sql);
635
636
            if (!empty($file)) {
637
                self::add_announcement_attachment_file(
638
                    $last_id,
639
                    $file_comment,
640
                    $_FILES['user_upload']
641
                );
642
            }
643
644
            // store in item_property (first the groups, then the users
645
            if (empty($sentTo) ||
646
                (!empty($sentTo) && isset($sentTo[0]) && $sentTo[0] == 'everyone')
647
            ) {
648
                // The message is sent to EVERYONE, so we set the group to 0
649
                api_item_property_update(
650
                    $courseInfo,
651
                    TOOL_ANNOUNCEMENT,
652
                    $last_id,
653
                    'AnnouncementAdded',
654
                    $authorId,
655
                    '0',
656
                    null,
657
                    null,
658
                    null,
659
                    $sessionId
660
                );
661
            } else {
662
                $send_to = CourseManager::separateUsersGroups($sentTo);
663
                $batchSize = 20;
664
                $em = Database::getManager();
665
                // Storing the selected groups
666
                if (is_array($send_to['groups']) &&
667
                    !empty($send_to['groups'])
668
                ) {
669
                    $counter = 1;
670
                    foreach ($send_to['groups'] as $group) {
671
                        $groupInfo = GroupManager::get_group_properties($group);
672
                        api_item_property_update(
673
                            $courseInfo,
674
                            TOOL_ANNOUNCEMENT,
675
                            $last_id,
676
                            'AnnouncementAdded',
677
                            $authorId,
678
                            $groupInfo
679
                        );
680
681
                        if (($counter % $batchSize) === 0) {
682
                            $em->flush();
683
                            $em->clear();
684
                        }
685
                        $counter++;
686
                    }
687
                }
688
689
                // Storing the selected users
690
                if (is_array($send_to['users'])) {
691
                    $counter = 1;
692
                    foreach ($send_to['users'] as $user) {
693
                        api_item_property_update(
694
                            $courseInfo,
695
                            TOOL_ANNOUNCEMENT,
696
                            $last_id,
697
                            'AnnouncementAdded',
698
                            $authorId,
699
                            '',
700
                            $user
701
                        );
702
703
                        if (($counter % $batchSize) === 0) {
704
                            $em->flush();
705
                            $em->clear();
706
                        }
707
                        $counter++;
708
                    }
709
                }
710
            }
711
712
            if ($sendToUsersInSession) {
713
                self::addAnnouncementToAllUsersInSessions($last_id);
714
            }
715
716
            return $last_id;
717
        }
718
    }
719
720
    /**
721
     * @param string $title
722
     * @param string $newContent
723
     * @param int    $groupId
724
     * @param array  $to_users
725
     * @param array  $file
726
     * @param string $file_comment
727
     * @param bool   $sendToUsersInSession
728
     *
729
     * @return bool|int
730
     */
731
    public static function addGroupAnnouncement(
732
        $title,
733
        $newContent,
734
        $groupId,
735
        $to_users,
736
        $file = [],
737
        $file_comment = '',
738
        $sendToUsersInSession = false
739
    ) {
740
        $courseInfo = api_get_course_info();
741
742
        // Database definitions
743
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT);
744
        $order = self::getLastAnnouncementOrder($courseInfo);
745
746
        $now = api_get_utc_datetime();
747
        $courseId = api_get_course_int_id();
748
749
        // store in the table announcement
750
        $params = [
751
            'c_id' => $courseId,
752
            'content' => $newContent,
753
            'title' => $title,
754
            'end_date' => $now,
755
            'display_order' => $order,
756
            'session_id' => api_get_session_id(),
757
        ];
758
759
        $last_id = Database::insert($table, $params);
760
761
        // Store the attach file
762
        if ($last_id) {
763
            $sql = "UPDATE $table SET id = iid
764
                    WHERE iid = $last_id";
765
            Database::query($sql);
766
767
            if (!empty($file)) {
768
                self::add_announcement_attachment_file(
769
                    $last_id,
770
                    $file_comment,
771
                    $file
772
                );
773
            }
774
775
            $send_to_users = CourseManager::separateUsersGroups($to_users);
776
777
            // if nothing was selected in the menu then send to all the group
778
            $sentToAllGroup = false;
779
            if (empty($send_to_users['groups']) && empty($send_to_users['users'])) {
780
                $groupInfo = GroupManager::get_group_properties($groupId);
781
                api_item_property_update(
782
                    $courseInfo,
783
                    TOOL_ANNOUNCEMENT,
784
                    $last_id,
785
                    'AnnouncementAdded',
786
                    api_get_user_id(),
787
                    $groupInfo
788
                );
789
                $sentToAllGroup = true;
790
            }
791
792
            if ($sentToAllGroup === false) {
793
                if (!empty($send_to_users['groups'])) {
794
                    foreach ($send_to_users['groups'] as $group) {
795
                        $groupInfo = GroupManager::get_group_properties($group);
796
                        api_item_property_update(
797
                            $courseInfo,
798
                            TOOL_ANNOUNCEMENT,
799
                            $last_id,
800
                            'AnnouncementAdded',
801
                            api_get_user_id(),
802
                            $groupInfo
803
                        );
804
                    }
805
                }
806
807
                $groupInfo = GroupManager::get_group_properties($groupId);
808
                if (!empty($send_to_users['users'])) {
809
                    foreach ($send_to_users['users'] as $user) {
810
                        api_item_property_update(
811
                            $courseInfo,
812
                            TOOL_ANNOUNCEMENT,
813
                            $last_id,
814
                            'AnnouncementAdded',
815
                            api_get_user_id(),
816
                            $groupInfo,
817
                            $user
818
                        );
819
                    }
820
                }
821
            }
822
823
            if ($sendToUsersInSession) {
824
                self::addAnnouncementToAllUsersInSessions($last_id);
825
            }
826
        }
827
828
        return $last_id;
829
    }
830
831
    /**
832
     * This function stores the announcement item in the announcement table
833
     * and updates the item_property table.
834
     *
835
     * @param int    $id                   id of the announcement
836
     * @param string $title
837
     * @param string $newContent
838
     * @param array  $to                   users that will receive the announcement
839
     * @param mixed  $file                 attachment
840
     * @param string $file_comment         file comment
841
     * @param bool   $sendToUsersInSession
842
     */
843
    public static function edit_announcement(
844
        $id,
845
        $title,
846
        $newContent,
847
        $to,
848
        $file = [],
849
        $file_comment = '',
850
        $sendToUsersInSession = false
851
    ) {
852
        $courseInfo = api_get_course_info();
853
        $courseId = api_get_course_int_id();
854
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
855
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT);
856
        $id = (int) $id;
857
858
        $params = [
859
            'title' => $title,
860
            'content' => $newContent,
861
        ];
862
863
        Database::update(
864
            $table,
865
            $params,
866
            ['c_id = ? AND id = ?' => [$courseId, $id]]
867
        );
868
869
        // save attachment file
870
        $row_attach = self::get_attachment($id);
871
872
        $id_attach = 0;
873
        if ($row_attach) {
874
            $id_attach = (int) $row_attach['id'];
875
        }
876
877
        if (!empty($file)) {
878
            if (empty($id_attach)) {
879
                self::add_announcement_attachment_file(
880
                    $id,
881
                    $file_comment,
882
                    $file
883
                );
884
            } else {
885
                self::edit_announcement_attachment_file(
886
                    $id_attach,
887
                    $file,
888
                    $file_comment
889
                );
890
            }
891
        }
892
893
        // We remove everything from item_property for this
894
        $sql = "DELETE FROM $tbl_item_property
895
                WHERE c_id = $courseId AND ref='$id' AND tool='announcement'";
896
        Database::query($sql);
897
898
        if ($sendToUsersInSession) {
899
            self::addAnnouncementToAllUsersInSessions($id);
900
        }
901
902
        // store in item_property (first the groups, then the users
903
        if (!empty($to)) {
904
            // !is_null($to): when no user is selected we send it to everyone
905
            $send_to = CourseManager::separateUsersGroups($to);
906
907
            // storing the selected groups
908
            if (is_array($send_to['groups'])) {
909
                foreach ($send_to['groups'] as $group) {
910
                    $groupInfo = GroupManager::get_group_properties($group);
911
                    if (empty($groupInfo)) {
912
                        // Probably the group id and iid are different try checking the iid
913
                        $groupInfo = GroupManager::get_group_properties($group, true);
914
                    }
915
                    if ($groupInfo) {
916
                        api_item_property_update(
917
                            $courseInfo,
918
                            TOOL_ANNOUNCEMENT,
919
                            $id,
920
                            'AnnouncementUpdated',
921
                            api_get_user_id(),
922
                            $groupInfo
923
                        );
924
                    }
925
                }
926
            }
927
928
            // storing the selected users
929
            if (is_array($send_to['users'])) {
930
                foreach ($send_to['users'] as $user) {
931
                    api_item_property_update(
932
                        $courseInfo,
933
                        TOOL_ANNOUNCEMENT,
934
                        $id,
935
                        'AnnouncementUpdated',
936
                        api_get_user_id(),
937
                        0,
938
                        $user
939
                    );
940
                }
941
            }
942
943
            // Send to everyone
944
            if (isset($to[0]) && $to[0] === 'everyone') {
945
                api_item_property_update(
946
                    $courseInfo,
947
                    TOOL_ANNOUNCEMENT,
948
                    $id,
949
                    'AnnouncementUpdated',
950
                    api_get_user_id(),
951
                    0
952
                );
953
            }
954
        } else {
955
            // the message is sent to everyone, so we set the group to 0
956
            api_item_property_update(
957
                $courseInfo,
958
                TOOL_ANNOUNCEMENT,
959
                $id,
960
                'AnnouncementUpdated',
961
                api_get_user_id(),
962
                0
963
            );
964
        }
965
    }
966
967
    /**
968
     * @param int $announcementId
969
     */
970
    public static function addAnnouncementToAllUsersInSessions($announcementId)
971
    {
972
        $courseCode = api_get_course_id();
973
        $courseInfo = api_get_course_info();
974
        $sessionList = SessionManager::get_session_by_course(api_get_course_int_id());
975
976
        if (!empty($sessionList)) {
977
            foreach ($sessionList as $sessionInfo) {
978
                $sessionId = $sessionInfo['id'];
979
                $userList = CourseManager::get_user_list_from_course_code(
980
                    $courseCode,
981
                    $sessionId
982
                );
983
984
                if (!empty($userList)) {
985
                    foreach ($userList as $user) {
986
                        api_item_property_update(
987
                            $courseInfo,
988
                            TOOL_ANNOUNCEMENT,
989
                            $announcementId,
990
                            'AnnouncementUpdated',
991
                            api_get_user_id(),
992
                            0,
993
                            $user['user_id'],
994
                            0,
995
                            0,
996
                            $sessionId
997
                        );
998
                    }
999
                }
1000
            }
1001
        }
1002
    }
1003
1004
    /**
1005
     * @param int $insert_id
1006
     *
1007
     * @return bool
1008
     */
1009
    public static function update_mail_sent($insert_id)
1010
    {
1011
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT);
1012
        if ($insert_id != strval(intval($insert_id))) {
1013
            return false;
1014
        }
1015
        $insert_id = intval($insert_id);
1016
        $courseId = api_get_course_int_id();
1017
        // store the modifications in the table tbl_annoucement
1018
        $sql = "UPDATE $table SET email_sent='1'
1019
                WHERE c_id = $courseId AND id = $insert_id";
1020
        Database::query($sql);
1021
    }
1022
1023
    /**
1024
     * @param int $user_id
1025
     *
1026
     * @return array|bool
1027
     */
1028
    public static function getAnnoucementCourseTotalByUser($user_id)
1029
    {
1030
        $user_id = (int) $user_id;
1031
1032
        if (empty($user_id)) {
1033
            return false;
1034
        }
1035
1036
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
1037
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
1038
1039
        $sql = "SELECT DISTINCT
1040
                    announcement.c_id,
1041
                    count(announcement.id) count
1042
                FROM $tbl_announcement announcement
1043
                INNER JOIN $tbl_item_property ip
1044
                ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1045
                WHERE
1046
                    ip.tool='announcement' AND
1047
                    (
1048
                      ip.to_user_id = '$user_id' AND
1049
                      (ip.to_group_id='0' OR ip.to_group_id IS NULL)
1050
                    )
1051
                    AND ip.visibility='1'
1052
                    AND announcement.session_id  = 0
1053
                GROUP BY announcement.c_id";
1054
        $rs = Database::query($sql);
1055
        $num_rows = Database::num_rows($rs);
1056
        $result = [];
1057
        if ($num_rows > 0) {
1058
            while ($row = Database::fetch_array($rs, 'ASSOC')) {
1059
                if (empty($row['c_id'])) {
1060
                    continue;
1061
                }
1062
                $result[] = ['course' => api_get_course_info_by_id($row['c_id']), 'count' => $row['count']];
1063
            }
1064
        }
1065
1066
        return $result;
1067
    }
1068
1069
    /**
1070
     * Returns announcement info from its id.
1071
     *
1072
     * @param int $courseId
1073
     * @param int $id
1074
     *
1075
     * @return array
1076
     */
1077
    public static function get_by_id($courseId, $id)
1078
    {
1079
        $id = (int) $id;
1080
        $courseId = $courseId ? (int) $courseId : api_get_course_int_id();
1081
1082
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
1083
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
1084
1085
        $sql = "SELECT DISTINCT
1086
                    announcement.id,
1087
                    announcement.title,
1088
                    announcement.content,
1089
                    ip.to_group_id
1090
               FROM $tbl_announcement announcement
1091
               INNER JOIN $tbl_item_property ip
1092
               ON
1093
                    announcement.id = ip.ref AND
1094
                    announcement.c_id = ip.c_id
1095
               WHERE
1096
                    announcement.c_id = $courseId AND
1097
                    ip.tool='announcement' AND
1098
                    announcement.id = $id
1099
                ";
1100
1101
        $result = Database::query($sql);
1102
        if (Database::num_rows($result)) {
1103
            return Database::fetch_array($result);
1104
        }
1105
1106
        return [];
1107
    }
1108
1109
    /**
1110
     * this function gets all the groups of the course,
1111
     * not including linked courses.
1112
     */
1113
    public static function get_course_groups()
1114
    {
1115
        $session_id = api_get_session_id();
1116
        if ($session_id != 0) {
1117
            $new_group_list = CourseManager::get_group_list_of_course(
1118
                api_get_course_id(),
1119
                $session_id,
1120
                1
1121
            );
1122
        } else {
1123
            $new_group_list = CourseManager::get_group_list_of_course(
1124
                api_get_course_id(),
1125
                0,
1126
                1
1127
            );
1128
        }
1129
1130
        return $new_group_list;
1131
    }
1132
1133
    /**
1134
     * This tools loads all the users and all the groups who have received
1135
     * a specific item (in this case an announcement item).
1136
     *
1137
     * @param string $tool
1138
     * @param int    $id
1139
     * @param bool   $includeGroupWhenLoadingUser
1140
     *
1141
     * @return array
1142
     */
1143
    public static function loadEditUsers($tool, $id, $includeGroupWhenLoadingUser = false)
1144
    {
1145
        $table = Database::get_course_table(TABLE_ITEM_PROPERTY);
1146
        $tool = Database::escape_string($tool);
1147
        $id = (int) $id;
1148
        $courseId = api_get_course_int_id();
1149
        $groupId = api_get_group_id();
1150
1151
        $sql = "SELECT to_user_id, to_group_id FROM $table
1152
                WHERE c_id = $courseId AND tool='$tool' AND ref = $id";
1153
1154
        $result = Database::query($sql);
1155
        $to = [];
1156
        while ($row = Database::fetch_array($result)) {
1157
            // This is the iid of c_group_info
1158
            $toGroup = $row['to_group_id'];
1159
            if (empty($row['to_user_id']) && !empty($groupId) && $groupId != $toGroup) {
1160
                //continue;
1161
            }
1162
            switch ($toGroup) {
1163
                // it was send to one specific user
1164
                case null:
1165
                    if (isset($row['to_user_id']) && !empty($row['to_user_id'])) {
1166
                        if (!in_array('USER:'.$row['to_user_id'], $to)) {
1167
                            $to[] = 'USER:'.$row['to_user_id'];
1168
                        }
1169
                    }
1170
                    break;
1171
                // it was sent to everyone
1172
                case 0:
1173
                    return 'everyone';
1174
                    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...
1175
                default:
1176
                    if (isset($row['to_user_id']) && !empty($row['to_user_id'])) {
1177
                        if (!in_array('USER:'.$row['to_user_id'], $to)) {
1178
                            $to[] = 'USER:'.$row['to_user_id'];
1179
                        }
1180
                    } else {
1181
                        if (!in_array('GROUP:'.$toGroup, $to)) {
1182
                            $to[] = 'GROUP:'.$toGroup;
1183
                        }
1184
                    }
1185
1186
                    if ($includeGroupWhenLoadingUser) {
1187
                        if (!in_array('GROUP:'.$toGroup, $to)) {
1188
                            $to[] = 'GROUP:'.$toGroup;
1189
                        }
1190
                    }
1191
                    break;
1192
            }
1193
        }
1194
1195
        return $to;
1196
    }
1197
1198
    /**
1199
     * constructs the form to display all the groups and users the message has been sent to.
1200
     *
1201
     * @param array $sent_to_array
1202
     *                             input:
1203
     *                             $sent_to_array is a 2 dimensional array containing the groups and the users
1204
     *                             the first level is a distinction between groups and users:
1205
     *                             $sent_to_array['groups'] * and $sent_to_array['users']
1206
     *                             $sent_to_array['groups'] (resp. $sent_to_array['users']) is also an array
1207
     *                             containing all the id's of the groups (resp. users) who have received this message.
1208
     *
1209
     * @return string
1210
     *
1211
     * @author Patrick Cool <patrick.cool@>
1212
     */
1213
    public static function sent_to_form($sent_to_array)
1214
    {
1215
        // we find all the names of the groups
1216
        $group_names = self::get_course_groups();
1217
1218
        // we count the number of users and the number of groups
1219
        $number_users = 0;
1220
        if (isset($sent_to_array['users'])) {
1221
            $number_users = count($sent_to_array['users']);
1222
        }
1223
        $number_groups = 0;
1224
        if (isset($sent_to_array['groups'])) {
1225
            $number_groups = count($sent_to_array['groups']);
1226
        }
1227
1228
        $total_numbers = $number_users + $number_groups;
1229
1230
        // starting the form if there is more than one user/group
1231
        $output = [];
1232
        if ($total_numbers > 1) {
1233
            // outputting the name of the groups
1234
            if (is_array($sent_to_array['groups'])) {
1235
                foreach ($sent_to_array['groups'] as $group_id) {
1236
                    $users = GroupManager::getStudents($group_id, true);
1237
                    $userToArray = [];
1238
                    foreach ($users as $student) {
1239
                        $userToArray[] = $student['complete_name_with_username'];
1240
                    }
1241
                    $output[] =
1242
                        '<br />'.
1243
                        Display::label($group_names[$group_id]['name'], 'info').
1244
                        '&nbsp;'.implode(', ', $userToArray);
1245
                }
1246
            }
1247
1248
            if (isset($sent_to_array['users'])) {
1249
                if (is_array($sent_to_array['users'])) {
1250
                    $usersToArray = [];
1251
                    foreach ($sent_to_array['users'] as $user_id) {
1252
                        $user_info = api_get_user_info($user_id);
1253
                        $usersToArray[] = $user_info['complete_name_with_username'];
1254
                    }
1255
                    $output[] = '<br />'.Display::label(get_lang('Users')).'&nbsp;'.implode(', ', $usersToArray);
1256
                }
1257
            }
1258
        } else {
1259
            // there is only one user/group
1260
            if (isset($sent_to_array['users']) && is_array($sent_to_array['users'])) {
1261
                $user_info = api_get_user_info($sent_to_array['users'][0]);
1262
                $output[] = api_get_person_name($user_info['firstname'], $user_info['lastname']);
1263
            }
1264
            if (isset($sent_to_array['groups']) &&
1265
                is_array($sent_to_array['groups']) &&
1266
                isset($sent_to_array['groups'][0]) &&
1267
                $sent_to_array['groups'][0] !== 0
1268
            ) {
1269
                $group_id = $sent_to_array['groups'][0];
1270
1271
                $users = GroupManager::getStudents($group_id, true);
1272
                $userToArray = [];
1273
                foreach ($users as $student) {
1274
                    $userToArray[] = $student['complete_name_with_username'];
1275
                }
1276
                $output[] =
1277
                    '<br />'.
1278
                    Display::label($group_names[$group_id]['name'], 'info').
1279
                    '&nbsp;'.implode(', ', $userToArray);
1280
            }
1281
            if (empty($sent_to_array['groups']) && empty($sent_to_array['users'])) {
1282
                $output[] = "&nbsp;".get_lang('Everybody');
1283
            }
1284
        }
1285
1286
        if (!empty($output)) {
1287
            $output = array_filter($output);
1288
            if (count($output) > 0) {
1289
                $output = implode('<br />', $output);
1290
            }
1291
1292
            return $output;
1293
        }
1294
    }
1295
1296
    /**
1297
     * Returns all the users and all the groups a specific announcement item
1298
     * has been sent to.
1299
     *
1300
     * @param    string  The tool (announcement, agenda, ...)
1301
     * @param    int     ID of the element of the corresponding type
1302
     *
1303
     * @return array Array of users and groups to whom the element has been sent
1304
     */
1305
    public static function sent_to($tool, $id)
1306
    {
1307
        $table = Database::get_course_table(TABLE_ITEM_PROPERTY);
1308
        $tool = Database::escape_string($tool);
1309
        $id = (int) $id;
1310
1311
        $sent_to_group = [];
1312
        $sent_to = [];
1313
        $courseId = api_get_course_int_id();
1314
1315
        $sql = "SELECT to_group_id, to_user_id
1316
                FROM $table
1317
                WHERE c_id = $courseId AND tool = '$tool' AND ref=".$id;
1318
        $result = Database::query($sql);
1319
1320
        while ($row = Database::fetch_array($result)) {
1321
            // if to_user_id <> 0 then it is sent to a specific user
1322
            if ($row['to_user_id'] != 0) {
1323
                $sent_to_user[] = $row['to_user_id'];
1324
                continue;
1325
            }
1326
1327
            // if to_group_id is null then it is sent to a specific user
1328
            // if to_group_id = 0 then it is sent to everybody
1329
            if ($row['to_group_id'] != 0) {
1330
                $sent_to_group[] = $row['to_group_id'];
1331
            }
1332
        }
1333
1334
        if (isset($sent_to_group)) {
1335
            $sent_to['groups'] = $sent_to_group;
1336
        }
1337
1338
        if (isset($sent_to_user)) {
1339
            $sent_to['users'] = $sent_to_user;
1340
        }
1341
1342
        return $sent_to;
1343
    }
1344
1345
    /**
1346
     * Show a list with all the attachments according to the post's id.
1347
     *
1348
     * @param int $announcementId
1349
     *
1350
     * @return array with the post info
1351
     *
1352
     * @author Arthur Portugal
1353
     *
1354
     * @version November 2009, dokeos 1.8.6.2
1355
     */
1356
    public static function get_attachment($announcementId)
1357
    {
1358
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT);
1359
        $announcementId = (int) $announcementId;
1360
        $courseId = api_get_course_int_id();
1361
        $row = [];
1362
        $sql = 'SELECT id, path, filename, comment
1363
                FROM '.$table.'
1364
				WHERE c_id = '.$courseId.' AND announcement_id = '.$announcementId;
1365
        $result = Database::query($sql);
1366
        if (Database::num_rows($result) != 0) {
1367
            $row = Database::fetch_array($result, 'ASSOC');
1368
        }
1369
1370
        return $row;
1371
    }
1372
1373
    /**
1374
     * This function add a attachment file into announcement.
1375
     *
1376
     * @param int  announcement id
1377
     * @param string file comment
1378
     * @param array  uploaded file $_FILES
1379
     *
1380
     * @return int -1 if failed, 0 if unknown (should not happen), 1 if success
1381
     */
1382
    public static function add_announcement_attachment_file(
1383
        $announcement_id,
1384
        $file_comment,
1385
        $file
1386
    ) {
1387
        $courseInfo = api_get_course_info();
1388
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT);
1389
        $return = 0;
1390
        $announcement_id = intval($announcement_id);
1391
        $courseId = api_get_course_int_id();
1392
1393
        if (is_array($file) && $file['error'] == 0) {
1394
            // TODO: This path is obsolete. The new document repository scheme should be kept in mind here.
1395
            $courseDir = $courseInfo['path'].'/upload/announcements';
1396
            $sys_course_path = api_get_path(SYS_COURSE_PATH);
1397
            $updir = $sys_course_path.$courseDir;
1398
1399
            // Try to add an extension to the file if it hasn't one
1400
            $new_file_name = add_ext_on_mime(stripslashes($file['name']), $file['type']);
1401
            // user's file name
1402
            $file_name = $file['name'];
1403
1404
            if (!filter_extension($new_file_name)) {
1405
                $return = -1;
1406
                echo Display::return_message(get_lang('UplUnableToSaveFileFilteredExtension'), 'error');
1407
            } else {
1408
                $new_file_name = uniqid('');
1409
                $new_path = $updir.'/'.$new_file_name;
1410
1411
                // This file is copy here but its cleaned in api_mail_html in api.lib.php
1412
                copy($file['tmp_name'], $new_path);
1413
1414
                $params = [
1415
                    'c_id' => $courseId,
1416
                    'filename' => $file_name,
1417
                    'comment' => $file_comment,
1418
                    'path' => $new_file_name,
1419
                    'announcement_id' => $announcement_id,
1420
                    'size' => (int) $file['size'],
1421
                ];
1422
1423
                $insertId = Database::insert($table, $params);
1424
                if ($insertId) {
1425
                    $sql = "UPDATE $table SET id = iid
1426
                            WHERE iid = $insertId";
1427
                    Database::query($sql);
1428
                }
1429
1430
                $return = 1;
1431
            }
1432
        }
1433
1434
        return $return;
1435
    }
1436
1437
    /**
1438
     * This function edit a attachment file into announcement.
1439
     *
1440
     * @param int attach id
1441
     * @param array uploaded file $_FILES
1442
     * @param string file comment
1443
     *
1444
     * @return int
1445
     */
1446
    public static function edit_announcement_attachment_file(
1447
        $id_attach,
1448
        $file,
1449
        $file_comment
1450
    ) {
1451
        $courseInfo = api_get_course_info();
1452
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT);
1453
        $return = 0;
1454
        $courseId = api_get_course_int_id();
1455
1456
        if (is_array($file) && $file['error'] == 0) {
1457
            // TODO: This path is obsolete. The new document repository scheme should be kept in mind here.
1458
            $courseDir = $courseInfo['path'].'/upload/announcements';
1459
            $sys_course_path = api_get_path(SYS_COURSE_PATH);
1460
            $updir = $sys_course_path.$courseDir;
1461
1462
            // Try to add an extension to the file if it hasn't one
1463
            $new_file_name = add_ext_on_mime(
1464
                stripslashes($file['name']),
1465
                $file['type']
1466
            );
1467
            // user's file name
1468
            $file_name = $file['name'];
1469
1470
            if (!filter_extension($new_file_name)) {
1471
                $return = -1;
1472
                echo Display::return_message(
1473
                    get_lang('UplUnableToSaveFileFilteredExtension'),
1474
                    'error'
1475
                );
1476
            } else {
1477
                $new_file_name = uniqid('');
1478
                $new_path = $updir.'/'.$new_file_name;
1479
                copy($file['tmp_name'], $new_path);
1480
                $safe_file_comment = Database::escape_string($file_comment);
1481
                $safe_file_name = Database::escape_string($file_name);
1482
                $safe_new_file_name = Database::escape_string($new_file_name);
1483
                $id_attach = intval($id_attach);
1484
                $sql = "UPDATE $table SET
1485
                            filename = '$safe_file_name',
1486
                            comment = '$safe_file_comment',
1487
                            path = '$safe_new_file_name',
1488
                            size ='".intval($file['size'])."'
1489
					 	WHERE c_id = $courseId AND id = '$id_attach'";
1490
                $result = Database::query($sql);
1491
                if ($result === false) {
1492
                    $return = -1;
1493
                    echo Display::return_message(
1494
                        get_lang('UplUnableToSaveFile'),
1495
                        'error'
1496
                    );
1497
                } else {
1498
                    $return = 1;
1499
                }
1500
            }
1501
        }
1502
1503
        return $return;
1504
    }
1505
1506
    /**
1507
     * This function delete a attachment file by id.
1508
     *
1509
     * @param int $id attachment file Id
1510
     *
1511
     * @return bool
1512
     */
1513
    public static function delete_announcement_attachment_file($id)
1514
    {
1515
        $table = Database::get_course_table(TABLE_ANNOUNCEMENT_ATTACHMENT);
1516
        $id = intval($id);
1517
        $courseId = api_get_course_int_id();
1518
        if (empty($courseId) || empty($id)) {
1519
            return false;
1520
        }
1521
        $sql = "DELETE FROM $table
1522
                WHERE c_id = $courseId AND id = $id";
1523
        Database::query($sql);
1524
1525
        return true;
1526
    }
1527
1528
    /**
1529
     * @param array $courseInfo
1530
     * @param int   $sessionId
1531
     * @param int   $announcementId
1532
     * @param bool  $sendToUsersInSession
1533
     * @param bool  $sendToDrhUsers
1534
     * @param Monolog\Handler\HandlerInterface logger
1535
     * @param int  $senderId
1536
     * @param bool $directMessage
1537
     *
1538
     * @return array
1539
     */
1540
    public static function sendEmail(
1541
        $courseInfo,
1542
        $sessionId,
1543
        $announcementId,
1544
        $sendToUsersInSession = false,
1545
        $sendToDrhUsers = false,
1546
        $logger = null,
1547
        $senderId = 0,
1548
        $directMessage = false
1549
    ) {
1550
        $email = new AnnouncementEmail($courseInfo, $sessionId, $announcementId, $logger);
1551
1552
        return $email->send($sendToUsersInSession, $sendToDrhUsers, $senderId, $directMessage);
1553
    }
1554
1555
    /**
1556
     * @param $stok
1557
     * @param $announcement_number
1558
     * @param bool   $getCount
1559
     * @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...
1560
     * @param null   $limit
0 ignored issues
show
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...
1561
     * @param string $sidx
1562
     * @param string $sord
1563
     * @param string $titleToSearch
1564
     * @param int    $userIdToSearch
1565
     * @param int    $userId
1566
     * @param int    $courseId
1567
     * @param int    $sessionId
1568
     *
1569
     * @return array
1570
     */
1571
    public static function getAnnouncements(
1572
        $stok,
1573
        $announcement_number,
1574
        $getCount = false,
1575
        $start = null,
1576
        $limit = null,
1577
        $sidx = '',
1578
        $sord = '',
1579
        $titleToSearch = '',
1580
        $userIdToSearch = 0,
1581
        $userId = 0,
1582
        $courseId = 0,
1583
        $sessionId = 0
1584
    ) {
1585
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
1586
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
1587
1588
        $user_id = $userId ?: api_get_user_id();
1589
        $group_id = api_get_group_id();
1590
        $session_id = $sessionId ?: api_get_session_id();
1591
        if (empty($courseId)) {
1592
            $courseInfo = api_get_course_info();
1593
            $courseId = $courseInfo['real_id'];
1594
        } else {
1595
            $courseId = (int) $courseId;
1596
            $courseInfo = api_get_course_info_by_id($courseId);
1597
        }
1598
1599
        if (empty($courseInfo)) {
1600
            return [];
1601
        }
1602
1603
        $condition_session = api_get_session_condition(
1604
            $session_id,
1605
            true,
1606
            true,
1607
            'announcement.session_id'
1608
        );
1609
1610
        $group_memberships = GroupManager::get_group_ids(
1611
            $courseId,
1612
            api_get_user_id()
1613
        );
1614
        $allowUserEditSetting = api_get_course_setting('allow_user_edit_announcement');
1615
1616
        $select = ' DISTINCT
1617
                        announcement.*,
1618
                        ip.visibility,
1619
                        ip.to_group_id,
1620
                        ip.insert_user_id,
1621
                        ip.insert_date,
1622
                        ip.lastedit_date';
1623
        $groupBy = ' GROUP BY announcement.iid';
1624
        if ($getCount) {
1625
            $groupBy = '';
1626
            $select = ' COUNT(DISTINCT announcement.iid) count';
1627
        }
1628
1629
        $searchCondition = '';
1630
        if (!empty($titleToSearch)) {
1631
            $titleToSearch = Database::escape_string($titleToSearch);
1632
            $searchCondition .= " AND (title LIKE '%$titleToSearch%')";
1633
        }
1634
1635
        if (!empty($userIdToSearch)) {
1636
            $userIdToSearch = (int) $userIdToSearch;
1637
            $searchCondition .= " AND (ip.insert_user_id = $userIdToSearch)";
1638
        }
1639
1640
        $allowOnlyGroup = api_get_configuration_value('hide_base_course_announcements_in_group');
1641
        $extraGroupCondition = '';
1642
        if ($allowOnlyGroup) {
1643
            $extraGroupCondition = " AND ip.to_group_id = $group_id ";
1644
        }
1645
1646
        $allowDrhAccess = api_get_configuration_value('allow_drh_access_announcement');
1647
1648
        if ($allowDrhAccess && api_is_drh()) {
1649
            // DRH only can see visible
1650
            $searchCondition .= ' AND (ip.visibility = 1)';
1651
        }
1652
1653
        if (api_is_allowed_to_edit(false, true) ||
1654
            ($allowUserEditSetting && !api_is_anonymous()) ||
1655
            ($allowDrhAccess && api_is_drh()) ||
1656
            ($session_id && api_is_coach() && api_get_configuration_value('allow_coach_to_edit_announcements'))
1657
        ) {
1658
            // A.1. you are a course admin with a USER filter
1659
            // => see only the messages of this specific user + the messages of the group (s)he is member of.
1660
            //if (!empty($user_id)) {
1661
            if (0) {
1662
                if (is_array($group_memberships) &&
1663
                    count($group_memberships) > 0
1664
                ) {
1665
                    $sql = "SELECT $select
1666
                            FROM $tbl_announcement announcement
1667
                            INNER JOIN $tbl_item_property ip
1668
                            ON (announcement.id = ip.ref AND ip.c_id = announcement.c_id)
1669
                            WHERE
1670
                                announcement.c_id = $courseId AND
1671
                                ip.c_id = $courseId AND
1672
                                ip.tool = 'announcement' AND
1673
                                (
1674
                                    ip.to_user_id = $user_id OR
1675
                                    ip.to_group_id IS NULL OR
1676
                                    ip.to_group_id IN (0, ".implode(", ", $group_memberships).")
1677
                                ) AND
1678
                                ip.visibility IN ('1', '0')
1679
                                $condition_session
1680
                                $searchCondition
1681
                            ORDER BY display_order DESC";
1682
                } else {
1683
                    $sql = "SELECT $select
1684
                            FROM $tbl_announcement announcement
1685
                            INNER JOIN $tbl_item_property ip
1686
                            ON (announcement.id = ip.ref AND ip.c_id = announcement.c_id)
1687
                            WHERE
1688
                                announcement.c_id = $courseId AND
1689
                                ip.c_id = $courseId AND
1690
                                ip.tool ='announcement' AND
1691
                                (ip.to_user_id = $user_id OR ip.to_group_id='0' OR ip.to_group_id IS NULL) AND
1692
                                ip.visibility IN ('1', '0')
1693
                            $condition_session
1694
                            $searchCondition
1695
                            ORDER BY display_order DESC";
1696
                }
1697
            } elseif ($group_id != 0) {
1698
                // A.2. you are a course admin with a GROUP filter
1699
                // => see only the messages of this specific group
1700
                $sql = "SELECT $select
1701
                        FROM $tbl_announcement announcement
1702
                        INNER JOIN $tbl_item_property ip
1703
                        ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1704
                        WHERE
1705
                            ip.tool='announcement' AND
1706
                            announcement.c_id = $courseId AND
1707
                            ip.c_id = $courseId AND
1708
                            ip.visibility<>'2' AND
1709
                            (ip.to_group_id = $group_id OR ip.to_group_id='0' OR ip.to_group_id IS NULL)
1710
                            $condition_session
1711
                            $searchCondition
1712
                            $extraGroupCondition
1713
                        $groupBy
1714
                        ORDER BY display_order DESC";
1715
            } else {
1716
                // A.3 you are a course admin without any group or user filter
1717
                // A.3.a you are a course admin without user or group filter but WITH studentview
1718
                // => see all the messages of all the users and groups without editing possibilities
1719
                if (isset($isStudentView) && $isStudentView == 'true') {
1720
                    $sql = "SELECT $select
1721
                            FROM $tbl_announcement announcement
1722
                            INNER JOIN $tbl_item_property ip
1723
                            ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1724
                            WHERE
1725
                                ip.tool='announcement' AND
1726
                                announcement.c_id = $courseId AND
1727
                                ip.c_id = $courseId AND
1728
                                ip.visibility='1'
1729
                                $condition_session
1730
                                $searchCondition
1731
                            $groupBy
1732
                            ORDER BY display_order DESC";
1733
                } else {
1734
                    // A.3.a you are a course admin without user or group filter and WTIHOUT studentview (= the normal course admin view)
1735
                    // => see all the messages of all the users and groups with editing possibilities
1736
                    $sql = "SELECT $select
1737
                            FROM $tbl_announcement announcement
1738
                            INNER JOIN $tbl_item_property ip
1739
                            ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1740
                            WHERE
1741
                                ip.tool = 'announcement' AND
1742
                                announcement.c_id = $courseId AND
1743
                                ip.c_id = $courseId  AND
1744
                                (ip.visibility='0' OR ip.visibility='1')
1745
                                $condition_session
1746
                                $searchCondition
1747
                            $groupBy
1748
                            ORDER BY display_order DESC";
1749
                }
1750
            }
1751
        } else {
1752
            // STUDENT
1753
            if (is_array($group_memberships) && count($group_memberships) > 0) {
1754
                if ($allowUserEditSetting && !api_is_anonymous()) {
1755
                    if ($group_id == 0) {
1756
                        // No group
1757
                        $cond_user_id = " AND (
1758
                            ip.lastedit_user_id = '".$user_id."' OR (
1759
                                (ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) OR
1760
                                (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships)."))
1761
                            )
1762
                        ) ";
1763
                    } else {
1764
                        $cond_user_id = " AND (
1765
                            ip.lastedit_user_id = '".$user_id."' OR ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".$group_id.")
1766
                        )";
1767
                        $cond_user_id .= $extraGroupCondition;
1768
                    }
1769
                } else {
1770
                    if ($group_id == 0) {
1771
                        $cond_user_id = " AND (
1772
                            (ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND
1773
                            (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships)."))
1774
                        ) ";
1775
                    } else {
1776
                        $cond_user_id = " AND (
1777
                            (ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND
1778
                            (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".$group_id."))
1779
                        )";
1780
                        $cond_user_id .= $extraGroupCondition;
1781
                    }
1782
                }
1783
1784
                $sql = "SELECT $select
1785
                        FROM $tbl_announcement announcement INNER JOIN
1786
                        $tbl_item_property ip
1787
                        ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1788
                        WHERE
1789
                            announcement.c_id = $courseId AND
1790
                            ip.c_id = $courseId AND
1791
                            ip.tool='announcement'
1792
                            $cond_user_id
1793
                            $condition_session
1794
                            $searchCondition AND
1795
                            ip.visibility='1'
1796
                            $groupBy
1797
                        ORDER BY display_order DESC";
1798
            } else {
1799
                if ($user_id) {
1800
                    if ($allowUserEditSetting && !api_is_anonymous()) {
1801
                        $cond_user_id = " AND (
1802
                                ip.lastedit_user_id = '".api_get_user_id()."' OR
1803
                                ((ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND
1804
                                (ip.to_group_id='0' OR ip.to_group_id IS NULL)
1805
                            )
1806
                        ) ";
1807
                    } else {
1808
                        $cond_user_id = " AND ((ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND
1809
                        (ip.to_group_id='0' OR ip.to_group_id IS NULL) ) ";
1810
                    }
1811
1812
                    $sql = "SELECT $select
1813
						FROM $tbl_announcement announcement
1814
						INNER JOIN $tbl_item_property ip
1815
						ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1816
						WHERE
1817
    						announcement.c_id = $courseId AND
1818
							ip.c_id = $courseId AND
1819
    						ip.tool='announcement'
1820
    						$cond_user_id
1821
    						$condition_session
1822
    						$searchCondition
1823
    						AND ip.visibility='1'
1824
    						AND announcement.session_id IN(0, ".$session_id.")
1825
                        $groupBy
1826
						ORDER BY display_order DESC";
1827
                } else {
1828
                    if (($allowUserEditSetting && !api_is_anonymous())) {
1829
                        $cond_user_id = " AND (
1830
                            ip.lastedit_user_id = '".$user_id."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL
1831
                        )";
1832
                    } else {
1833
                        $cond_user_id = " AND ip.to_group_id='0' OR ip.to_group_id IS NULL ";
1834
                    }
1835
1836
                    $sql = "SELECT $select
1837
                            FROM $tbl_announcement announcement
1838
                            INNER JOIN $tbl_item_property ip
1839
                            ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
1840
                            WHERE
1841
                                announcement.c_id = $courseId AND
1842
                                ip.c_id = $courseId AND
1843
                                ip.tool='announcement'
1844
                                $cond_user_id
1845
                                $condition_session
1846
                                $searchCondition  AND
1847
                                ip.visibility='1' AND
1848
                                announcement.session_id IN ( 0,".api_get_session_id().")
1849
                                $groupBy
1850
                            ";
1851
                }
1852
            }
1853
        }
1854
1855
        if (!is_null($start) && !is_null($limit)) {
1856
            $start = (int) $start;
1857
            $limit = (int) $limit;
1858
            $sql .= " LIMIT $start, $limit";
1859
        }
1860
1861
        $result = Database::query($sql);
1862
        if ($getCount) {
1863
            $result = Database::fetch_array($result, 'ASSOC');
1864
1865
            return $result['count'];
1866
        }
1867
1868
        $iterator = 1;
1869
        $bottomAnnouncement = $announcement_number;
1870
        $displayed = [];
1871
        $results = [];
1872
        $emailIcon = '<i class="fa fa-envelope-o" title="'.get_lang('AnnounceSentByEmail').'"></i>';
1873
        $attachmentIcon = '<i class="fa fa-paperclip" title="'.get_lang('Attachment').'"></i>';
1874
        $editIcon = Display::return_icon(
1875
            'edit.png',
1876
            get_lang('Edit'),
1877
            '',
1878
            ICON_SIZE_SMALL
1879
        );
1880
1881
        $editIconDisable = Display::return_icon(
1882
            'edit_na.png',
1883
            get_lang('Edit'),
1884
            '',
1885
            ICON_SIZE_SMALL
1886
        );
1887
        $deleteIcon = Display::return_icon(
1888
            'delete.png',
1889
            get_lang('Delete'),
1890
            '',
1891
            ICON_SIZE_SMALL
1892
        );
1893
1894
        $deleteIconDisable = Display::return_icon(
1895
            'delete_na.png',
1896
            get_lang('Delete'),
1897
            '',
1898
            ICON_SIZE_SMALL
1899
        );
1900
1901
        $isTutor = false;
1902
        if (!empty($group_id)) {
1903
            $groupInfo = GroupManager::get_group_properties(api_get_group_id());
1904
            //User has access in the group?
1905
            $isTutor = GroupManager::is_tutor_of_group(
1906
                api_get_user_id(),
1907
                $groupInfo
1908
            );
1909
        }
1910
1911
        while ($row = Database::fetch_array($result, 'ASSOC')) {
1912
            if (!in_array($row['id'], $displayed)) {
1913
                $actionUrl = api_get_path(WEB_CODE_PATH).'announcements/announcements.php?'
1914
                    .api_get_cidreq_params($courseInfo['code'], $session_id, $row['to_group_id']);
1915
                $sent_to_icon = '';
1916
                // the email icon
1917
                if ($row['email_sent'] == '1') {
1918
                    $sent_to_icon = ' '.$emailIcon;
1919
                }
1920
1921
                $groupReference = $row['to_group_id'] > 0 ? ' <span class="label label-info">'.get_lang('Group').'</span> ' : '';
1922
                $disableEdit = false;
1923
                $to = self::loadEditUsers('announcement', $row['id'], true);
1924
                $separated = CourseManager::separateUsersGroups($to);
1925
                if (!empty($group_id)) {
1926
                    // If the announcement was sent to many groups, disable edition inside a group
1927
                    if (isset($separated['groups']) && count($separated['groups']) > 1) {
1928
                        $disableEdit = true;
1929
                    }
1930
1931
                    // If the announcement was sent only to the course disable edition
1932
                    if (empty($separated['groups']) && empty($separated['users'])) {
1933
                        $disableEdit = true;
1934
                    }
1935
1936
                    // Announcement sent to only a user
1937
                    if ($separated['groups'] > 1 && !in_array($group_id, $separated['groups'])) {
1938
                        $disableEdit = true;
1939
                    }
1940
                } else {
1941
                    if (isset($separated['groups']) && count($separated['groups']) > 1) {
1942
                        $groupReference = '';
1943
                    }
1944
                }
1945
1946
                $title = $row['title'].$groupReference.$sent_to_icon;
1947
                $item_visibility = api_get_item_visibility(
1948
                    $courseInfo,
1949
                    TOOL_ANNOUNCEMENT,
1950
                    $row['id'],
1951
                    $session_id
1952
                );
1953
                $row['visibility'] = $item_visibility;
1954
1955
                // show attachment list
1956
                $attachment_list = self::get_attachment($row['id']);
1957
                $attachment_icon = '';
1958
                if (count($attachment_list) > 0) {
1959
                    $attachment_icon = ' '.$attachmentIcon;
1960
                }
1961
1962
                $user_info = api_get_user_info($row['insert_user_id']);
1963
                $username = sprintf(get_lang('LoginX'), $user_info['username']);
1964
                $username_span = Display::tag(
1965
                    'span',
1966
                    $user_info['complete_name'],
1967
                    ['title' => $username]
1968
                );
1969
1970
                $title = Display::url(
1971
                    $title.$attachment_icon,
1972
                    $actionUrl.'&action=view&id='.$row['id']
1973
                );
1974
1975
                // we can edit if : we are the teacher OR the element belongs to
1976
                // the session we are coaching OR the option to allow users to edit is on
1977
                if (api_is_allowed_to_edit(false, true) ||
1978
                    (api_is_session_general_coach() && api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $row['id'])) ||
1979
                    (api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous()) ||
1980
                    ($row['to_group_id'] == $group_id && $isTutor) ||
1981
                    ($session_id && api_is_coach() && api_get_configuration_value('allow_coach_to_edit_announcements'))
1982
                ) {
1983
                    if ($disableEdit === true) {
1984
                        $modify_icons = "<a href='#'>".$editIconDisable."</a>";
1985
                    } else {
1986
                        $modify_icons = "<a href=\"".$actionUrl."&action=modify&id=".$row['id']."\">".$editIcon."</a>";
1987
                    }
1988
1989
                    $image_visibility = 'invisible';
1990
                    $alt_visibility = get_lang('Visible');
1991
                    if ($row['visibility'] == 1) {
1992
                        $image_visibility = 'visible';
1993
                        $alt_visibility = get_lang('Hide');
1994
                    }
1995
1996
                    $modify_icons .= "<a
1997
                        href=\"".$actionUrl."&action=showhide&id=".$row['id']."&sec_token=".$stok."\">".
1998
                        Display::return_icon($image_visibility.'.png', $alt_visibility, '', ICON_SIZE_SMALL).
1999
                        "</a>";
2000
2001
                    // DISPLAY MOVE UP COMMAND only if it is not the top announcement
2002
                    if ($iterator != 1) {
2003
                        $modify_icons .= "<a href=\"".$actionUrl."&action=move&up=".$row["id"]."&sec_token=".$stok."\">".
2004
                            Display::return_icon('up.gif', get_lang('Up'))."</a>";
2005
                    } else {
2006
                        $modify_icons .= Display::return_icon('up_na.gif', get_lang('Up'));
2007
                    }
2008
2009
                    if ($iterator < $bottomAnnouncement) {
2010
                        $modify_icons .= "<a href=\"".$actionUrl."&action=move&down=".$row["id"]."&sec_token=".$stok."\">".
2011
                            Display::return_icon('down.gif', get_lang('Down'))."</a>";
2012
                    } else {
2013
                        $modify_icons .= Display::return_icon('down_na.gif', get_lang('Down'));
2014
                    }
2015
2016
                    if (api_is_allowed_to_edit(false, true)) {
2017
                        if ($disableEdit === true) {
2018
                            $modify_icons .= Display::url($deleteIconDisable, '#');
2019
                        } else {
2020
                            $modify_icons .= "<a href=\"".$actionUrl."&action=delete&id=".$row['id']."&sec_token=".$stok."\" onclick=\"javascript:if(!confirm('".addslashes(
2021
                                    api_htmlentities(
2022
                                        get_lang('ConfirmYourChoice'),
2023
                                        ENT_QUOTES,
2024
                                        api_get_system_encoding()
2025
                                    )
2026
                                )."')) return false;\">".
2027
                                $deleteIcon."</a>";
2028
                        }
2029
                    }
2030
                    $iterator++;
2031
                } else {
2032
                    $modify_icons = Display::url(
2033
                        Display::return_icon('default.png'),
2034
                        $actionUrl.'&action=view&id='.$row['id']
2035
                    );
2036
                }
2037
2038
                $announcement = [
2039
                    'id' => $row['id'],
2040
                    'title' => $title,
2041
                    'username' => $username_span,
2042
                    'insert_date' => api_convert_and_format_date(
2043
                        $row['insert_date'],
2044
                        DATE_TIME_FORMAT_LONG
2045
                    ),
2046
                    'lastedit_date' => api_convert_and_format_date(
2047
                        $row['lastedit_date'],
2048
                        DATE_TIME_FORMAT_LONG
2049
                    ),
2050
                    'actions' => $modify_icons,
2051
                ];
2052
2053
                $results[] = $announcement;
2054
            }
2055
            $displayed[] = $row['id'];
2056
        }
2057
2058
        return $results;
2059
    }
2060
2061
    /**
2062
     * @return int
2063
     */
2064
    public static function getNumberAnnouncements()
2065
    {
2066
        // Maximum title messages to display
2067
        $maximum = '12';
2068
        // Database Table Definitions
2069
        $tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
2070
        $tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
2071
2072
        $session_id = api_get_session_id();
2073
        $courseInfo = api_get_course_info();
2074
        $courseId = $courseInfo['real_id'];
2075
        $userId = api_get_user_id();
2076
        $condition_session = api_get_session_condition(
2077
            $session_id,
2078
            true,
2079
            true,
2080
            'announcement.session_id'
2081
        );
2082
2083
        if (api_is_allowed_to_edit(false, true)) {
2084
            // check teacher status
2085
            if (empty($_GET['origin']) || $_GET['origin'] !== 'learnpath') {
2086
                if (api_get_group_id() == 0) {
2087
                    $group_condition = '';
2088
                } else {
2089
                    $group_condition = " AND (ip.to_group_id='".api_get_group_id()."' OR ip.to_group_id = 0 OR ip.to_group_id IS NULL)";
2090
                }
2091
2092
                $sql = "SELECT
2093
                            announcement.*,
2094
                            ip.visibility,
2095
                            ip.to_group_id,
2096
                            ip.insert_user_id
2097
                        FROM $tbl_announcement announcement
2098
                        INNER JOIN $tbl_item_property ip
2099
                        ON (announcement.c_id = ip.c_id AND announcement.id = ip.ref)
2100
                        WHERE
2101
                            announcement.c_id = $courseId AND
2102
                            ip.c_id = $courseId AND
2103
                            ip.tool = 'announcement' AND
2104
                            ip.visibility <> '2'
2105
                            $group_condition
2106
                            $condition_session
2107
                        GROUP BY ip.ref
2108
                        ORDER BY display_order DESC
2109
                        LIMIT 0, $maximum";
2110
            }
2111
        } else {
2112
            // students only get to see the visible announcements
2113
            if (empty($_GET['origin']) || $_GET['origin'] !== 'learnpath') {
2114
                $group_memberships = GroupManager::get_group_ids(
2115
                    $courseInfo['real_id'],
2116
                    $userId
2117
                );
2118
2119
                if ((api_get_course_setting('allow_user_edit_announcement') &&
2120
                    !api_is_anonymous())
2121
                ) {
2122
                    if (api_get_group_id() == 0) {
2123
                        $cond_user_id = " AND (
2124
                        ip.lastedit_user_id = '".$userId."' OR (
2125
                            ip.to_user_id='".$userId."' OR
2126
                            ip.to_group_id IN (0, ".implode(", ", $group_memberships).") OR
2127
                            ip.to_group_id IS NULL
2128
                            )
2129
                        )
2130
                        ";
2131
                    } else {
2132
                        $cond_user_id = " AND (
2133
                            ip.lastedit_user_id = '".$userId."'OR
2134
                            ip.to_group_id IN (0, ".api_get_group_id().") OR
2135
                            ip.to_group_id IS NULL
2136
                        )";
2137
                    }
2138
                } else {
2139
                    if (api_get_group_id() == 0) {
2140
                        $cond_user_id = " AND (
2141
                            ip.to_user_id='".$userId."' OR
2142
                            ip.to_group_id IN (0, ".implode(", ", $group_memberships).") OR
2143
                            ip.to_group_id IS NULL
2144
                        ) ";
2145
                    } else {
2146
                        $cond_user_id = " AND (
2147
                            ip.to_user_id='".$userId."' OR
2148
                            ip.to_group_id IN (0, ".api_get_group_id().") OR
2149
                            ip.to_group_id IS NULL
2150
                        ) ";
2151
                    }
2152
                }
2153
2154
                // the user is member of several groups => display personal announcements AND
2155
                // his group announcements AND the general announcements
2156
                if (is_array($group_memberships) && count($group_memberships) > 0) {
2157
                    $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
2158
                            FROM $tbl_announcement announcement
2159
                            INNER JOIN $tbl_item_property ip
2160
                            ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
2161
                            WHERE
2162
                                announcement.c_id = $courseId AND
2163
                                ip.c_id = $courseId AND
2164
                                ip.tool='announcement' AND
2165
                                ip.visibility='1'
2166
                                $cond_user_id
2167
                                $condition_session
2168
                            GROUP BY ip.ref
2169
                            ORDER BY display_order DESC
2170
                            LIMIT 0, $maximum";
2171
                } else {
2172
                    // the user is not member of any group
2173
                    // this is an identified user => show the general announcements AND his personal announcements
2174
                    if ($userId) {
2175
                        if ((api_get_course_setting('allow_user_edit_announcement') &&
2176
                            !api_is_anonymous())
2177
                        ) {
2178
                            $cond_user_id = " AND (
2179
                                ip.lastedit_user_id = '".$userId."' OR
2180
                                ( ip.to_user_id='".$userId."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL)
2181
                            ) ";
2182
                        } else {
2183
                            $cond_user_id = " AND ( ip.to_user_id='".$userId."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL) ";
2184
                        }
2185
                        $sql = "SELECT announcement.*, ip.visibility, ip.to_group_id, ip.insert_user_id
2186
                                FROM $tbl_announcement announcement
2187
                                INNER JOIN $tbl_item_property ip
2188
                                ON (announcement.c_id = ip.c_id AND announcement.id = ip.ref)
2189
                                WHERE
2190
                                    announcement.c_id = $courseId AND
2191
                                    ip.c_id = $courseId AND
2192
                                    ip.tool='announcement' AND
2193
                                    ip.visibility='1'
2194
                                    $cond_user_id
2195
                                    $condition_session
2196
                                GROUP BY ip.ref
2197
                                ORDER BY display_order DESC
2198
                                LIMIT 0, $maximum";
2199
                    } else {
2200
                        if (api_get_course_setting('allow_user_edit_announcement')) {
2201
                            $cond_user_id = " AND (
2202
                                ip.lastedit_user_id = '".api_get_user_id()."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL
2203
                            ) ";
2204
                        } else {
2205
                            $cond_user_id = " AND ip.to_group_id='0' ";
2206
                        }
2207
2208
                        // the user is not identiefied => show only the general announcements
2209
                        $sql = "SELECT
2210
                                    announcement.*,
2211
                                    ip.visibility,
2212
                                    ip.to_group_id,
2213
                                    ip.insert_user_id
2214
                                FROM $tbl_announcement announcement
2215
                                INNER JOIN $tbl_item_property ip
2216
                                ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
2217
                                WHERE
2218
                                    announcement.c_id = $courseId AND
2219
                                    ip.c_id = $courseId AND
2220
                                    ip.tool='announcement' AND
2221
                                    ip.visibility='1' AND
2222
                                    ip.to_group_id='0'
2223
                                    $condition_session
2224
                                GROUP BY ip.ref
2225
                                ORDER BY display_order DESC
2226
                                LIMIT 0, $maximum";
2227
                    }
2228
                }
2229
            }
2230
        }
2231
2232
        $result = Database::query($sql);
2233
2234
        return Database::num_rows($result);
2235
    }
2236
2237
    public static function createEvent(
2238
        int $announcementId,
2239
        string $startDate,
2240
        string $endDate,
2241
        array $choosenUsers = []
2242
    ): ?CCalendarEvent {
2243
        $em = Database::getManager();
2244
        $announcement = $em->find('ChamiloCourseBundle:CAnnouncement', $announcementId);
2245
        $agenda = new Agenda('course');
2246
2247
        $eventId = $agenda->addEvent(
2248
            $startDate,
2249
            $endDate,
2250
            '',
2251
            $announcement->getTitle(),
2252
            $announcement->getContent(),
2253
            $choosenUsers,
2254
            false,
2255
            null,
2256
            [],
2257
            [],
2258
            null,
2259
            ''
2260
        );
2261
2262
        if ($eventId) {
2263
            return $em->find('ChamiloCourseBundle:CCalendarEvent', $eventId);
2264
        }
2265
2266
        return null;
2267
    }
2268
}
2269