2016-09-13 5 views
0

У меня есть «подписной календарь» на моем iPhone, который извлекает события календаря в формате iCalendar из URL-адреса. Календарь работает отлично, за исключением того, что не отображается следующее событие, есть ли причина? Все остальные события показывают хорошо. Я думаю, что может быть проблема с тем, как событие форматируется/синтаксис, но я не могу найти ничего, что может вызвать его.Есть ли синтаксическая ошибка в этом коде события iCalendar?

BEGIN:VEVENT SUMMARY:Meet with tenant DESCRIPTION:Notes: Meter readings\, SoC images\, post box key\, finalise Let Procedure.\nLocation: Apartment X X Woodland Road\, Bebington\, Wirral\, CHXX XXX\nEmployee: Michael Le Brocq\nStatus: Confirmed\nOriginally Arranged: 07/09/16 12:18:43 by Lucy Christian\nLast Updated: 12/09/16 15:57:05 by Michael Le Brocq\n UID:2432 STATUS:CONFIRMED DTSTART:20160914T160000 DTEND:20160914T151500 LAST-MODIFIED:20160912T155705 LOCATION:Apartment 5 20 Woodland Road\, Bebington\, Wirral\, CH42 4NT END:VEVENT 

Код, используемый для генерации событий календаря;

<?php 

require_once('../inc/app_top_cron.php'); 

if (!empty($_GET)) { 

// define and escape each GET as a variable 

foreach ($_GET as $key => $value) { 

if (!empty($value)) { 

${$key} = mysqli_real_escape_string($con, PrepareInput($value)); 

} 
} 
} 

// company details 
$company_details_query = mysqli_query($con, "SELECT company_id, company_trading_name FROM company WHERE company_token = '" . $company . "' LIMIT 1") or die(mysql_error()); 
$company_details = mysqli_fetch_array($company_details_query); 

// the iCal date format. Note the Z on the end indicates a UTC timestamp. 
define('DATE_ICAL', 'Ymd\THis'); 

// max line length is 75 chars. New line is \\r\n 

$output = "BEGIN:VCALENDAR 
METHOD:PUBLISH 
VERSION:2.0 
PRODID:-//Property Software//Calendar//EN 
CALSCALE:GREGORIAN 
X-WR-CALNAME:" . $company_details['company_trading_name'] . " Calendar" . " 
\r\n"; 

$sql = "SELECT ce.*, ces.calendar_event_status_name 
FROM calendar_event ce 
INNER JOIN calendar_event_status ces 
on ce.calendar_event_status = ces.calendar_event_status_id 
WHERE ce.calendar_event_company_id = '" . $company_details['company_id'] . "'"; 

$calendar_event_query = mysqli_query($con, $sql) or die(mysql_error()); 

while($row = mysqli_fetch_array($calendar_event_query)) { 

$calendar_event_subject = str_replace(",","\,", $row['calendar_event_subject']); 

$calendar_event_description = str_replace(",","\,", $row['calendar_event_description']); 
$calendar_event_description = str_replace("\r\n","\\n", $calendar_event_description); 

$calendar_event_location = str_replace(",","\,", $row['calendar_event_location']); 

// loop through events 
$output .= 
"BEGIN:VEVENT 
SUMMARY:" . $calendar_event_subject . " 
DESCRIPTION:" . $calendar_event_description . " 
UID:" . $row["calendar_event_id"] . " 
STATUS:" . $row["calendar_event_status_name"] . " 
DTSTART:" . date(DATE_ICAL, strtotime($row["calendar_event_start"])) . " 
DTEND:" . date(DATE_ICAL, strtotime($row["calendar_event_end"])) . " 
LAST-MODIFIED:" . date(DATE_ICAL, strtotime($row["calendar_event_date_updated"])) . " 
LOCATION:" . $calendar_event_location . " 
END:VEVENT 
"; 
} 

// close calendar 
$output .= "END:VCALENDAR"; 

echo $output; 

mysqli_close($con); 

?> 
+0

Нет разрывов строк, поэтому синтаксический анализатор не может знать, где заканчивается одно поле, а следующее. Возможно, кто-то забронирует собрание, чтобы просмотреть овые форматы, а «LOCATION:» является частью текста приглашения, а не тегом местоположения для места проведения собрания. –

+0

Являются ли теги \ n не разрыв строки? –

+0

AH. Сейчас я вижу некоторых, прокручивая милю. но если они были фактическими разрывами строк, тогда они должны вырезать/вставлять в виде многострочного текстового блока. Поскольку они являются буквальными '' '' 'и' n', вероятно, вы не правильно построили текст в первую очередь. –

ответ

1

Это:

$calendar_event_description = str_replace("\r\n","\\n", $calendar_event_description); 

Вы принимаете \r\n (возврат каретки + перевод строки) и превращение их в буквальном \ характера, за которым следует n. Это не новая строка (один байт/символ), это два байта/символа и не имеет никакого особого значения ни для чего.

И в соответствии с моими комментариями выше, не выполняйте многострочное построение строк/конкатенацию. он делает для трудночитаемой и труднодоступной отладки. Используйте heredoc вместо:

$output = <<<EOL 
BEGIN:VEVENT 
SUMMARY: {$calendar_event_subject} 
DESCRIPTION: {$calendar_event_description} 
UID: {$row["calendar_event_id"]} 
etc... 
EOL; 

Обратите внимание на отсутствие каких-либо " или . - что делает для гораздо более компактным и легким для восприятия блока кода. Если вам нужно изменить разрывы строк после этого, потому что ваша система использует что-то отличное от того, что внедряет ваш редактор кода, вы можете сделать это с помощью простой str_replace() после завершения построения строки.

+0

Спасибо, Марк, как мне исправить это? –

+0

, если вы просто пытаетесь превратить \ r \ n в \ n, тогда просто используйте '' \ n "' в качестве строки замены. у вас есть две обратные косые черты, поэтому первая выходит из второй, и поскольку она скрыта, она больше не является обратным слэшем escape-кода, это буквальный символ обратной косой черты. –