Add entity manager for course annuncement #2644

pull/2715/head
Angel Fernando Quiroz Campos 7 years ago
parent f4292bcc6f
commit 9eca9ce79d
  1. 443
      main/inc/lib/AnnouncementManager.php
  2. 190
      src/CourseBundle/Entity/Manager/AnnouncementManager.php
  3. 6
      src/CourseBundle/Resources/config/services.yml

@ -1,6 +1,7 @@
<?php
/* For licensing terms, see /license.txt */
use Chamilo\CoreBundle\Framework\Container;
use Chamilo\CourseBundle\Entity\CAnnouncement;
use Chamilo\CourseBundle\Entity\CItemProperty;
@ -1505,9 +1506,6 @@ class AnnouncementManager
$courseId = 0,
$sessionId = 0
) {
$tbl_announcement = Database::get_course_table(TABLE_ANNOUNCEMENT);
$tbl_item_property = Database::get_course_table(TABLE_ITEM_PROPERTY);
$user_id = $userId ?: api_get_user_id();
$group_id = api_get_group_id();
$session_id = $sessionId ?: api_get_session_id();
@ -1523,255 +1521,28 @@ class AnnouncementManager
return [];
}
$condition_session = api_get_session_condition(
$session_id,
true,
true,
'announcement.session_id'
);
$group_memberships = GroupManager::get_group_ids(
$courseId,
api_get_user_id()
);
$allowUserEditSetting = api_get_course_setting('allow_user_edit_announcement');
$select = ' DISTINCT
announcement.*,
ip.visibility,
ip.to_group_id,
ip.insert_user_id,
ip.insert_date,
ip.lastedit_date';
$groupBy = ' GROUP BY announcement.iid';
if ($getCount) {
$groupBy = '';
$select = ' COUNT(DISTINCT announcement.iid) count';
}
$searchCondition = '';
if (!empty($titleToSearch)) {
$titleToSearch = Database::escape_string($titleToSearch);
$searchCondition .= " AND (title LIKE '%$titleToSearch%')";
}
if (!empty($userIdToSearch)) {
$userIdToSearch = (int) $userIdToSearch;
$searchCondition .= " AND (ip.insert_user_id = $userIdToSearch)";
}
$allowOnlyGroup = api_get_configuration_value('hide_base_course_announcements_in_group');
$extraGroupCondition = '';
if ($allowOnlyGroup) {
$extraGroupCondition = " AND ip.to_group_id = $group_id ";
}
if (api_is_allowed_to_edit(false, true) ||
($allowUserEditSetting && !api_is_anonymous())
) {
// A.1. you are a course admin with a USER filter
// => see only the messages of this specific user + the messages of the group (s)he is member of.
//if (!empty($user_id)) {
if (0) {
if (is_array($group_memberships) &&
count($group_memberships) > 0
) {
$sql = "SELECT $select
FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND ip.c_id = announcement.c_id)
WHERE
announcement.c_id = $courseId AND
ip.c_id = $courseId AND
ip.tool = 'announcement' AND
(
ip.to_user_id = $user_id OR
ip.to_group_id IS NULL OR
ip.to_group_id IN (0, ".implode(", ", $group_memberships).")
) AND
ip.visibility IN ('1', '0')
$condition_session
$searchCondition
ORDER BY display_order DESC";
} else {
$sql = "SELECT $select
FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND ip.c_id = announcement.c_id)
WHERE
announcement.c_id = $courseId AND
ip.c_id = $courseId AND
ip.tool ='announcement' AND
(ip.to_user_id = $user_id OR ip.to_group_id='0' OR ip.to_group_id IS NULL) AND
ip.visibility IN ('1', '0')
$condition_session
$searchCondition
ORDER BY display_order DESC";
}
} elseif ($group_id != 0) {
// A.2. you are a course admin with a GROUP filter
// => see only the messages of this specific group
$sql = "SELECT $select
FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE
ip.tool='announcement' AND
announcement.c_id = $courseId AND
ip.c_id = $courseId AND
ip.visibility<>'2' AND
(ip.to_group_id = $group_id OR ip.to_group_id='0' OR ip.to_group_id IS NULL)
$condition_session
$searchCondition
$extraGroupCondition
$groupBy
ORDER BY display_order DESC";
} else {
// A.3 you are a course admin without any group or user filter
// A.3.a you are a course admin without user or group filter but WITH studentview
// => see all the messages of all the users and groups without editing possibilities
if (isset($isStudentView) && $isStudentView == 'true') {
$sql = "SELECT $select
FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE
ip.tool='announcement' AND
announcement.c_id = $courseId AND
ip.c_id = $courseId AND
ip.visibility='1'
$condition_session
$searchCondition
$groupBy
ORDER BY display_order DESC";
} else {
// A.3.a you are a course admin without user or group filter and WTIHOUT studentview (= the normal course admin view)
// => see all the messages of all the users and groups with editing possibilities
$sql = "SELECT $select
FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE
ip.tool = 'announcement' AND
announcement.c_id = $courseId AND
ip.c_id = $courseId AND
(ip.visibility='0' OR ip.visibility='1')
$condition_session
$searchCondition
$groupBy
ORDER BY display_order DESC";
}
}
} else {
// STUDENT
if (is_array($group_memberships) && count($group_memberships) > 0) {
if ($allowUserEditSetting && !api_is_anonymous()) {
if ($group_id == 0) {
// No group
$cond_user_id = " AND (
ip.lastedit_user_id = '".$user_id."' OR (
(ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) OR
(ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships)."))
)
) ";
} else {
$cond_user_id = " AND (
ip.lastedit_user_id = '".$user_id."' OR ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".$group_id.")
)";
$cond_user_id .= $extraGroupCondition;
}
} else {
if ($group_id == 0) {
$cond_user_id = " AND (
(ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".implode(", ", $group_memberships)."))
) ";
} else {
$cond_user_id = " AND (
(ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND (ip.to_group_id IS NULL OR ip.to_group_id IN (0, ".$group_id."))
)";
$cond_user_id .= $extraGroupCondition;
}
}
$sql = "SELECT $select
FROM $tbl_announcement announcement INNER JOIN
$tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE
announcement.c_id = $courseId AND
ip.c_id = $courseId AND
ip.tool='announcement'
$cond_user_id
$condition_session
$searchCondition
AND ip.visibility='1'
$groupBy
ORDER BY display_order DESC";
} else {
if ($user_id) {
if ($allowUserEditSetting && !api_is_anonymous()) {
$cond_user_id = " AND (
ip.lastedit_user_id = '".api_get_user_id()."' OR
((ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND (ip.to_group_id='0' OR ip.to_group_id IS NULL))
) ";
} else {
$cond_user_id = " AND ((ip.to_user_id='$user_id' OR ip.to_user_id IS NULL) AND (ip.to_group_id='0' OR ip.to_group_id IS NULL) ) ";
}
$sql = "SELECT $select
FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE
announcement.c_id = $courseId AND
ip.c_id = $courseId AND
ip.tool='announcement'
$cond_user_id
$condition_session
$searchCondition
AND ip.visibility='1'
AND announcement.session_id IN(0, ".$session_id.")
$groupBy
ORDER BY display_order DESC";
} else {
if (($allowUserEditSetting && !api_is_anonymous())) {
$cond_user_id = " AND (
ip.lastedit_user_id = '".$user_id."' OR ip.to_group_id='0' OR ip.to_group_id IS NULL
)";
} else {
$cond_user_id = " AND ip.to_group_id='0' OR ip.to_group_id IS NULL ";
}
$sql = "SELECT $select
FROM $tbl_announcement announcement
INNER JOIN $tbl_item_property ip
ON (announcement.id = ip.ref AND announcement.c_id = ip.c_id)
WHERE
announcement.c_id = $courseId AND
ip.c_id = $courseId AND
ip.tool='announcement'
$cond_user_id
$condition_session
$searchCondition AND
ip.visibility='1' AND
announcement.session_id IN ( 0,".api_get_session_id().")
$groupBy
";
}
}
}
if (!is_null($start) && !is_null($limit)) {
$start = intval($start);
$limit = intval($limit);
$sql .= " LIMIT $start, $limit";
}
$result = Container::$container
->get('chamilo_course.entity.manager.announcement_manager')
->getAnnouncements(
api_get_user_entity($user_id),
api_get_course_entity($courseId),
api_get_group_entity($group_id),
api_get_session_entity($session_id),
api_get_course_setting('allow_user_edit_announcement') === 'true',
api_get_configuration_value('hide_base_course_announcements_in_group') === true,
$getCount,
$start,
$limit,
$titleToSearch,
$userIdToSearch ? api_get_user_entity($userIdToSearch) : null
);
$result = Database::query($sql);
if ($getCount) {
$result = Database::fetch_array($result, 'ASSOC');
return $result['count'];
return $result;
}
$iterator = 1;
@ -1806,107 +1577,107 @@ class AnnouncementManager
);
}
while ($row = Database::fetch_array($result, 'ASSOC')) {
if (!in_array($row['id'], $displayed)) {
$sent_to_icon = '';
// the email icon
if ($row['email_sent'] == '1') {
$sent_to_icon = ' '.$emailIcon;
}
$groupReference = ($row['to_group_id'] > 0) ? ' <span class="label label-info">'.get_lang('Group').'</span> ' : '';
$title = $row['title'].$groupReference.$sent_to_icon;
$item_visibility = api_get_item_visibility(
$courseInfo,
TOOL_ANNOUNCEMENT,
$row['id'],
$session_id
);
$row['visibility'] = $item_visibility;
for ($z = 0; $z < count($result); $z += 2) {
/** @var CAnnouncement $a */
$a = $result[$z];
/** @var CItemProperty $i */
$i = $result[$z + 1];
// show attachment list
$attachment_list = self::get_attachment($row['id']);
if (in_array($a->getId(), $displayed)) {
continue;
}
$attachment_icon = '';
if (count($attachment_list) > 0) {
$attachment_icon = ' '.$attachmentIcon;
}
$sent_to_icon = $a->getEmailSent() ? " $emailIcon" : '';
/* TITLE */
$user_info = api_get_user_info($row['insert_user_id']);
$username = sprintf(get_lang("LoginX"), $user_info['username']);
$groupReference = $i->getGroup() !== null
? ' <span class="label label-info">'.get_lang('Group').'</span> '
: '';
$title = $a->getTitle().$groupReference.$sent_to_icon;
$item_visibility = api_get_item_visibility($courseInfo, TOOL_ANNOUNCEMENT, $a->getId(), $sessionId);
$i->setVisibility($item_visibility);
$username_span = Display::tag(
'span',
$user_info['complete_name'],
['title' => $username]
);
// show attachment list
$attachment_list = self::get_attachment($a->getId());
$title = Display::url(
$title.$attachment_icon,
$actionUrl.'&action=view&id='.$row['id']
);
$attachment_icon = '';
if (count($attachment_list) > 0) {
$attachment_icon = ' '.$attachmentIcon;
}
// we can edit if : we are the teacher OR the element belongs to
// the session we are coaching OR the option to allow users to edit is on
if (api_is_allowed_to_edit(false, true) ||
(api_is_session_general_coach() && api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $row['id'])) ||
(api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous()) ||
($row['to_group_id'] == $group_id && $isTutor)
) {
$modify_icons = "<a href=\"".$actionUrl."&action=modify&id=".$row['id']."\">".$editIcon."</a>";
if ($row['visibility'] == 1) {
$image_visibility = "visible";
$alt_visibility = get_lang('Hide');
} else {
$image_visibility = "invisible";
$alt_visibility = get_lang('Visible');
}
$modify_icons .= "<a href=\"".$actionUrl."&action=showhide&id=".$row['id']."&sec_token=".$stok."\">".
Display::return_icon($image_visibility.'.png', $alt_visibility, '', ICON_SIZE_SMALL)."</a>";
/* TITLE */
$username_span = Display::tag(
'span',
UserManager::formatUserFullName($i->getInsertUser()),
['title' => $i->getInsertUser()->getUsername()]
);
// DISPLAY MOVE UP COMMAND only if it is not the top announcement
if ($iterator != 1) {
$modify_icons .= "<a href=\"".$actionUrl."&action=move&up=".$row["id"]."&sec_token=".$stok."\">".
Display::return_icon('up.gif', get_lang('Up'))."</a>";
} else {
$modify_icons .= Display::return_icon('up_na.gif', get_lang('Up'));
}
if ($iterator < $bottomAnnouncement) {
$modify_icons .= "<a href=\"".$actionUrl."&action=move&down=".$row["id"]."&sec_token=".$stok."\">".
Display::return_icon('down.gif', get_lang('Down'))."</a>";
} else {
$modify_icons .= Display::return_icon('down_na.gif', get_lang('Down'));
}
if (api_is_allowed_to_edit(false, true)) {
$modify_icons .= "<a href=\"".$actionUrl."&action=delete&id=".$row['id']."&sec_token=".$stok."\" onclick=\"javascript:if(!confirm('".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES, api_get_system_encoding()))."')) return false;\">".
$deleteIcon."</a>";
}
$iterator++;
$title = Display::url(
$title.$attachment_icon,
$actionUrl.'&action=view&id='.$a->getId()
);
$aGroupId = $i->getGroup() ? $i->getGroup()->getId() : 0;
// we can edit if : we are the teacher OR the element belongs to
// the session we are coaching OR the option to allow users to edit is on
if (api_is_allowed_to_edit(false, true) ||
(api_is_session_general_coach() && api_is_element_in_the_session(TOOL_ANNOUNCEMENT, $a->getId())) ||
(api_get_course_setting('allow_user_edit_announcement') && !api_is_anonymous()) ||
($aGroupId == $group_id && $isTutor)
) {
$modify_icons = "<a href=\"".$actionUrl."&action=modify&id=".$a->getId()."\">".$editIcon."</a>";
if ($i->getVisibility() == 1) {
$image_visibility = "visible";
$alt_visibility = get_lang('Hide');
} else {
$modify_icons = Display::url(
Display::return_icon('default.png'),
$actionUrl.'&action=view&id='.$row['id']
);
$image_visibility = "invisible";
$alt_visibility = get_lang('Visible');
}
$modify_icons .= "<a href=\"".$actionUrl."&action=showhide&id=".$a->getId()."&sec_token=".$stok."\">".
Display::return_icon($image_visibility.'.png', $alt_visibility, '', ICON_SIZE_SMALL)."</a>";
$announcement = [
'id' => $row['id'],
'title' => $title,
'username' => $username_span,
'insert_date' => api_convert_and_format_date(
$row['insert_date'],
DATE_TIME_FORMAT_LONG
),
'lastedit_date' => api_convert_and_format_date(
$row['lastedit_date'],
DATE_TIME_FORMAT_LONG
),
'actions' => $modify_icons,
];
$results[] = $announcement;
// DISPLAY MOVE UP COMMAND only if it is not the top announcement
if ($iterator != 1) {
$modify_icons .= "<a href=\"".$actionUrl."&action=move&up=".$a->getId()."&sec_token=".$stok."\">".
Display::return_icon('up.gif', get_lang('Up'))."</a>";
} else {
$modify_icons .= Display::return_icon('up_na.gif', get_lang('Up'));
}
if ($iterator < $bottomAnnouncement) {
$modify_icons .= "<a href=\"".$actionUrl."&action=move&down=".$a->getId()."&sec_token=".$stok."\">".
Display::return_icon('down.gif', get_lang('Down'))."</a>";
} else {
$modify_icons .= Display::return_icon('down_na.gif', get_lang('Down'));
}
if (api_is_allowed_to_edit(false, true)) {
$modify_icons .= "<a href=\"".$actionUrl."&action=delete&id=".$a->getId()."&sec_token=".$stok."\" onclick=\"javascript:if(!confirm('".addslashes(api_htmlentities(get_lang('ConfirmYourChoice'), ENT_QUOTES, api_get_system_encoding()))."')) return false;\">".
$deleteIcon."</a>";
}
$iterator++;
} else {
$modify_icons = Display::url(
Display::return_icon('default.png'),
$actionUrl.'&action=view&id='.$a->getId()
);
}
$displayed[] = $row['id'];
$announcement = [
'id' => $a->getId(),
'title' => $title,
'username' => $username_span,
'insert_date' => api_convert_and_format_date(
$i->getInsertDate(),
DATE_TIME_FORMAT_LONG
),
'lastedit_date' => api_convert_and_format_date(
$i->getLasteditDate(),
DATE_TIME_FORMAT_LONG
),
'actions' => $modify_icons,
];
$results[] = $announcement;
$displayed[] = $a->getId();
}
return $results;

@ -0,0 +1,190 @@
<?php
/* For licensing terms, see /license.txt */
namespace Chamilo\CourseBundle\Entity\Manager;
use Chamilo\CoreBundle\Entity\Course;
use Chamilo\CoreBundle\Entity\Session;
use Chamilo\CourseBundle\Entity\CGroupInfo;
use Chamilo\UserBundle\Entity\User;
use Sonata\CoreBundle\Model\BaseEntityManager;
class AnnouncementManager extends BaseEntityManager
{
/**
* @param User $user
* @param Course $course
* @param CGroupInfo|null $group
* @param Session|null $session
* @param bool $allowUserEditSetting
* @param bool $allowOnlyGroup
* @param bool $getCount
* @param int|null $start
* @param int|null $limit
* @param string $titleToSearch
* @param User|null $userToSearch
*
* @return mixed
* @throws \Doctrine\ORM\NonUniqueResultException
*/
public function getAnnouncements(
User $user,
Course $course,
CGroupInfo $group = null,
Session $session = null,
$allowUserEditSetting,
$allowOnlyGroup,
$getCount = false,
$start = null,
$limit = null,
$titleToSearch = '',
User $userToSearch = null
) {
$sessionId = $session ? $session->getId() : 0;
$conditionSession = api_get_session_condition(
$sessionId,
true,
true,
'announcement.sessionId'
);
$select = 'DISTINCT announcement, ip';
$groupBy = 'GROUP BY announcement.iid';
if ($getCount) {
$groupBy = '';
$select = 'COUNT(DISTINCT announcement) AS count';
}
$parameters = [];
$searchCondition = '';
if (!empty($titleToSearch)) {
$parameters['search_title'] = "%$titleToSearch%";
$searchCondition .= " AND (title LIKE :search_title) ";
}
if (!empty($userToSearch)) {
$searchCondition .= " AND (ip.insertUser = ".$userToSearch->getId().") ";
}
$extraGroupCondition = '';
if ($allowOnlyGroup) {
$extraGroupCondition = ' AND ip.group = '.$group->getId().' ';
}
if (api_is_allowed_to_edit(false, true)
|| ($allowUserEditSetting && !api_is_anonymous())
) {
$dqlCondition = "AND (ip.visibility = 0 OR ip.visibility = 1)";
if (!empty($group)) {
$dqlCondition = "AND ip.visibility != 2 AND
(ip.group = ".$group->getId()." OR ip.group IS NULL )
$extraGroupCondition";
}
} else {
$groupMemberships = \GroupManager::get_group_ids(
$course->getId(),
$user->getId()
);
if (is_array($groupMemberships) && count($groupMemberships) > 0) {
if ($allowUserEditSetting && !api_is_anonymous()) {
$condUserId = " AND (
ip.lasteditUserId = ".$user->getId()." OR(
(ip.toUser = ".$user->getId()." OR ip.toUser IS NULL) OR
(ip.group IS NULL OR ip.group IN (0, ".implode(', ', $groupMemberships)."))
)
) ";
if (!empty($group)) {
$condUserId = " AND (
ip.lasteditUserId = ".$user->getId()." OR ip.group IS NULL OR ip.group IN (0, ".$group->getId()
.")
) ".$extraGroupCondition;
}
} else {
$condUserId = " AND (
(ip.toUser = ".$user->getId().") OR ip.toUser IS NULL) AND
(ip.group IS NULL OR ip.group IN (0, ".implode(', ', $groupMemberships)."))
) ";
if (!empty($group)) {
$condUserId = " AND (
(ip.toUser = ".$user->getId().") OR ip.toUser IS NULL) AND
(ip.group IS NULL OR ip.group IN (0, ".$group->getId()."))
) ".$extraGroupCondition;
}
}
$dqlCondition = "$condUserId AND ip.visibility = 1";
} else {
if (!empty($user->getId())) {
$condUserId = " AND (
(ip.toUser = ".$user->getId()." OR ip.toUser IS NULL) AND
(ip.group = 0 OR ip.group IS NULL)
) ";
if ($allowUserEditSetting && !api_is_anonymous()) {
$condUserId = " AND (
ip.lasteditUserId = ".$user->getId()." OR
(
(ip.toUser = ".$user->getId()." OR ip.toUser IS NULL) AND
(ip.group = 0 OR ip.group IS NULL)
)
) ";
}
$dqlCondition = "$condUserId
AND ip.visibility = 1
AND announcement.sessionId IN (0, $sessionId)";
} else {
$condUserId = " AND ip.group = 0 OR ip.group IS NULL ";
if ($allowUserEditSetting && !api_is_anonymous()) {
$condUserId = " AND (
ip.lastEditUserId = ".$user->getId()." OR ip.group = 0 OR ip.group IS NULL
) ";
}
$dqlCondition = "$condUserId
AND ip.visibility = 1
AND announcement.sessionId IN (0, $sessionId)";
}
}
}
$dql = "SELECT $select
FROM ChamiloCourseBundle:CAnnouncement announcement
INNER JOIN ChamiloCourseBundle:CItemProperty AS ip
WITH (announcement.id = ip.ref AND announcement.cId = ip.course)
WHERE
ip.tool = 'announcement' AND
announcement.cId = ".$course->getId()."
$dqlCondition
$conditionSession
$searchCondition
$groupBy
ORDER BY announcement.displayOrder DESC";
$query = $this->getEntityManager()
->createQuery($dql)
->setParameters($parameters);
if (!is_null($start) && !is_null($limit)) {
$query
->setFirstResult($start)
->setMaxResults($limit);
}
if ($getCount) {
return $query->getResult();
}
return $query->getResult();
}
}

@ -5,7 +5,9 @@ parameters:
chamilo_course.settings.manager.class: Chamilo\CourseBundle\Manager\SettingsManager
chamilo_course.settings.schema_registry.class: Sylius\Component\Registry\ServiceRegistry
chamilo_course.entity.manager.group_manager.class: Chamilo\CourseBundle\Entity\Manager\GroupManager
chamilo_course.entity.manager.announcement_manager.class: Chamilo\CourseBundle\Entity\Manager\AnnouncementManager
chamilo_course.entity.group: Chamilo\CourseBundle\Entity\CGroupInfo
chamilo_course.entity.announcement: Chamilo\CourseBundle\Entity\CAnnouncement
services:
# Managers
@ -13,6 +15,10 @@ services:
class: '%chamilo_course.entity.manager.group_manager.class%'
arguments: ['%chamilo_course.entity.group%', '@doctrine']
chamilo_course.entity.manager.announcement_manager:
class: '%chamilo_course.entity.manager.announcement_manager.class%'
arguments: ['%chamilo_course.entity.announcement%', '@doctrine']
# Event Listeners
chamilo_course.listener.course:
class: Chamilo\CourseBundle\EventListener\CourseListener

Loading…
Cancel
Save