X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FModel%2FEvent.php;h=dac00ceceb4a3e5e008db1bdaa839e5f17d6ed50;hb=a662245c744f4d2faa1b533977f7d21b4de6a724;hp=91521808447ad472b8d3935474673685ff65d56c;hpb=0447bb2769648eadd718e3dd9560ce2f480af8d8;p=friendica.git diff --git a/src/Model/Event.php b/src/Model/Event.php index 9152180844..dac00ceceb 100644 --- a/src/Model/Event.php +++ b/src/Model/Event.php @@ -1,48 +1,60 @@ . + * */ namespace Friendica\Model; -use Friendica\BaseObject; use Friendica\Content\Text\BBCode; use Friendica\Core\Hook; -use Friendica\Core\L10n; use Friendica\Core\Logger; -use Friendica\Core\PConfig; +use Friendica\Core\Protocol; use Friendica\Core\Renderer; use Friendica\Core\System; use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Protocol\Activity; use Friendica\Util\DateTimeFormat; use Friendica\Util\Map; use Friendica\Util\Strings; use Friendica\Util\XML; /** - * @brief functions for interacting with the event database table + * functions for interacting with the event database table */ -class Event extends BaseObject +class Event { - public static function getHTML(array $event, $simple = false) + public static function getHTML(array $event, $simple = false, $uriid = 0) { if (empty($event)) { return ''; } - $bd_format = L10n::t('l F d, Y \@ g:i A'); // Friday January 18, 2011 @ 8 AM. + $uriid = $event['uri-id'] ?? $uriid; - $event_start = L10n::getDay( - !empty($event['adjust']) ? - DateTimeFormat::local($event['start'], $bd_format) : DateTimeFormat::utc($event['start'], $bd_format) - ); + $bd_format = DI::l10n()->t('l F d, Y \@ g:i A \G\M\TP (e)'); // Friday October 29, 2021 @ 9:15 AM GMT-04:00 (America/New_York) + + $event_start = DI::l10n()->getDay(DateTimeFormat::local($event['start'], $bd_format)); if (!empty($event['finish'])) { - $event_end = L10n::getDay( - !empty($event['adjust']) ? - DateTimeFormat::local($event['finish'], $bd_format) : DateTimeFormat::utc($event['finish'], $bd_format) - ); + $event_end = DI::l10n()->getDay(DateTimeFormat::local($event['finish'], $bd_format)); } else { $event_end = ''; } @@ -51,21 +63,21 @@ class Event extends BaseObject $o = ''; if (!empty($event['summary'])) { - $o .= "

" . BBCode::convert(Strings::escapeHtml($event['summary']), false, $simple) . "

"; + $o .= "

" . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['summary']), $simple) . "

"; } if (!empty($event['desc'])) { - $o .= "
" . BBCode::convert(Strings::escapeHtml($event['desc']), false, $simple) . "
"; + $o .= "
" . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['desc']), $simple) . "
"; } - $o .= "

" . L10n::t('Starts:') . "

" . $event_start . "

"; + $o .= "

" . DI::l10n()->t('Starts:') . "

" . $event_start . "

"; if (!$event['nofinish']) { - $o .= "

" . L10n::t('Finishes:') . "

" . $event_end . "

"; + $o .= "

" . DI::l10n()->t('Finishes:') . "

" . $event_end . "

"; } if (!empty($event['location'])) { - $o .= "

" . L10n::t('Location:') . "

" . BBCode::convert(Strings::escapeHtml($event['location']), false, $simple) . "

"; + $o .= "

" . DI::l10n()->t('Location:') . "

" . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['location']), $simple) . "

"; } return $o; @@ -73,27 +85,27 @@ class Event extends BaseObject $o = '
' . "\r\n"; - $o .= '
' . BBCode::convert(Strings::escapeHtml($event['summary']), false, $simple) . '
' . "\r\n"; + $o .= '
' . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['summary']), $simple) . '
' . "\r\n"; - $o .= '
' . L10n::t('Starts:') . ' ' . DI::l10n()->t('Starts:') . ' ' . $event_start . '
' . "\r\n"; if (!$event['nofinish']) { - $o .= '
' . L10n::t('Finishes:') . ' ' . DI::l10n()->t('Finishes:') . ' ' . $event_end . '
' . "\r\n"; } if (!empty($event['desc'])) { - $o .= '
' . BBCode::convert(Strings::escapeHtml($event['desc']), false, $simple) . '
' . "\r\n"; + $o .= '
' . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['desc']), $simple) . '
' . "\r\n"; } if (!empty($event['location'])) { - $o .= '
' . L10n::t('Location:') . ' ' - . BBCode::convert(Strings::escapeHtml($event['location']), false, $simple) + $o .= '
' . DI::l10n()->t('Location:') . ' ' + . BBCode::convertForUriId($uriid, Strings::escapeHtml($event['location']), $simple) . '
' . "\r\n"; // Include a map of the location if the [map] BBCode is used. @@ -110,7 +122,7 @@ class Event extends BaseObject } /** - * @brief Convert an array with event data to bbcode. + * Convert an array with event data to bbcode. * * @param array $event Array which contains the event data. * @return string The event as a bbcode formatted string. @@ -139,15 +151,11 @@ class Event extends BaseObject $o .= '[event-location]' . $event['location'] . '[/event-location]'; } - if ($event['adjust']) { - $o .= '[event-adjust]' . $event['adjust'] . '[/event-adjust]'; - } - return $o; } /** - * @brief Extract bbcode formatted event data from a string. + * Extract bbcode formatted event data from a string. * * @params: string $s The string which should be parsed for event data. * @param $text @@ -157,36 +165,31 @@ class Event extends BaseObject { $ev = []; - $match = ''; + $match = []; if (preg_match("/\[event\-summary\](.*?)\[\/event\-summary\]/is", $text, $match)) { $ev['summary'] = $match[1]; } - $match = ''; + $match = []; if (preg_match("/\[event\-description\](.*?)\[\/event\-description\]/is", $text, $match)) { $ev['desc'] = $match[1]; } - $match = ''; + $match = []; if (preg_match("/\[event\-start\](.*?)\[\/event\-start\]/is", $text, $match)) { $ev['start'] = $match[1]; } - $match = ''; + $match = []; if (preg_match("/\[event\-finish\](.*?)\[\/event\-finish\]/is", $text, $match)) { $ev['finish'] = $match[1]; } - $match = ''; + $match = []; if (preg_match("/\[event\-location\](.*?)\[\/event\-location\]/is", $text, $match)) { $ev['location'] = $match[1]; } - $match = ''; - if (preg_match("/\[event\-adjust\](.*?)\[\/event\-adjust\]/is", $text, $match)) { - $ev['adjust'] = $match[1]; - } - $ev['nofinish'] = !empty($ev['start']) && empty($ev['finish']) ? 1 : 0; return $ev; @@ -200,8 +203,8 @@ class Event extends BaseObject private static function compareDatesCallback($event_a, $event_b) { - $date_a = (($event_a['adjust']) ? DateTimeFormat::local($event_a['start']) : $event_a['start']); - $date_b = (($event_b['adjust']) ? DateTimeFormat::local($event_b['start']) : $event_b['start']); + $date_a = DateTimeFormat::local($event_a['start']); + $date_b = DateTimeFormat::local($event_b['start']); if ($date_a === $date_b) { return strcasecmp($event_a['desc'], $event_b['desc']); @@ -211,7 +214,7 @@ class Event extends BaseObject } /** - * @brief Delete an event from the event table. + * Delete an event from the event table. * * Note: This function does only delete the event from the event table not its * related entry in the item table. @@ -226,12 +229,12 @@ class Event extends BaseObject return; } - DBA::delete('event', ['id' => $event_id], ['cascade' => false]); - Logger::log("Deleted event ".$event_id, Logger::DEBUG); + DBA::delete('event', ['id' => $event_id]); + Logger::info("Deleted event", ['id' => $event_id]); } /** - * @brief Store the event. + * Store the event. * * Store the event in the event table and create an event item in the item table. * @@ -247,6 +250,7 @@ class Event extends BaseObject $event['cid'] = intval($arr['cid'] ?? 0); $event['guid'] = ($arr['guid'] ?? '') ?: System::createUUID(); $event['uri'] = ($arr['uri'] ?? '') ?: Item::newURI($event['uid'], $event['guid']); + $event['uri-id'] = ItemURI::insert(['uri' => $event['uri'], 'guid' => $event['guid']]); $event['type'] = ($arr['type'] ?? '') ?: 'event'; $event['summary'] = $arr['summary'] ?? ''; $event['desc'] = $arr['desc'] ?? ''; @@ -255,8 +259,7 @@ class Event extends BaseObject $event['allow_gid'] = $arr['allow_gid'] ?? ''; $event['deny_cid'] = $arr['deny_cid'] ?? ''; $event['deny_gid'] = $arr['deny_gid'] ?? ''; - $event['adjust'] = intval($arr['adjust'] ?? 0); - $event['nofinish'] = intval(!empty($arr['nofinish'] || !empty($event['start']) && empty($event['finish']))); + $event['nofinish'] = intval($arr['nofinish'] ?? (!empty($event['start']) && empty($event['finish']))); $event['created'] = DateTimeFormat::utc(($arr['created'] ?? '') ?: 'now'); $event['edited'] = DateTimeFormat::utc(($arr['edited'] ?? '') ?: 'now'); @@ -265,26 +268,17 @@ class Event extends BaseObject if ($event['finish'] < DBA::NULL_DATETIME) { $event['finish'] = DBA::NULL_DATETIME; } - $private = intval($arr['private'] ?? 0); - - $conditions = ['uid' => $event['uid']]; - if ($event['cid']) { - $conditions['id'] = $event['cid']; - } else { - $conditions['self'] = true; - } - - $contact = DBA::selectFirst('contact', [], $conditions); // Existing event being modified. if ($event['id']) { // has the event actually changed? $existing_event = DBA::selectFirst('event', ['edited'], ['id' => $event['id'], 'uid' => $event['uid']]); - if (!DBA::isResult($existing_event) || ($existing_event['edited'] === $event['edited'])) { - - $item = Item::selectFirst(['id'], ['event-id' => $event['id'], 'uid' => $event['uid']]); - - return DBA::isResult($item) ? $item['id'] : 0; + if (!DBA::isResult($existing_event)) { + return 0; + } + + if ($existing_event['edited'] === $event['edited']) { + return $event['id']; } $updated_fields = [ @@ -295,24 +289,19 @@ class Event extends BaseObject 'desc' => $event['desc'], 'location' => $event['location'], 'type' => $event['type'], - 'adjust' => $event['adjust'], 'nofinish' => $event['nofinish'], ]; DBA::update('event', $updated_fields, ['id' => $event['id'], 'uid' => $event['uid']]); - $item = Item::selectFirst(['id'], ['event-id' => $event['id'], 'uid' => $event['uid']]); + $item = Post::selectFirst(['id', 'uri-id'], ['event-id' => $event['id'], 'uid' => $event['uid']]); if (DBA::isResult($item)) { - $object = '' . XML::escape(ACTIVITY_OBJ_EVENT) . '' . XML::escape($event['uri']) . ''; + $object = '' . XML::escape(Activity\ObjectType::EVENT) . '' . XML::escape($event['uri']) . ''; $object .= '' . XML::escape(self::getBBCode($event)) . ''; $object .= '' . "\n"; $fields = ['body' => self::getBBCode($event), 'object' => $object, 'edited' => $event['edited']]; Item::update($fields, ['id' => $item['id']]); - - $item_id = $item['id']; - } else { - $item_id = 0; } Hook::callAll('event_updated', $event['id']); @@ -320,57 +309,97 @@ class Event extends BaseObject // New event. Store it. DBA::insert('event', $event); - $item_id = 0; - - // Don't create an item for birthday events - if ($event['type'] == 'event') { - $event['id'] = DBA::lastInsertId(); - - $item_arr = []; - - $item_arr['uid'] = $event['uid']; - $item_arr['contact-id'] = $event['cid']; - $item_arr['uri'] = $event['uri']; - $item_arr['parent-uri'] = $event['uri']; - $item_arr['guid'] = $event['guid']; - $item_arr['plink'] = $arr['plink'] ?? ''; - $item_arr['post-type'] = Item::PT_EVENT; - $item_arr['wall'] = $event['cid'] ? 0 : 1; - $item_arr['contact-id'] = $contact['id']; - $item_arr['owner-name'] = $contact['name']; - $item_arr['owner-link'] = $contact['url']; - $item_arr['owner-avatar'] = $contact['thumb']; - $item_arr['author-name'] = $contact['name']; - $item_arr['author-link'] = $contact['url']; - $item_arr['author-avatar'] = $contact['thumb']; - $item_arr['title'] = ''; - $item_arr['allow_cid'] = $event['allow_cid']; - $item_arr['allow_gid'] = $event['allow_gid']; - $item_arr['deny_cid'] = $event['deny_cid']; - $item_arr['deny_gid'] = $event['deny_gid']; - $item_arr['private'] = $private; - $item_arr['visible'] = 1; - $item_arr['verb'] = ACTIVITY_POST; - $item_arr['object-type'] = ACTIVITY_OBJ_EVENT; - $item_arr['origin'] = $event['cid'] === 0 ? 1 : 0; - $item_arr['body'] = self::getBBCode($event); - $item_arr['event-id'] = $event['id']; - - $item_arr['object'] = '' . XML::escape(ACTIVITY_OBJ_EVENT) . '' . XML::escape($event['uri']) . ''; - $item_arr['object'] .= '' . XML::escape(self::getBBCode($event)) . ''; - $item_arr['object'] .= '' . "\n"; - - $item_id = Item::insert($item_arr); - } + $event['id'] = DBA::lastInsertId(); Hook::callAll("event_created", $event['id']); } - return $item_id; + return $event['id']; + } + + public static function getItemArrayForId(int $event_id, array $item = []):array + { + if (empty($event_id)) { + return $item; + } + + $event = DBA::selectFirst('event', [], ['id' => $event_id]); + if ($event['type'] != 'event') { + return $item; + } + + if ($event['cid']) { + $conditions = ['id' => $event['cid']]; + } else { + $conditions = ['uid' => $event['uid'], 'self' => true]; + } + + $contact = DBA::selectFirst('contact', [], $conditions); + + $event['id'] = $event_id; + + $item['uid'] = $event['uid']; + $item['contact-id'] = $event['cid']; + $item['uri'] = $event['uri']; + $item['uri-id'] = ItemURI::getIdByURI($event['uri']); + $item['guid'] = $event['guid']; + $item['plink'] = $arr['plink'] ?? ''; + $item['post-type'] = Item::PT_EVENT; + $item['wall'] = $event['cid'] ? 0 : 1; + $item['contact-id'] = $contact['id']; + $item['owner-name'] = $contact['name']; + $item['owner-link'] = $contact['url']; + $item['owner-avatar'] = $contact['thumb']; + $item['author-name'] = $contact['name']; + $item['author-link'] = $contact['url']; + $item['author-avatar'] = $contact['thumb']; + $item['title'] = ''; + $item['allow_cid'] = $event['allow_cid']; + $item['allow_gid'] = $event['allow_gid']; + $item['deny_cid'] = $event['deny_cid']; + $item['deny_gid'] = $event['deny_gid']; + $item['private'] = intval($event['private'] ?? 0); + $item['visible'] = 1; + $item['verb'] = Activity::POST; + $item['object-type'] = Activity\ObjectType::EVENT; + $item['post-type'] = Item::PT_EVENT; + $item['origin'] = $event['cid'] === 0 ? 1 : 0; + $item['body'] = self::getBBCode($event); + $item['event-id'] = $event['id']; + + $item['object'] = '' . XML::escape(Activity\ObjectType::EVENT) . '' . XML::escape($event['uri']) . ''; + $item['object'] .= '' . XML::escape(self::getBBCode($event)) . ''; + $item['object'] .= '' . "\n"; + + return $item; + } + + public static function getItemArrayForImportedId(int $event_id, array $item = []):array + { + if (empty($event_id)) { + return $item; + } + + $event = DBA::selectFirst('event', [], ['id' => $event_id]); + if ($event['type'] != 'event') { + return $item; + } + + $item['post-type'] = Item::PT_EVENT; + $item['title'] = ''; + $item['object-type'] = Activity\ObjectType::EVENT; + $item['body'] = self::getBBCode($event); + $item['event-id'] = $event_id; + + $item['object'] = '' . XML::escape(Activity\ObjectType::EVENT) . '' . XML::escape($event['uri']) . ''; + $item['object'] .= '' . XML::escape(self::getBBCode($event)) . ''; + $item['object'] .= '' . "\n"; + + return $item; } /** - * @brief Create an array with translation strings used for events. + * Create an array with translation strings used for events. * * @return array Array with translations strings. * @throws \Friendica\Network\HTTPException\InternalServerErrorException @@ -378,70 +407,70 @@ class Event extends BaseObject public static function getStrings() { // First day of the week (0 = Sunday). - $firstDay = PConfig::get(local_user(), 'system', 'first_day_of_week', 0); + $firstDay = DI::pConfig()->get(local_user(), 'system', 'first_day_of_week', 0); $i18n = [ "firstDay" => $firstDay, - "allday" => L10n::t("all-day"), - - "Sun" => L10n::t("Sun"), - "Mon" => L10n::t("Mon"), - "Tue" => L10n::t("Tue"), - "Wed" => L10n::t("Wed"), - "Thu" => L10n::t("Thu"), - "Fri" => L10n::t("Fri"), - "Sat" => L10n::t("Sat"), - - "Sunday" => L10n::t("Sunday"), - "Monday" => L10n::t("Monday"), - "Tuesday" => L10n::t("Tuesday"), - "Wednesday" => L10n::t("Wednesday"), - "Thursday" => L10n::t("Thursday"), - "Friday" => L10n::t("Friday"), - "Saturday" => L10n::t("Saturday"), - - "Jan" => L10n::t("Jan"), - "Feb" => L10n::t("Feb"), - "Mar" => L10n::t("Mar"), - "Apr" => L10n::t("Apr"), - "May" => L10n::t("May"), - "Jun" => L10n::t("Jun"), - "Jul" => L10n::t("Jul"), - "Aug" => L10n::t("Aug"), - "Sep" => L10n::t("Sept"), - "Oct" => L10n::t("Oct"), - "Nov" => L10n::t("Nov"), - "Dec" => L10n::t("Dec"), - - "January" => L10n::t("January"), - "February" => L10n::t("February"), - "March" => L10n::t("March"), - "April" => L10n::t("April"), - "June" => L10n::t("June"), - "July" => L10n::t("July"), - "August" => L10n::t("August"), - "September" => L10n::t("September"), - "October" => L10n::t("October"), - "November" => L10n::t("November"), - "December" => L10n::t("December"), - - "today" => L10n::t("today"), - "month" => L10n::t("month"), - "week" => L10n::t("week"), - "day" => L10n::t("day"), - - "noevent" => L10n::t("No events to display"), - - "dtstart_label" => L10n::t("Starts:"), - "dtend_label" => L10n::t("Finishes:"), - "location_label" => L10n::t("Location:") + "allday" => DI::l10n()->t("all-day"), + + "Sun" => DI::l10n()->t("Sun"), + "Mon" => DI::l10n()->t("Mon"), + "Tue" => DI::l10n()->t("Tue"), + "Wed" => DI::l10n()->t("Wed"), + "Thu" => DI::l10n()->t("Thu"), + "Fri" => DI::l10n()->t("Fri"), + "Sat" => DI::l10n()->t("Sat"), + + "Sunday" => DI::l10n()->t("Sunday"), + "Monday" => DI::l10n()->t("Monday"), + "Tuesday" => DI::l10n()->t("Tuesday"), + "Wednesday" => DI::l10n()->t("Wednesday"), + "Thursday" => DI::l10n()->t("Thursday"), + "Friday" => DI::l10n()->t("Friday"), + "Saturday" => DI::l10n()->t("Saturday"), + + "Jan" => DI::l10n()->t("Jan"), + "Feb" => DI::l10n()->t("Feb"), + "Mar" => DI::l10n()->t("Mar"), + "Apr" => DI::l10n()->t("Apr"), + "May" => DI::l10n()->t("May"), + "Jun" => DI::l10n()->t("Jun"), + "Jul" => DI::l10n()->t("Jul"), + "Aug" => DI::l10n()->t("Aug"), + "Sep" => DI::l10n()->t("Sept"), + "Oct" => DI::l10n()->t("Oct"), + "Nov" => DI::l10n()->t("Nov"), + "Dec" => DI::l10n()->t("Dec"), + + "January" => DI::l10n()->t("January"), + "February" => DI::l10n()->t("February"), + "March" => DI::l10n()->t("March"), + "April" => DI::l10n()->t("April"), + "June" => DI::l10n()->t("June"), + "July" => DI::l10n()->t("July"), + "August" => DI::l10n()->t("August"), + "September" => DI::l10n()->t("September"), + "October" => DI::l10n()->t("October"), + "November" => DI::l10n()->t("November"), + "December" => DI::l10n()->t("December"), + + "today" => DI::l10n()->t("today"), + "month" => DI::l10n()->t("month"), + "week" => DI::l10n()->t("week"), + "day" => DI::l10n()->t("day"), + + "noevent" => DI::l10n()->t("No events to display"), + + "dtstart_label" => DI::l10n()->t("Starts:"), + "dtend_label" => DI::l10n()->t("Finishes:"), + "location_label" => DI::l10n()->t("Location:") ]; return $i18n; } /** - * @brief Removes duplicated birthday events. + * Removes duplicated birthday events. * * @param array $dates Array of possibly duplicated events. * @return array Cleaned events. @@ -463,7 +492,7 @@ class Event extends BaseObject } /** - * @brief Get an event by its event ID. + * Get an event by its event ID. * * @param int $owner_uid The User ID of the owner of the event * @param int $event_id The ID of the event in the event table @@ -481,30 +510,26 @@ class Event extends BaseObject } // Query for the event by event id - $r = q("SELECT `event`.*, `item`.`id` AS `itemid` FROM `event` - LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid` - WHERE `event`.`uid` = %d AND `event`.`id` = %d $sql_extra", - intval($owner_uid), - intval($event_id) - ); - - if (DBA::isResult($r)) { - $return = self::removeDuplicates($r); + $events = DBA::toArray(DBA::p("SELECT `event`.*, `post-user`.`id` AS `itemid` FROM `event` + LEFT JOIN `post-user` ON `post-user`.`event-id` = `event`.`id` AND `post-user`.`uid` = `event`.`uid` + WHERE `event`.`uid` = ? AND `event`.`id` = ? $sql_extra", + $owner_uid, $event_id)); + + if (DBA::isResult($events)) { + $return = self::removeDuplicates($events); } return $return; } /** - * @brief Get all events in a specific time frame. + * Get all events in a specific time frame. * * @param int $owner_uid The User ID of the owner of the events. * @param array $event_params An associative array with * int 'ignore' => * string 'start' => Start time of the timeframe. * string 'finish' => Finish time of the timeframe. - * string 'adjust_start' => - * string 'adjust_finish' => * * @param string $sql_extra Additional sql conditions (e.g. permission request). * @@ -521,32 +546,24 @@ class Event extends BaseObject } // Query for the event by date. - // @todo Slow query (518 seconds to run), to be optimzed - $r = q("SELECT `event`.*, `item`.`id` AS `itemid` FROM `event` - LEFT JOIN `item` ON `item`.`event-id` = `event`.`id` AND `item`.`uid` = `event`.`uid` - WHERE `event`.`uid` = %d AND event.ignore = %d - AND ((`adjust` = 0 AND (`finish` >= '%s' OR (nofinish AND start >= '%s')) AND `start` <= '%s') - OR (`adjust` = 1 AND (`finish` >= '%s' OR (nofinish AND start >= '%s')) AND `start` <= '%s')) - $sql_extra ", - intval($owner_uid), - intval($event_params["ignore"]), - DBA::escape($event_params["start"]), - DBA::escape($event_params["start"]), - DBA::escape($event_params["finish"]), - DBA::escape($event_params["adjust_start"]), - DBA::escape($event_params["adjust_start"]), - DBA::escape($event_params["adjust_finish"]) - ); - - if (DBA::isResult($r)) { - $return = self::removeDuplicates($r); + $events = DBA::toArray(DBA::p("SELECT `event`.*, `post-user`.`id` AS `itemid` FROM `event` + LEFT JOIN `post-user` ON `post-user`.`event-id` = `event`.`id` AND `post-user`.`uid` = `event`.`uid` + WHERE `event`.`uid` = ? AND `event`.`ignore` = ? + AND (`finish` >= ? OR (`nofinish` AND `start` >= ?)) AND `start` <= ? + " . $sql_extra, + $owner_uid, $event_params['ignore'], + $event_params['start'], $event_params['start'], $event_params['finish'] + )); + + if (DBA::isResult($events)) { + $return = self::removeDuplicates($events); } return $return; } /** - * @brief Convert an array query results in an array which could be used by the events template. + * Convert an array query results in an array which could be used by the events template. * * @param array $event_result Event query array. * @return array Event array for the template. @@ -558,25 +575,25 @@ class Event extends BaseObject $event_list = []; $last_date = ''; - $fmt = L10n::t('l, F j'); + $fmt = DI::l10n()->t('l, F j'); foreach ($event_result as $event) { - $item = Item::selectFirst(['plink', 'author-name', 'author-avatar', 'author-link'], ['id' => $event['itemid']]); + $item = Post::selectFirst(['plink', 'author-name', 'author-avatar', 'author-link', 'private', 'uri-id'], ['id' => $event['itemid']]); if (!DBA::isResult($item)) { // Using default values when no item had been found - $item = ['plink' => '', 'author-name' => '', 'author-avatar' => '', 'author-link' => '']; + $item = ['plink' => '', 'author-name' => '', 'author-avatar' => '', 'author-link' => '', 'private' => Item::PUBLIC, 'uri-id' => ($event['uri-id'] ?? 0)]; } $event = array_merge($event, $item); - $start = $event['adjust'] ? DateTimeFormat::local($event['start'], 'c') : DateTimeFormat::utc($event['start'], 'c'); - $j = $event['adjust'] ? DateTimeFormat::local($event['start'], 'j') : DateTimeFormat::utc($event['start'], 'j'); - $day = $event['adjust'] ? DateTimeFormat::local($event['start'], $fmt) : DateTimeFormat::utc($event['start'], $fmt); - $day = L10n::getDay($day); + $start = DateTimeFormat::local($event['start'], 'c'); + $j = DateTimeFormat::local($event['start'], 'j'); + $day = DateTimeFormat::local($event['start'], $fmt); + $day = DI::l10n()->getDay($day); if ($event['nofinish']) { $end = null; } else { - $end = $event['adjust'] ? DateTimeFormat::local($event['finish'], 'c') : DateTimeFormat::utc($event['finish'], 'c'); + $end = DateTimeFormat::local($event['finish'], 'c'); } $is_first = ($day !== $last_date); @@ -589,26 +606,24 @@ class Event extends BaseObject $copy = null; $drop = null; if (local_user() && local_user() == $event['uid'] && $event['type'] == 'event') { - $edit = !$event['cid'] ? [System::baseUrl() . '/events/event/' . $event['id'], L10n::t('Edit event') , '', ''] : null; - $copy = !$event['cid'] ? [System::baseUrl() . '/events/copy/' . $event['id'] , L10n::t('Duplicate event'), '', ''] : null; - $drop = [System::baseUrl() . '/events/drop/' . $event['id'] , L10n::t('Delete event') , '', '']; + $edit = !$event['cid'] ? [DI::baseUrl() . '/events/event/' . $event['id'], DI::l10n()->t('Edit event') , '', ''] : null; + $copy = !$event['cid'] ? [DI::baseUrl() . '/events/copy/' . $event['id'] , DI::l10n()->t('Duplicate event'), '', ''] : null; + $drop = [DI::baseUrl() . '/events/drop/' . $event['id'] , DI::l10n()->t('Delete event') , '', '']; } - $title = BBCode::convert(Strings::escapeHtml($event['summary'])); + $title = BBCode::convertForUriId($event['uri-id'], Strings::escapeHtml($event['summary'])); if (!$title) { - list($title, $_trash) = explode(" $event['id'], 'start' => $start, @@ -623,7 +638,7 @@ class Event extends BaseObject 'is_first' => $is_first, 'item' => $event, 'html' => $html, - 'plink' => [$event['plink'], L10n::t('link to source'), '', ''], + 'plink' => Item::getPlink($event), ]; } @@ -631,7 +646,7 @@ class Event extends BaseObject } /** - * @brief Format event to export format (ical/csv). + * Format event to export format (ical/csv). * * @param array $events Query result for events. * @param string $format The output format (ical/csv). @@ -686,23 +701,14 @@ class Event extends BaseObject // but test your solution against http://icalvalid.cloudapp.net/ // also long lines SHOULD be split at 75 characters length foreach ($events as $event) { - if ($event['adjust'] == 1) { - $UTC = 'Z'; - } else { - $UTC = ''; - } $o .= 'BEGIN:VEVENT' . PHP_EOL; if ($event['start']) { - $tmp = strtotime($event['start']); - $dtformat = "%Y%m%dT%H%M%S" . $UTC; - $o .= 'DTSTART:' . strftime($dtformat, $tmp) . PHP_EOL; + $o .= 'DTSTART:' . DateTimeFormat::utc($event['start'], 'Ymd\THis\Z') . PHP_EOL; } if (!$event['nofinish']) { - $tmp = strtotime($event['finish']); - $dtformat = "%Y%m%dT%H%M%S" . $UTC; - $o .= 'DTEND:' . strftime($dtformat, $tmp) . PHP_EOL; + $o .= 'DTEND:' . DateTimeFormat::utc($event['finish'], 'Ymd\THis\Z') . PHP_EOL; } if ($event['summary']) { @@ -738,7 +744,7 @@ class Event extends BaseObject } /** - * @brief Get all events for a user ID. + * Get all events for a user ID. * * The query for events is done permission sensitive. * If the user is the owner of the calendar they @@ -759,7 +765,7 @@ class Event extends BaseObject return $return; } - $fields = ['start', 'finish', 'adjust', 'summary', 'desc', 'location', 'nofinish']; + $fields = ['start', 'finish', 'summary', 'desc', 'location', 'nofinish']; $conditions = ['uid' => $uid, 'cid' => 0]; @@ -832,7 +838,7 @@ class Event extends BaseObject } /** - * @brief Format an item array with event data to HTML. + * Format an item array with event data to HTML. * * @param array $item Array with item and event data. * @return string HTML output. @@ -844,53 +850,27 @@ class Event extends BaseObject $finish = false; // Set the different time formats. - $dformat = L10n::t('l F d, Y \@ g:i A'); // Friday January 18, 2011 @ 8:01 AM. - $dformat_short = L10n::t('D g:i A'); // Fri 8:01 AM. - $tformat = L10n::t('g:i A'); // 8:01 AM. + $dformat = DI::l10n()->t('l F d, Y \@ g:i A'); // Friday January 18, 2011 @ 8:01 AM. + $dformat_short = DI::l10n()->t('D g:i A'); // Fri 8:01 AM. + $tformat = DI::l10n()->t('g:i A'); // 8:01 AM. // Convert the time to different formats. - $dtstart_dt = L10n::getDay( - $item['event-adjust'] ? - DateTimeFormat::local($item['event-start'], $dformat) - : DateTimeFormat::utc($item['event-start'], $dformat) - ); - $dtstart_title = DateTimeFormat::utc($item['event-start'], $item['event-adjust'] ? DateTimeFormat::ATOM : 'Y-m-d\TH:i:s'); + $dtstart_dt = DI::l10n()->getDay(DateTimeFormat::local($item['event-start'], $dformat)); + $dtstart_title = DateTimeFormat::utc($item['event-start'], DateTimeFormat::ATOM); // Format: Jan till Dec. - $month_short = L10n::getDayShort( - $item['event-adjust'] ? - DateTimeFormat::local($item['event-start'], 'M') - : DateTimeFormat::utc($item['event-start'], 'M') - ); + $month_short = DI::l10n()->getDayShort(DateTimeFormat::local($item['event-start'], 'M')); // Format: 1 till 31. - $date_short = $item['event-adjust'] ? - DateTimeFormat::local($item['event-start'], 'j') - : DateTimeFormat::utc($item['event-start'], 'j'); - $start_time = $item['event-adjust'] ? - DateTimeFormat::local($item['event-start'], $tformat) - : DateTimeFormat::utc($item['event-start'], $tformat); - $start_short = L10n::getDayShort( - $item['event-adjust'] ? - DateTimeFormat::local($item['event-start'], $dformat_short) - : DateTimeFormat::utc($item['event-start'], $dformat_short) - ); + $date_short = DateTimeFormat::local($item['event-start'], 'j'); + $start_time = DateTimeFormat::local($item['event-start'], $tformat); + $start_short = DI::l10n()->getDayShort(DateTimeFormat::local($item['event-start'], $dformat_short)); // If the option 'nofinisch' isn't set, we need to format the finish date/time. if (!$item['event-nofinish']) { $finish = true; - $dtend_dt = L10n::getDay( - $item['event-adjust'] ? - DateTimeFormat::local($item['event-finish'], $dformat) - : DateTimeFormat::utc($item['event-finish'], $dformat) - ); - $dtend_title = DateTimeFormat::utc($item['event-finish'], $item['event-adjust'] ? DateTimeFormat::ATOM : 'Y-m-d\TH:i:s'); - $end_short = L10n::getDayShort( - $item['event-adjust'] ? - DateTimeFormat::local($item['event-finish'], $dformat_short) - : DateTimeFormat::utc($item['event-finish'], $dformat_short) - ); - $end_time = $item['event-adjust'] ? - DateTimeFormat::local($item['event-finish'], $tformat) - : DateTimeFormat::utc($item['event-finish'], $tformat); + $dtend_dt = DI::l10n()->getDay(DateTimeFormat::local($item['event-finish'], $dformat)); + $dtend_title = DateTimeFormat::utc($item['event-finish'], DateTimeFormat::ATOM); + $end_short = DI::l10n()->getDayShort(DateTimeFormat::utc($item['event-finish'], $dformat_short)); + $end_time = DateTimeFormat::local($item['event-finish'], $tformat); // Check if start and finish time is at the same day. if (substr($dtstart_title, 0, 10) === substr($dtend_title, 0, 10)) { $same_date = true; @@ -906,17 +886,19 @@ class Event extends BaseObject $location = self::locationToArray($item['event-location']); // Construct the profile link (magic-auth). - $profile_link = Contact::magicLinkById($item['author-id']); + $author = ['uid' => 0, 'id' => $item['author-id'], + 'network' => $item['author-network'], 'url' => $item['author-link']]; + $profile_link = Contact::magicLinkByContact($author); $tpl = Renderer::getMarkupTemplate('event_stream_item.tpl'); $return = Renderer::replaceMacros($tpl, [ '$id' => $item['event-id'], - '$title' => prepare_text($item['event-summary']), - '$dtstart_label' => L10n::t('Starts:'), + '$title' => BBCode::convertForUriId($item['uri-id'], $item['event-summary']), + '$dtstart_label' => DI::l10n()->t('Starts:'), '$dtstart_title' => $dtstart_title, '$dtstart_dt' => $dtstart_dt, '$finish' => $finish, - '$dtend_label' => L10n::t('Finishes:'), + '$dtend_label' => DI::l10n()->t('Finishes:'), '$dtend_title' => $dtend_title, '$dtend_dt' => $dtend_dt, '$month_short' => $month_short, @@ -929,11 +911,11 @@ class Event extends BaseObject '$author_name' => $item['author-name'], '$author_link' => $profile_link, '$author_avatar' => $item['author-avatar'], - '$description' => prepare_text($item['event-desc']), - '$location_label' => L10n::t('Location:'), - '$show_map_label' => L10n::t('Show map'), - '$hide_map_label' => L10n::t('Hide map'), - '$map_btn_label' => L10n::t('Show map'), + '$description' => BBCode::convertForUriId($item['uri-id'], $item['event-desc']), + '$location_label' => DI::l10n()->t('Location:'), + '$show_map_label' => DI::l10n()->t('Show map'), + '$hide_map_label' => DI::l10n()->t('Hide map'), + '$map_btn_label' => DI::l10n()->t('Show map'), '$location' => $location ]); @@ -941,7 +923,7 @@ class Event extends BaseObject } /** - * @brief Format a string with map bbcode to an array with location data. + * Format a string with map bbcode to an array with location data. * * Note: The string must only contain location data. A string with no bbcode will be * handled as location name. @@ -979,7 +961,7 @@ class Event extends BaseObject } } - $location['name'] = prepare_text($location['name']); + $location['name'] = BBCode::convert($location['name']); // Construct the map HTML. if (isset($location['address'])) { @@ -992,7 +974,7 @@ class Event extends BaseObject } /** - * @brief Add new birthday event for this person + * Add new birthday event for this person * * @param array $contact Contact array, expects: id, uid, url, name * @param string $birthday Birthday of the contact @@ -1024,10 +1006,9 @@ class Event extends BaseObject 'cid' => $contact['id'], 'start' => DateTimeFormat::utc($birthday), 'finish' => DateTimeFormat::utc($birthday . ' + 1 day '), - 'summary' => L10n::t('%s\'s birthday', $contact['name']), - 'desc' => L10n::t('Happy Birthday %s', ' [url=' . $contact['url'] . ']' . $contact['name'] . '[/url]'), + 'summary' => DI::l10n()->t('%s\'s birthday', $contact['name']), + 'desc' => DI::l10n()->t('Happy Birthday %s', ' [url=' . $contact['url'] . ']' . $contact['name'] . '[/url]'), 'type' => 'birthday', - 'adjust' => 0 ]; self::store($values);