|
1 | 1 | <?php |
2 | 2 |
|
3 | 3 | use Elgg\Database\Clauses\JoinClause; |
| 4 | +use Elgg\Database\Clauses\OrderByClause; |
4 | 5 | use Elgg\Database\Delete; |
5 | 6 | use Elgg\Database\QueryBuilder; |
6 | 7 | use Elgg\Database\Select; |
| 8 | +use Kigkonsult\Icalcreator\Vevent; |
7 | 9 |
|
8 | 10 | /** |
9 | 11 | * Event |
|
33 | 35 | * @property bool $waiting_list_enabled is a waitling list enabled |
34 | 36 | * @property string $website event website |
35 | 37 | * @property bool $with_program has a program |
| 38 | + * @property mixed $starttime start time of event |
| 39 | + * @property mixed $endtime end time of event |
36 | 40 | */ |
37 | 41 | class Event extends \ElggObject { |
38 | 42 |
|
@@ -1105,6 +1109,28 @@ public function countAttendees(): int { |
1105 | 1109 | }); |
1106 | 1110 | } |
1107 | 1111 |
|
| 1112 | + /** |
| 1113 | + * Fetches all attendees of this event |
| 1114 | + * |
| 1115 | + * @return ElggUser[] |
| 1116 | + */ |
| 1117 | + public function getAttendees(): array { |
| 1118 | + $options = [ |
| 1119 | + 'type' => 'user', // trigger search fields generation |
| 1120 | + 'type_subtype_pairs' => [ |
| 1121 | + 'user' => ELGG_ENTITIES_ANY_VALUE, |
| 1122 | + 'object' => [ |
| 1123 | + EventRegistration::SUBTYPE, |
| 1124 | + ], |
| 1125 | + ], |
| 1126 | + 'relationship_guid' => $this->guid, |
| 1127 | + 'relationship' => 'event_attending', |
| 1128 | + 'no_results' => true, |
| 1129 | + 'order_by' => new OrderByClause('r.time_created', 'DESC'), |
| 1130 | + ]; |
| 1131 | + return elgg_get_entities($options); |
| 1132 | + } |
| 1133 | + |
1108 | 1134 | /** |
1109 | 1135 | * Counts the waiters |
1110 | 1136 | * |
@@ -1159,4 +1185,129 @@ public function getOrganizers(array $options = []): int|array { |
1159 | 1185 |
|
1160 | 1186 | return elgg_get_entities($options); |
1161 | 1187 | } |
| 1188 | + |
| 1189 | + /** |
| 1190 | + * Returns the VEvent representation of this event. |
| 1191 | + * |
| 1192 | + * @return Vevent |
| 1193 | + * @throws Exception |
| 1194 | + */ |
| 1195 | + public function toVEvent(): Vevent { |
| 1196 | + $timezone = \Kigkonsult\Icalcreator\Util\DateTimeZoneFactory::factory(date_default_timezone_get()); |
| 1197 | + $dtstart = DateTimeImmutable::createFromFormat('Y-m-d\\TH:i:s', $this->getStartDate('Y-m-d\\TH:i:s'), $timezone); |
| 1198 | + $dtend = DateTimeImmutable::createFromFormat('Y-m-d\\TH:i:s', $this->getEndDate('Y-m-d\\TH:i:s'), $timezone); |
| 1199 | + /** @noinspection PhpUnhandledExceptionInspection */ |
| 1200 | + $vevent = Vevent::factory( |
| 1201 | + null, |
| 1202 | + $dtstart, |
| 1203 | + $dtend, |
| 1204 | + null, |
| 1205 | + $this->title |
| 1206 | + ) |
| 1207 | + ->setDescription($this->shortdescription) |
| 1208 | + ->setDtstamp(DateTimeImmutable::createFromFormat('c', $this->getTimeCreated())) |
| 1209 | + ->setComment($this->description) |
| 1210 | + ->setLocation($this->location); |
| 1211 | + |
| 1212 | + $organizers = $this->getOrganizers(); |
| 1213 | + if (count($organizers) > 0 && isset($organizers[0]->email)) { |
| 1214 | + $vevent->setOrganizer($organizers[0]->email); |
| 1215 | + } |
| 1216 | + |
| 1217 | + if ($this->countAttendees() > 0) { |
| 1218 | + foreach ($this->getAttendees() as $attendee) { |
| 1219 | + $vevent->setAttendee($attendee->email); |
| 1220 | + } |
| 1221 | + } |
| 1222 | + |
| 1223 | + foreach ($this->getContacts() as $contact) { |
| 1224 | + if ($contact instanceof ElggUser && isset($contact->email)) { |
| 1225 | + $vevent->setContact($contact->email); |
| 1226 | + } |
| 1227 | + } |
| 1228 | + |
| 1229 | + if ($this->website) { |
| 1230 | + $vevent->setXprop('X-WEBSITE', $this->website); |
| 1231 | + } |
| 1232 | + |
| 1233 | + if ($this->region) { |
| 1234 | + $vevent->setXprop('X-PROP-REGION', $this->region); |
| 1235 | + } |
| 1236 | + |
| 1237 | + if ($this->venue) { |
| 1238 | + $vevent->setXprop('X-PROP-VENUE', $this->venue); |
| 1239 | + } |
| 1240 | + |
| 1241 | + if ($this->event_type) { |
| 1242 | + $vevent->setXprop('X-PROP-TYPE', $this->event_type); |
| 1243 | + } |
| 1244 | + |
| 1245 | + return $vevent; |
| 1246 | + } |
| 1247 | + |
| 1248 | + /** |
| 1249 | + * Generates a new event based on an iCal Vevent |
| 1250 | + * |
| 1251 | + * @param Vevent $vevent Source iCal Vevent to convert |
| 1252 | + * @return Event |
| 1253 | + * @throws Exception |
| 1254 | + */ |
| 1255 | + public static function fromVEvent(Vevent $vevent): Event { |
| 1256 | + $event = new Event(); |
| 1257 | + $event->event_start = $vevent->getDtstart()->getTimestamp() + $vevent->getDtstart()->getOffset(); |
| 1258 | + $event->event_end = $vevent->getDtend()->getTimestamp() + $vevent->getDtend()->getOffset(); |
| 1259 | + $event->title = $vevent->getSummary(); |
| 1260 | + $event->shortdescription = $vevent->getDescription(); |
| 1261 | + $event->description = $vevent->getComment(); |
| 1262 | + $event->location = $vevent->getLocation(); |
| 1263 | + |
| 1264 | + if ($vevent->isOrganizerSet()) { |
| 1265 | + $organizer = elgg_get_user_by_email($vevent->getOrganizer()); |
| 1266 | + if (is_null($organizer)) { |
| 1267 | + $event->organizer = $vevent->getOrganizer(); |
| 1268 | + } else { |
| 1269 | + $event->organizer_guids = [$organizer->guid]; |
| 1270 | + } |
| 1271 | + } |
| 1272 | + |
| 1273 | + if ($vevent->isAttendeeSet()) { |
| 1274 | + foreach ($vevent->getAllAttendee() as $attendee) { |
| 1275 | + $attendee_object = elgg_get_user_by_email($attendee); |
| 1276 | + if (!is_null($attendee_object)) { |
| 1277 | + $event->addRelationship($attendee_object->guid, 'event_attending'); |
| 1278 | + } |
| 1279 | + } |
| 1280 | + } |
| 1281 | + |
| 1282 | + if ($vevent->isContactSet()) { |
| 1283 | + foreach ($vevent->getAllContact() as $contact) { |
| 1284 | + $contact_object = elgg_get_user_by_email($contact); |
| 1285 | + if (!is_null($contact_object)) { |
| 1286 | + if (!is_array($event->contact_guids)) { |
| 1287 | + $event->contact_guids = []; |
| 1288 | + } |
| 1289 | + |
| 1290 | + $event->contact_guids[] = $contact_object->guid; |
| 1291 | + } |
| 1292 | + } |
| 1293 | + } |
| 1294 | + |
| 1295 | + if ($vevent->isXpropSet('X-WEBSITE')) { |
| 1296 | + $event->website = $vevent->getXprop('X-WEBSITE')[1]; |
| 1297 | + } |
| 1298 | + |
| 1299 | + if ($vevent->isXpropSet('X-PROP-REGION')) { |
| 1300 | + $event->region = $vevent->getXprop('X-PROP-REGION')[1]; |
| 1301 | + } |
| 1302 | + |
| 1303 | + if ($vevent->isXpropSet('X-PROP-VENUE')) { |
| 1304 | + $event->venue = $vevent->getXprop('X-PROP-VENUE')[1]; |
| 1305 | + } |
| 1306 | + |
| 1307 | + if ($vevent->isXpropSet('X-PROP-TYPE')) { |
| 1308 | + $event->event_type = $vevent->getXprop('X-PROP-TYPE')[1]; |
| 1309 | + } |
| 1310 | + |
| 1311 | + return $event; |
| 1312 | + } |
1162 | 1313 | } |
0 commit comments