Skip to content

Commit a955d3b

Browse files
authored
added: integrated iCal import and export features
1 parent 6d57b63 commit a955d3b

File tree

14 files changed

+1144
-58
lines changed

14 files changed

+1144
-58
lines changed
Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
<?php
2+
3+
/** @var Event[] $events */
4+
$events = [];
5+
6+
$event_id = get_input('event_id', '');
7+
8+
if (empty($event_id)) {
9+
$calendar_type = get_input('calendar_type', 'all');
10+
$date_format = elgg_get_config('date_format', elgg_echo('input:date_format'));
11+
12+
$start_date = (string) get_input('start_date');
13+
if (empty($start_date)) {
14+
$start_date = time();
15+
} else {
16+
$start_date = DateTime::createFromFormat($date_format, $start_date)->getTimestamp();
17+
}
18+
19+
$end_date = (string) get_input('end_date');
20+
if (empty($end_date)) {
21+
$end_date = DateTime::createFromFormat('U', time())
22+
->add(DateInterval::createFromDateString('1 month'))
23+
->getTimestamp();
24+
} else {
25+
$end_date = DateTime::createFromFormat($date_format, $end_date)->getTimestamp();
26+
}
27+
28+
$region = (string) get_input('region');
29+
$event_type = (string) get_input('event_type');
30+
31+
$owner = (array) get_input('owner');
32+
$group = (array) get_input('group');
33+
34+
$options = [
35+
'types' => ['object'],
36+
'subTypes' => [Event::SUBTYPE],
37+
'metadata_name_value_pairs' => [
38+
[
39+
'name' => 'event_start',
40+
'operand' => '>=',
41+
'value' => $start_date,
42+
],
43+
[
44+
'name' => 'event_end',
45+
'operand' => '<=',
46+
'value' => $end_date,
47+
],
48+
]
49+
];
50+
51+
if (!empty($region)) {
52+
$options['metadata_name_value_pairs'][] = [
53+
'name' => 'region',
54+
'operand' => 'IN',
55+
'value' => $region,
56+
];
57+
}
58+
59+
if (!empty($event_type)) {
60+
$options['metadata_name_value_pairs'][] = [
61+
'name' => 'event_type',
62+
'operand' => 'IN',
63+
'value' => $event_type,
64+
];
65+
}
66+
67+
switch ($calendar_type) {
68+
case 'group':
69+
if (empty($group)) {
70+
return elgg_error_response(elgg_echo('event_manager:ical_direct:export:errors:groupempty'));
71+
}
72+
73+
$options['container_guids'] = $group;
74+
break;
75+
case 'owner':
76+
if (empty($owner)) {
77+
return elgg_error_response(elgg_echo('event_manager:ical_direct:export:errors:ownerempty'));
78+
}
79+
80+
if (!elgg_is_admin_logged_in() && (int) $owner[0] !== elgg_get_logged_in_user_guid()) {
81+
return elgg_error_response(elgg_echo('event_manager:ical_direct:export:errors:ownermismatch'));
82+
}
83+
84+
$options['owner_guids'] = [$owner];
85+
break;
86+
}
87+
88+
$events = elgg_get_entities($options);
89+
} else {
90+
$event = get_entity($event_id);
91+
if (!$event instanceof \Event) {
92+
return;
93+
}
94+
95+
$events = [$event];
96+
}
97+
98+
use Kigkonsult\Icalcreator\IcalInterface;
99+
use Kigkonsult\Icalcreator\Vcalendar;
100+
101+
try {
102+
$vcalendar = Vcalendar::factory(
103+
[
104+
IcalInterface::UNIQUE_ID => 'https://github.com/ColdTrick/event_manager',
105+
]
106+
)
107+
->setMethod(IcalInterface::PUBLISH)
108+
->setXprop(IcalInterface::X_WR_CALNAME, 'Exported event')
109+
->setXprop(IcalInterface::X_WR_CALDESC, 'Exported events from event_manager')
110+
->setXprop(IcalInterface::X_WR_RELCALID, elgg_get_site_url())
111+
->setXprop(IcalInterface::X_WR_TIMEZONE, date_default_timezone_get());
112+
} catch (Exception $e) {
113+
return elgg_error_response(elgg_echo('event_manager:ical_direct:export:errors:errorinstantiatingcalendar', [$e]));
114+
}
115+
116+
foreach ($events as $event) {
117+
try {
118+
$vcalendar->setComponent($event->toVEvent());
119+
} catch (Exception $e) {
120+
return elgg_error_response(elgg_echo('event_manager:ical_direct:export:errors:erroraddingevent', [$e]));
121+
}
122+
}
123+
124+
try {
125+
return elgg_download_response($vcalendar->createCalendar(), 'export.ics');
126+
} catch (Exception $e) {
127+
return elgg_error_response(elgg_echo('event_manager:ical_direct:export:errors:errorcreatingcalendar', [$e]));
128+
}
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
<?php
2+
3+
use Kigkonsult\Icalcreator\IcalInterface;
4+
use Kigkonsult\Icalcreator\Vcalendar;
5+
use Kigkonsult\Icalcreator\Vevent;
6+
7+
$calendar_type = get_input('calendar_type', 'all');
8+
9+
$owner = (array) get_input('owner');
10+
$owner_guid = 0;
11+
$group = (array) get_input('group');
12+
$group_guid = 0;
13+
$file = elgg_get_uploaded_file('import');
14+
15+
switch ($calendar_type) {
16+
case 'group':
17+
if (empty($group)) {
18+
return elgg_error_response(elgg_echo('event_manager:ical_direct:import:errors:groupempty'));
19+
}
20+
21+
$group_guid = $group[0];
22+
$group_entity = get_entity($group_guid);
23+
if (!get_entity($group_guid) instanceof \ElggGroup) {
24+
return elgg_error_response(elgg_echo('event_manager:ical_direct:import:errors:invalidgroup'));
25+
}
26+
27+
if (!elgg_is_admin_logged_in() && !$group_entity->canWriteToContainer(elgg_get_logged_in_user_guid())) {
28+
return elgg_error_response(elgg_echo('event_manager:ical_direct:import:errors:grouppermission'));
29+
}
30+
break;
31+
case 'owner':
32+
if (empty($owner)) {
33+
return elgg_error_response(elgg_echo('event_manager:ical_direct:import:errors:ownerempty'));
34+
}
35+
36+
$owner_guid = $owner[0];
37+
if (!get_entity($owner_guid) instanceof \ElggUser) {
38+
return elgg_error_response(elgg_echo('event_manager:ical_direct:import:errors:invalidgroup'));
39+
}
40+
41+
if (!elgg_is_admin_logged_in() && (int) $owner_guid !== elgg_get_logged_in_user_guid()) {
42+
return elgg_error_response(elgg_echo('event_manager:ical_direct:import:errors:ownermismatch'));
43+
}
44+
break;
45+
}
46+
47+
if (!$file) {
48+
return elgg_error_response(elgg_echo('event_manager:ical_direct:import:errors:missingfile'));
49+
}
50+
51+
try {
52+
$vcalendar = Vcalendar::factory(
53+
[
54+
IcalInterface::UNIQUE_ID => 'https://github.com/ColdTrick/event_manager',
55+
]
56+
);
57+
} catch (Exception $e) {
58+
return elgg_error_response(elgg_echo('event_manager:ical_direct:import:errors:errorinstantiatingcalendar', [$e]));
59+
}
60+
61+
try {
62+
$vcalendar->parse($file->getContent());
63+
} catch (Exception $e) {
64+
return elgg_error_response(elgg_echo('event_manager:ical_direct:import:errors:errorpparsingcalendar', [$e]));
65+
}
66+
67+
$event_counter = 0;
68+
69+
/** @var Vevent $component */
70+
foreach ($vcalendar->getComponents('Vevent') as $component) {
71+
$event = Event::fromVEvent($component);
72+
73+
switch ($calendar_type) {
74+
case 'group':
75+
$event->setContainerGUID($group_guid);
76+
break;
77+
case 'owner':
78+
$event->owner_guid = $owner_guid;
79+
break;
80+
}
81+
82+
$event->save();
83+
$event_counter++;
84+
}
85+
86+
$message = elgg_echo('event_manager:ical_direct:import:success', [$event_counter]);
87+
88+
return elgg_ok_response(
89+
'',
90+
$message
91+
);

classes/ColdTrick/EventManager/Menus/Entity.php

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ public static function registerMailAttendees(\Elgg\Event $event): ?MenuItems {
3535
'text' => elgg_echo('event_manager:menu:mail'),
3636
'href' => elgg_generate_entity_url($entity, 'mail'),
3737
]);
38-
38+
3939
return $result;
4040
}
4141

@@ -148,4 +148,35 @@ public static function registerEventUnsubscribe(\Elgg\Event $event): ?MenuItems
148148

149149
return $result;
150150
}
151+
152+
/**
153+
* Adds menu items to the event entity menu for exporting it to ical
154+
*
155+
* @param \Elgg\Event $event 'register', 'menu:entity'
156+
*
157+
* @return null|MenuItems
158+
*/
159+
public static function registerICalExport(\Elgg\Event $event): ?MenuItems {
160+
$entity = $event->getEntityParam();
161+
if (!$entity instanceof \Event) {
162+
return null;
163+
}
164+
165+
if (!elgg_get_plugin_setting('ical_direct', 'event_manager')) {
166+
return null;
167+
}
168+
169+
// show an ical export link
170+
$result = $event->getValue();
171+
172+
$result[] = \ElggMenuItem::factory([
173+
'name' => 'ical-export',
174+
'icon' => 'calendar-plus',
175+
'text' => elgg_echo('event_manager:ical_direct:export'),
176+
'href' => elgg_generate_action_url('event_manager/export/ical', ['event_id' => $entity->guid]),
177+
'priority' => 300,
178+
]);
179+
180+
return $result;
181+
}
151182
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
<?php
2+
3+
namespace ColdTrick\EventManager\Menus;
4+
5+
use Elgg\Menu\MenuItems;
6+
7+
/**
8+
* Site menu related callbacks
9+
*/
10+
class Title {
11+
12+
/**
13+
* Adds items to the site menu
14+
*
15+
* @param \Elgg\Event $event 'register', 'menu:site'
16+
*
17+
* @return MenuItems
18+
*/
19+
public static function registerICal(\Elgg\Event $event): MenuItems {
20+
$result = $event->getValue();
21+
22+
if ($event->getParam('identifier') !== 'event' || $event->getParam('filter_id') !== 'events') {
23+
return $result;
24+
}
25+
26+
if (elgg_get_plugin_setting('ical_direct', 'event_manager')) {
27+
$result[] = \ElggMenuItem::factory([
28+
'name' => 'export-ical',
29+
'icon' => 'download',
30+
'text' => elgg_echo('event_manager:ical_direct:export'),
31+
'href' => elgg_http_add_url_query_elements('ajax/form/event_manager/export/ical', [
32+
'list_route' => elgg_get_current_route_name(),
33+
'route_parameters' => elgg_get_current_route()->getMatchedParameters(),
34+
]),
35+
'link_class' => 'elgg-lightbox'
36+
]);
37+
$result[] = \ElggMenuItem::factory([
38+
'name' => 'import-ical',
39+
'icon' => 'upload',
40+
'text' => elgg_echo('event_manager:ical_direct:import'),
41+
'href' => elgg_http_add_url_query_elements('ajax/form/event_manager/import/ical', [
42+
'list_route' => elgg_get_current_route_name(),
43+
'route_parameters' => elgg_get_current_route()->getMatchedParameters(),
44+
]),
45+
'link_class' => 'elgg-lightbox'
46+
]);
47+
}
48+
49+
return $result;
50+
}
51+
}

0 commit comments

Comments
 (0)