public/plugin/learning_calendar/LearningCalendarPlugin.php
<?php
/* For license terms, see /license.txt */
use Chamilo\CoreBundle\Component\Utils\ActionIcon;
/**
* Class LearningCalendarPlugin.
*/
class LearningCalendarPlugin extends Plugin
{
const EVENT_TYPE_TAKEN = 1;
const EVENT_TYPE_EXAM = 2;
const EVENT_TYPE_FREE = 3;
/**
* Class constructor.
*/
protected function __construct()
{
$version = '0.1';
$author = 'Julio Montoya';
parent::__construct($version, $author, ['enabled' => 'boolean']);
$this->setHasPersonalEvents(true);
}
/**
* Event definition.
*
* @return array
*/
public function getEventTypeList()
{
return [
self::EVENT_TYPE_TAKEN => ['color' => 'red', 'name' => self::get_lang('EventTypeTaken')],
self::EVENT_TYPE_EXAM => ['color' => 'yellow', 'name' => self::get_lang('EventTypeExam')],
self::EVENT_TYPE_FREE => ['color' => 'green', 'name' => self::get_lang('EventTypeFree')],
];
}
/**
* @return array
*/
public function getEventTypeColorList()
{
$list = $this->getEventTypeList();
$newList = [];
foreach ($list as $eventId => $event) {
$newList[$eventId] = $event['color'];
}
return $newList;
}
/**
* Get the class instance.
*
* @return $this
*/
public static function create()
{
static $result = null;
return $result ?: $result = new self();
}
/**
* Get the plugin directory name.
*/
public function get_name()
{
return 'learning_calendar';
}
/**
* Install the plugin. Setup the database.
*/
public function install()
{
$sql = "
CREATE TABLE IF NOT EXISTS learning_calendar(
id int not null AUTO_INCREMENT primary key,
title varchar(255) not null default '',
description longtext default null,
total_hours int not null default 0,
minutes_per_day int not null default 0,
disabled int default 0,
author_id int(11) not null
)
";
Database::query($sql);
$sql = "
CREATE TABLE IF NOT EXISTS learning_calendar_events(
id int not null AUTO_INCREMENT primary key,
title varchar(255) default '',
calendar_id int not null,
start_date date not null,
end_date date not null,
type int not null
)
";
Database::query($sql);
$sql = '
CREATE TABLE IF NOT EXISTS learning_calendar_user(
id int not null AUTO_INCREMENT primary key,
user_id int(11) not null,
calendar_id int not null
)
';
Database::query($sql);
$sql = '
CREATE TABLE IF NOT EXISTS learning_calendar_control_point(
id int not null AUTO_INCREMENT primary key,
user_id int(11) not null,
control_date date not null,
control_value int not null,
created_at datetime not null,
updated_at datetime not null
)
';
Database::query($sql);
$extraField = new ExtraField('lp_item');
$params = [
'display_text' => $this->get_lang('Learning calendarOneDayMarker'),
'variable' => 'calendar',
'visible_to_self' => 1,
'changeable' => 1,
'visible_to_others' => 1,
'value_type' => ExtraField::FIELD_TYPE_CHECKBOX,
];
$extraField->save($params);
$extraField = new ExtraField('course');
$params = [
'display_text' => $this->get_lang('Course duration (h)'),
'variable' => 'course_hours_duration',
'visible_to_self' => 1,
'changeable' => 1,
'visible_to_others' => 1,
'value_type' => ExtraField::FIELD_TYPE_TEXT,
];
$extraField->save($params);
return true;
}
/**
* Uninstall the plugin.
*/
public function uninstall()
{
$tables = [
'learning_calendar',
'learning_calendar_events',
'learning_calendar_user',
];
foreach ($tables as $table) {
$sql = "DROP TABLE IF EXISTS $table";
Database::query($sql);
}
$extraField = new ExtraField('lp_item');
$fieldInfo = $extraField->get_handler_field_info_by_field_variable('calendar');
if ($fieldInfo) {
$extraField->delete($fieldInfo['id']);
}
$extraField = new ExtraField('course');
$fieldInfo = $extraField->get_handler_field_info_by_field_variable('course_hours_duration');
if ($fieldInfo) {
$extraField->delete($fieldInfo['id']);
}
return true;
}
/**
* @param int $from
* @param int $numberOfItems
* @param int $column
* @param string $direction
*
* @return array
*/
public function getCalendars(
$from,
$numberOfItems,
$column,
$direction = 'DESC'
) {
$column = (int) $column;
$from = (int) $from;
$numberOfItems = (int) $numberOfItems;
$direction = strtoupper($direction);
if (!in_array($direction, ['ASC', 'DESC'])) {
$direction = 'DESC';
}
if (api_is_platform_admin()) {
$sql = 'SELECT * FROM learning_calendar';
} else {
$userId = api_get_user_id();
$sql = "SELECT * FROM learning_calendar WHERE author_id = $userId";
}
$sql .= " LIMIT $from, $numberOfItems ";
$result = Database::query($sql);
$list = [];
$link = api_get_path(WEB_PLUGIN_PATH).'learning_calendar/start.php';
while ($row = Database::fetch_array($result)) {
$id = $row['id'];
$row['title'] = Display::url(
$row['title'],
api_get_path(WEB_PLUGIN_PATH).'learning_calendar/calendar.php?id='.$id
);
$actions = Display::url(
Display::getMdiIcon(ActionIcon::EDIT, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Edit')),
$link.'?action=edit&id='.$id
);
$actions .= Display::url(
Display::getMdiIcon(ActionIcon::COPY_CONTENT, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Copy')),
$link.'?action=copy&id='.$id
);
$actions .= Display::url(
Display::getMdiIcon(ActionIcon::DELETE, 'ch-tool-icon', null, ICON_SIZE_SMALL, get_lang('Delete')),
$link.'?action=delete&id='.$id
);
$row['actions'] = $actions;
$list[] = $row;
}
return $list;
}
/**
* @param array $calendarInfo
* @param int $start
* @param int $end
* @param int $type
* @param bool $getCount
*
* @return array
*/
public function getCalendarsEventsByDate($calendarInfo, $start, $end, $type = 0, $getCount = false)
{
if (empty($calendarInfo)) {
if ($getCount) {
return 0;
}
return [];
}
$calendarId = (int) $calendarInfo['id'];
$start = (int) $start;
$end = (int) $end;
$startCondition = '';
$endCondition = '';
$typeCondition = '';
if (0 !== $start) {
$start = api_get_utc_datetime($start);
$startCondition = "AND start_date >= '".$start."'";
}
if (0 !== $end) {
$end = api_get_utc_datetime($end);
$endCondition = "AND (end_date <= '".$end."' OR end_date IS NULL)";
}
if (!empty($type)) {
$type = (int) $type;
$typeCondition = " AND type = $type ";
}
$select = '*';
if ($getCount) {
$select = 'count(id) count ';
}
$sql = "SELECT $select FROM learning_calendar_events
WHERE calendar_id = $calendarId $startCondition $endCondition $typeCondition";
$result = Database::query($sql);
if ($getCount) {
$row = Database::fetch_assoc($result);
return $row['count'];
}
$list = [];
while ($row = Database::fetch_assoc($result)) {
$list[] = $row;
}
return ['calendar' => $calendarInfo, 'events' => $list];
}
/**
* @param array $calendarInfo
*
* @return array
*/
public function getFirstCalendarDate($calendarInfo)
{
if (empty($calendarInfo)) {
return [];
}
$calendarId = (int) $calendarInfo['id'];
/*if (!empty($type)) {
$type = (int) $type;
$typeCondition = " AND type = $type ";
}*/
$sql = "SELECT start_date FROM learning_calendar_events
WHERE calendar_id = $calendarId ORDER BY start_date LIMIT 1";
$result = Database::query($sql);
$row = Database::fetch_assoc($result);
return $row['start_date'];
}
/**
* @return int
*/
public function getCalendarCount()
{
if (api_is_platform_admin()) {
$sql = 'select count(*) as count FROM learning_calendar';
} else {
$userId = api_get_user_id();
$sql = "select count(*) as count FROM learning_calendar WHERE author_id = $userId";
}
$result = Database::query($sql);
$result = Database::fetch_array($result);
return (int) $result['count'];
}
/**
* @param int $calendarId
*
* @return array
*/
public function getUsersPerCalendar($calendarId)
{
$calendarId = (int) $calendarId;
$sql = "SELECT * FROM learning_calendar_user
WHERE calendar_id = $calendarId";
$result = Database::query($sql);
$list = [];
while ($row = Database::fetch_assoc($result)) {
$userInfo = api_get_user_info($row['user_id']);
$userInfo['exam'] = 'exam';
$list[] = $userInfo;
}
return $list;
}
/**
* @param int $calendarId
*
* @return int
*/
public function getUsersPerCalendarCount($calendarId)
{
$calendarId = (int) $calendarId;
$sql = "SELECT count(id) as count FROM learning_calendar_user
WHERE calendar_id = $calendarId";
$result = Database::query($sql);
$row = Database::fetch_assoc($result);
return (int) $row['count'];
}
/**
* @param int $id
*/
public function toggleVisibility($id)
{
$extraField = new ExtraField('lp_item');
$fieldInfo = $extraField->get_handler_field_info_by_field_variable('calendar');
if ($fieldInfo) {
$itemInfo = $this->getItemVisibility($id);
if (empty($itemInfo)) {
$extraField = new ExtraFieldValue('lp_item');
$value = 1;
$params = [
'field_id' => $fieldInfo['id'],
'value' => $value,
'item_id' => $id,
];
$extraField->save($params);
} else {
$newValue = 1 === (int) $itemInfo['value'] ? 0 : 1;
$extraField = new ExtraFieldValue('lp_item');
$params = [
'id' => $itemInfo['id'],
'value' => $newValue,
];
$extraField->update($params);
}
}
}
/**
* @param int $id
*
* @return array
*/
public function getItemVisibility($id)
{
$extraField = new ExtraFieldValue('lp_item');
$values = $extraField->get_values_by_handler_and_field_variable($id, 'calendar');
if (empty($values)) {
return [];
}
return $values;
}
/**
* @param int $calendarId
*
* @return array|mixed
*/
public function getCalendar($calendarId)
{
$calendarId = (int) $calendarId;
$sql = "SELECT * FROM learning_calendar WHERE id = $calendarId";
$result = Database::query($sql);
return Database::fetch_assoc($result);
}
/**
* @param int $userId
*
* @return array|mixed
*/
public function getUserCalendar($userId)
{
$userId = (int) $userId;
$sql = "SELECT * FROM learning_calendar_user WHERE user_id = $userId";
$result = Database::query($sql);
return Database::fetch_assoc($result);
}
/**
* @param int $userId
* @param int $start
* @param int $end
* @param int $type
* @param bool $getCount
*
* @return array|int
*/
public function getUserEvents($userId, $start, $end, $type = 0, $getCount = false)
{
$calendarRelUser = $this->getUserCalendar($userId);
if (!empty($calendarRelUser)) {
$calendar = $this->getCalendar($calendarRelUser['calendar_id']);
return $this->getCalendarsEventsByDate($calendar, $start, $end, $type, $getCount);
}
if ($getCount) {
return 0;
}
return [];
}
/**
* @param int $userId
*
* @return mixed|string
*/
public function getUserCalendarToString($userId)
{
$calendar = $this->getUserCalendar($userId);
if ($calendar) {
$calendarInfo = $this->getCalendar($calendar['calendar_id']);
return $calendarInfo['title'];
}
return '';
}
/**
* @param int $calendarId
* @param int $userId
*
* @return bool
*/
public function addUserToCalendar($calendarId, $userId)
{
$calendar = $this->getUserCalendar($userId);
if (empty($calendar)) {
$params = [
'calendar_id' => $calendarId,
'user_id' => $userId,
];
Database::insert('learning_calendar_user', $params);
return true;
}
return false;
}
/**
* @param int $calendarId
* @param int $userId
*
* @return bool
*/
public function updateUserToCalendar($calendarId, $userId)
{
$calendar = $this->getUserCalendar($userId);
if (!empty($calendar)) {
$params = [
'calendar_id' => $calendarId,
'user_id' => $userId,
];
Database::update('learning_calendar_user', $params, ['id = ?' => $calendar['id']]);
}
return true;
}
/**
* @param int $calendarId
* @param int $userId
*
* @return bool
*/
public function deleteAllCalendarFromUser($calendarId, $userId)
{
$calendarId = (int) $calendarId;
$userId = (int) $userId;
$sql = "DELETE FROM learning_calendar_user
WHERE user_id = $userId AND calendar_id = $calendarId";
Database::query($sql);
return true;
}
/*public static function getUserCalendar($calendarId, $userId)
{
$params = [
'calendar_id' => $calendarId,
'user_id' => $calendarId,
];
Database::insert('learning_calendar_user', $params);
return true;
}*/
public function getForm(FormValidator &$form)
{
$form->addText('title', get_lang('Title'));
$form->addText('total_hours', get_lang('Total hours'));
$form->addText('minutes_per_day', get_lang('Minutes per day'));
$form->addHtmlEditor('description', get_lang('Description'), false);
}
/**
* @param Agenda $agenda
* @param int $start
* @param int $end
*
* @return array
*/
public function getPersonalEvents($agenda, $start, $end)
{
$userId = api_get_user_id();
$events = $this->getUserEvents($userId, $start, $end);
if (empty($events)) {
return [];
}
$calendarInfo = $events['calendar'];
$events = $events['events'];
$list = [];
$typeList = $this->getEventTypeColorList();
foreach ($events as $row) {
$event = [];
$event['id'] = 'personal_'.$row['id'];
$event['title'] = $calendarInfo['title'];
$event['className'] = 'personal';
$color = isset($typeList[$row['type']]) ? $typeList[$row['type']] : $typeList[self::EVENT_TYPE_FREE];
$event['borderColor'] = $color;
$event['backgroundColor'] = $color;
$event['editable'] = false;
$event['sent_to'] = get_lang('Me');
$event['type'] = 'personal';
if (!empty($row['start_date'])) {
$event['start'] = $agenda->formatEventDate($row['start_date']);
$event['start_date_localtime'] = api_get_local_time($row['start_date']);
}
if (!empty($row['end_date'])) {
$event['end'] = $agenda->formatEventDate($row['end_date']);
$event['end_date_localtime'] = api_get_local_time($row['end_date']);
}
$event['description'] = 'plugin';
$event['allDay'] = 1;
$event['parent_event_id'] = 0;
$event['has_children'] = 0;
$list[] = $event;
}
return $list;
}
/**
* @param int $userId
* @param array $coursesAndSessions
*
* @return string
*/
public function getGradebookEvaluationListToString($userId, $coursesAndSessions)
{
$list = $this->getGradebookEvaluationList($userId, $coursesAndSessions);
$html = '';
if (!empty($list)) {
$html = implode(' ', array_column($list, 'title'));
}
return $html;
}
/**
* @param int $userId
* @param array $coursesAndSessions
*
* @return array
*/
public function getGradebookEvaluationList($userId, $coursesAndSessions)
{
$userId = (int) $userId;
if (empty($coursesAndSessions)) {
return 0;
}
$courseSessionConditionToString = '';
foreach ($coursesAndSessions as $sessionId => $courseList) {
if (isset($courseList['course_list'])) {
$courseList = array_keys($courseList['course_list']);
}
if (empty($courseList)) {
continue;
}
//$courseListToString = implode("','", $courseList);
/*if (empty($sessionId)) {
$courseAndSessionCondition[] =
" c.id IN ('$courseListToString') ";
} else {
$courseAndSessionCondition[] = "
(
c.id IN ('$courseListToString')
)";
}*/
$courseSessionConditionToString = " AND c.id IN ('".implode("','", $courseList)."') ";
}
if (empty($courseSessionConditionToString)) {
return 0;
}
$tableEvaluation = Database::get_main_table(TABLE_MAIN_GRADEBOOK_EVALUATION);
$tableCourse = Database::get_main_table(TABLE_MAIN_COURSE);
$tableResult = Database::get_main_table(TABLE_MAIN_GRADEBOOK_RESULT);
$sql = "SELECT DISTINCT e.title, e.id
FROM $tableEvaluation e
INNER JOIN $tableCourse c
ON (course_code = c.code)
INNER JOIN $tableResult r
ON (r.evaluation_id = e.id)
WHERE
e.type = 'evaluation' AND
r.score >= 2 AND
r.user_id = $userId
$courseSessionConditionToString
";
$result = Database::query($sql);
$list = [];
if (Database::num_rows($result)) {
while ($row = Database::fetch_assoc($result)) {
$list[$row['id']] = $row;
}
}
return $list;
}
/**
* @param int $userId
* @param array $coursesAndSessions
*
* @return int
*/
public function getItemCountChecked($userId, $coursesAndSessions)
{
$userId = (int) $userId;
if (empty($coursesAndSessions)) {
return 0;
}
$tableItem = Database::get_course_table(TABLE_LP_ITEM);
$tableLp = Database::get_course_table(TABLE_LP_MAIN);
$tableLpItemView = Database::get_course_table(TABLE_LP_ITEM_VIEW);
$tableLpView = Database::get_course_table(TABLE_LP_VIEW);
$extraField = new ExtraField('lp_item');
$fieldInfo = $extraField->get_handler_field_info_by_field_variable('calendar');
if (empty($fieldInfo)) {
return 0;
}
$courseAndSessionCondition = [];
foreach ($coursesAndSessions as $sessionId => $courseList) {
if (isset($courseList['course_list'])) {
$courseList = array_keys($courseList['course_list']);
}
if (empty($courseList)) {
continue;
}
$courseListToString = implode("','", $courseList);
if (empty($sessionId)) {
$courseAndSessionCondition[] =
" ((l.session_id = 0 OR l.session_id is NULL) AND i.c_id IN ('$courseListToString'))";
} else {
$courseAndSessionCondition[] = "
(
((l.session_id = 0 OR l.session_id is NULL) OR l.session_id = $sessionId) AND
i.c_id IN ('$courseListToString')
)";
}
}
if (empty($courseAndSessionCondition)) {
return 0;
}
$courseSessionConditionToString = 'AND ('.implode(' OR ', $courseAndSessionCondition).') ';
$sql = "SELECT count(*) as count
FROM $tableItem i INNER JOIN $tableLp l
ON (i.c_id = l.c_id AND i.lp_id = l.iid)
INNER JOIN $tableLpItemView iv
ON (iv.c_id = l.c_id AND i.iid = iv.lp_item_id)
INNER JOIN $tableLpView v
ON (v.c_id = l.c_id AND v.lp_id = l.iid AND iv.lp_view_id = v.iid)
INNER JOIN extra_field_values e
ON (e.item_id = i.iid AND value = 1 AND field_id = ".$fieldInfo['id'].")
WHERE
v.user_id = $userId AND
status = 'completed'
$courseSessionConditionToString
GROUP BY iv.view_count
";
$result = Database::query($sql);
if (Database::num_rows($result)) {
$row = Database::fetch_assoc($result);
return $row['count'];
}
return 0;
}
public function setJavaScript()
{
global $htmlHeadXtra;
$htmlHeadXtra[] = api_get_js('jqplot/jquery.jqplot.js');
$htmlHeadXtra[] = api_get_js('jqplot/plugins/jqplot.dateAxisRenderer.js');
$htmlHeadXtra[] = api_get_js('jqplot/plugins/jqplot.canvasOverlay.js');
$htmlHeadXtra[] = api_get_js('jqplot/plugins/jqplot.pointLabels.js');
$htmlHeadXtra[] = api_get_css(api_get_path(WEB_LIBRARY_PATH).'javascript/jqplot/jquery.jqplot.css');
}
/**
* @param int $userId
* @param array $courseAndSessionList
*
* @return string
*/
public function getUserStatsPanel($userId, $courseAndSessionList)
{
// @todo use translation
// get events from this year to today
$stats = $this->getUserStats($userId, $courseAndSessionList);
$html = $this->get_lang('Number of days accumulated in calendar').$stats['user_event_count'];
if (!empty($courseAndSessionList)) {
$html .= '<br />';
$html .= $this->get_lang('NumberDaysAccumulatedInLp').$stats['completed'];
$html .= '<br />';
$html .= $this->get_lang('NumberDaysInRetard').' '.($stats['completed'] - $stats['user_event_count']);
}
$controlList = $this->getControlPointsToPlot($userId);
if (!empty($controlList)) {
$listToString = json_encode($controlList);
$date = $this->get_lang('Date');
$controlPoint = $this->get_lang('NumberOfDays');
$html .= '<div id="control_point_chart"></div>';
$html .= '<script>
$(document).ready(function(){
var cosPoints = '.$listToString.';
var plot1 = $.jqplot(\'control_point_chart\', [cosPoints], {
//animate: !$.jqplot.use_excanvas,
series:[{
showMarker:true,
pointLabels: { show:true },
}],
axes:{
xaxis:{
label: "'.$date.'",
renderer: $.jqplot.DateAxisRenderer,
tickOptions:{formatString: "%Y-%m-%d"},
tickInterval: \'30 day\',
},
yaxis:{
label: "'.$controlPoint.'",
max: 20,
min: -20,
}
},
canvasOverlay: {
show: true,
objects: [{
horizontalLine: {
name: \'0 mark\',
y: 0,
lineWidth: 2,
color: \'rgb(f, f, f)\',
shadow: false
}
}]
},
});
});
</script>';
}
return Display::panel($html, $this->get_lang('Learning calendar'));
}
/**
* @param int $userId
* @param array $courseAndSessionList
*
* @return array
*/
public function getUserStats($userId, $courseAndSessionList)
{
// Get events from this year to today
$takenCount = $this->getUserEvents(
$userId,
strtotime(date('Y-01-01')),
time(),
self::EVENT_TYPE_TAKEN,
true
);
$completed = 0;
$diff = 0;
if (!empty($courseAndSessionList)) {
$completed = $this->getItemCountChecked($userId, $courseAndSessionList);
$diff = $takenCount - $completed;
}
return [
'user_event_count' => $takenCount,
'completed' => $completed,
'diff' => $diff,
];
}
/**
* @param int $calendarId
*
* @return bool
*/
public function copyCalendar($calendarId)
{
$item = $this->getCalendar($calendarId);
$this->protectCalendar($item);
$item['author_id'] = api_get_user_id();
if (empty($item)) {
return false;
}
$calendarId = (int) $calendarId;
unset($item['id']);
//$item['title'] = $item['title'];
$newCalendarId = Database::insert('learning_calendar', $item);
if (!empty($newCalendarId)) {
$sql = "SELECT * FROM learning_calendar_events WHERE calendar_id = $calendarId";
$result = Database::query($sql);
while ($row = Database::fetch_assoc($result)) {
unset($row['id']);
$row['calendar_id'] = $newCalendarId;
Database::insert('learning_calendar_events', $row);
}
return true;
}
return false;
}
/**
* @param int $calendarId
*
* @return bool
*/
public function deleteCalendar($calendarId)
{
$item = $this->getCalendar($calendarId);
$this->protectCalendar($item);
if (empty($item)) {
return false;
}
$calendarId = (int) $calendarId;
$sql = "DELETE FROM learning_calendar WHERE id = $calendarId";
Database::query($sql);
// Delete events
$sql = "DELETE FROM learning_calendar_events WHERE calendar_id = $calendarId";
Database::query($sql);
return true;
}
/**
* @param int $calendarId
* @param string $startDate
*/
public function toogleDayType($calendarId, $startDate)
{
$startDate = Database::escape_string($startDate);
$calendarId = (int) $calendarId;
$eventTypeList = $this->getEventTypeColorList();
// Remove the free type to loop correctly when toogle days.
unset($eventTypeList[self::EVENT_TYPE_FREE]);
$sql = "SELECT * FROM learning_calendar_events
WHERE start_date = '$startDate' AND calendar_id = $calendarId ";
$result = Database::query($sql);
if (Database::num_rows($result)) {
$row = Database::fetch_assoc($result);
$currentType = $row['type'];
$currentType++;
if ($currentType > count($eventTypeList)) {
Database::delete(
'learning_calendar_events',
[' calendar_id = ? AND start_date = ?' => [$calendarId, $startDate]]
);
} else {
$params = [
'type' => $currentType,
];
Database::update(
'learning_calendar_events',
$params,
[' calendar_id = ? AND start_date = ?' => [$calendarId, $startDate]]
);
}
} else {
$params = [
'title' => '',
'calendar_id' => $calendarId,
'start_date' => $startDate,
'end_date' => $startDate,
'type' => self::EVENT_TYPE_TAKEN,
];
Database::insert('learning_calendar_events', $params);
}
}
/**
* @param int $calendarId
*
* @return array
*/
public function getEvents($calendarId)
{
$calendarId = (int) $calendarId;
$eventTypeList = $this->getEventTypeColorList();
$sql = "SELECT * FROM learning_calendar_events
WHERE calendar_id = $calendarId ";
$result = Database::query($sql);
$list = [];
while ($row = Database::fetch_assoc($result)) {
$list[] = [
'start_date' => $row['start_date'],
'end_date' => $row['start_date'],
'color' => $eventTypeList[$row['type']],
];
}
return $list;
}
public function protectCalendar(array $calendarInfo)
{
$allow = api_is_platform_admin() || api_is_teacher();
if (!$allow) {
api_not_allowed(true);
}
if (!empty($calendarInfo)) {
if (!api_is_platform_admin() && api_is_teacher()) {
if ($calendarInfo['author_id'] != api_get_user_id()) {
api_not_allowed(true);
}
}
}
}
/**
* @param int $userId
*
* @return array
*/
public function getControlPoints($userId)
{
$userId = (int) $userId;
$sql = "SELECT control_date, control_value
FROM learning_calendar_control_point
WHERE user_id = $userId
ORDER BY control_date";
$result = Database::query($sql);
return Database::store_result($result, 'ASSOC');
}
/**
* @param int $userId
*
* @return array
*/
public function getControlPointsToPlot($userId)
{
$list = $this->getControlPoints($userId);
$points = [];
foreach ($list as $item) {
$points[] = [$item['control_date'], $item['control_value']];
}
return $points;
}
/**
* @param int $userId
* @param int $value
*/
public function addControlPoint($userId, $value)
{
$userId = (int) $userId;
$value = (int) $value;
$local = api_get_local_time();
$date = substr($local, 0, 10);
$sql = "SELECT id
FROM learning_calendar_control_point
WHERE user_id = $userId AND control_date = '$date'";
$result = Database::query($sql);
if (Database::num_rows($result)) {
$params = [
'control_value' => $value,
'updated_at' => api_get_utc_datetime(),
];
$data = Database::fetch_array($result);
$id = $data['id'];
Database::update('learning_calendar_control_point', $params, ['id = ?' => $id]);
} else {
$params = [
'user_id' => $userId,
'control_date' => $date,
'control_value' => $value,
'created_at' => api_get_utc_datetime(),
'updated_at' => api_get_utc_datetime(),
];
Database::insert('learning_calendar_control_point', $params);
}
}
public function getAddUserToCalendarForm(FormValidator &$form)
{
$calendars = $this->getCalendars(0, 1000, '');
if (empty($calendars)) {
echo Display::return_message(get_lang('No data available'), 'warning');
exit;
}
$calendars = array_column($calendars, 'title', 'id');
$calendars = array_map('strip_tags', $calendars);
$form->addSelect('calendar_id', get_lang('Calendar'), $calendars, ['disable_js' => true]);
}
}