forked from itop-itsm-ru/dashlet-calendar
-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathajax.php
84 lines (79 loc) · 4.49 KB
/
ajax.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
namespace Knowitop\iTop\Extension\DashletCalendar;
use ApplicationContext;
use AttributeDateTime;
use DateTime;
use DBObjectSearch;
use DBObjectSet;
use Exception;
use Expression;
use IssueLog;
use LoginWebPage;
use utils;
require_once('../../approot.inc.php');
try {
require_once(APPROOT . '/application/startup.inc.php');
require_once(APPROOT . '/application/loginwebpage.class.inc.php');
LoginWebPage::DoLogin(); // Check user rights and prompt if needed
$sStartIntervalDate = utils::ReadParam('start', '', false, utils::ENUM_SANITIZATION_FILTER_STRING);
$sStartDateAttr = utils::ReadParam('start_attr', '', false, utils::ENUM_SANITIZATION_FILTER_FIELD_NAME);
$sEndIntervalDate = utils::ReadParam('end', false, false, utils::ENUM_SANITIZATION_FILTER_STRING);
$sEndDateAttr = utils::ReadParam('end_attr', '', false, utils::ENUM_SANITIZATION_FILTER_FIELD_NAME);
$bShowUnfinished = (bool)utils::ReadParam('unfinished', false, false, utils::ENUM_SANITIZATION_FILTER_INTEGER);
$sTitleAttr = utils::ReadParam('title_attr', '', false, utils::ENUM_SANITIZATION_FILTER_FIELD_NAME);
$sDescriptionAttr = utils::ReadParam('description_attr', '', false, utils::ENUM_SANITIZATION_FILTER_FIELD_NAME);
$sFilter = utils::ReadParam('filter', '', false, utils::ENUM_SANITIZATION_FILTER_STRING);
$oFilter = DBObjectSearch::unserialize(base64_decode($sFilter));
$sClass = $oFilter->GetClassAlias();
if ($sEndDateAttr && !$bShowUnfinished)
{
// выбраны атрибуты начала и окончания и не показываются незавершенные
// В этом случае выбираем все, у которых дата окончания больше даты начала интервала
// и дата начала меньше даты окончания интерала
$oFilter->AddCondition($sStartDateAttr, $sEndIntervalDate, '<');
$oFilter->AddCondition($sEndDateAttr, $sStartIntervalDate, '>');
}
elseif ($sEndDateAttr && $bShowUnfinished)
{
// выбраны атрибуты начала и окончания и показываются незавершенные
// В этом случае выбираем все, у которых дата окончания больше даты начала интервала или пустая,
// а дата начала меньше даты окончания интервала
$oFilter->AddCondition($sStartDateAttr, $sEndIntervalDate, '<');
$sOQLCondition = "$sClass.$sEndDateAttr > '$sStartIntervalDate' OR ISNULL($sClass.$sEndDateAttr)";
$oExpr = Expression::FromOQL($sOQLCondition);
$oFilter->AddConditionExpression($oExpr);
}
else
{
// выбран только атрибут начала, ищем только то, что попало в интервал
$sOQLCondition = "$sClass.$sStartDateAttr > '$sStartIntervalDate' AND $sClass.$sStartDateAttr < '$sEndIntervalDate'";
$oExpr = Expression::FromOQL($sOQLCondition);
$oFilter->AddConditionExpression($oExpr);
// Код ниже не работает, т.к. в запросе появляется один и тот же алиас :start_date (название поля)
// и, соответственно, одно и то же его значение
//$oFilter->AddCondition($sStartDateAttr, $sStartIntervalDate, '>');
//$oFilter->AddCondition($sStartDateAttr, $sEndIntervalDate, '<');
}
$oObjectSet = new DBObjectSet($oFilter);
$aEvents = array();
while ($oObj = $oObjectSet->Fetch()) {
$aEvent = array();
$aEvent['title'] = strip_tags(html_entity_decode($oObj->GetAsHTML($sTitleAttr))) . ($sDescriptionAttr ? "\n" . strip_tags(html_entity_decode($oObj->GetAsHTML($sDescriptionAttr))) : '');
$aEvent['start'] = $oObj->Get($sStartDateAttr);
$sEndDate = '';
if ($sEndDateAttr) {
$sEndDate = $oObj->Get($sEndDateAttr);
if (!$sEndDate && $bShowUnfinished) {
$sEndDate = date_format(new DateTime(), AttributeDateTime::GetInternalFormat());
}
}
$aEvent['end'] = $sEndDate;
$aEvent['url'] = ApplicationContext::MakeObjectUrl(get_class($oObj), $oObj->GetKey());
$aEvents[] = $aEvent;
}
$jsonEvents = json_encode($aEvents);
echo $jsonEvents;
} catch (Exception $e) {
IssueLog::Error($e->getMessage());
echo htmlentities($e->getMessage(), ENT_QUOTES, 'utf-8');
}