Создать файл ICS с одним событием с помощью механизма выражений - PullRequest
1 голос
/ 21 апреля 2011

Я пытаюсь создать файл ICAL на основе одной записи в канале Expression Engine, но мои методы для этого не удаются.Я пробовал следующее:

  1. Передача идентификатора записи в новый шаблон (который создает файл), но использование функции $_GET, кажется, осуждается в EE
  2. Создание переменной сеанса с идентификатором записи, но, похоже, нет способа добавить эту переменную в запрос {exp}:

    {exp:channel:entries channel="gallery" entry_id="MY_PHP_VARIABLE" limit="1" show_future_entries="yes"}

Я не пробовал просто создавать простой файл каждый раз, когда к единственной странице доступа обращаются с помощью fwrite(), и ссылаться прямо на него, но это кажется дорогостоящим шагом.

Есть ли способ с помощью PHP сделатьфайл, когда я нажимаю кнопку?Может быть, запуск функции, написанной на странице, поэтому мне не нужно передавать или обнаруживать entry_id?

Ответы [ 2 ]

1 голос
/ 10 мая 2011

Не уверен, если вам все еще нужно это, но мне нужно было то же самое, и я написал плагин, чтобы справиться с этим.

https://github.com/expressodev/easy_icalendar

По сути, использование просто вращается вокруг стандартногоТег записей канала, поэтому выглядит примерно так:

{exp:easy_ical:calendar timezone="Pacific/Auckland" name="My Easy Event Calendar"}
    {exp:channel:entries channel="events" show_future_entries="yes" show_expired="yes" limit="20"}
        {exp:easy_ical:event uid="{entry_id}" start_time="{entry_date}" end_time="{expiration_date}" location="{event_location}" summary="{title}"}
            {event_description}
        {/exp:easy_ical:event}
    {/exp:channel:entries}
{/exp:easy_ical:calendar}

. Вы можете использовать его для отображения одной записи при нажатии кнопки.Просто создайте новый шаблон с именем /events/ical или что-то в этом роде и назовите его, используя url /events/ical/url-title (или entry_id).

Затем в цикле записей вашего канала используйте стандартный

{exp:channel:entries channel="events" url_title="{segment_3}"}

Easy iCal выложит действительный загружаемый файл ics.Если вы хотите, чтобы ссылка имела расширение * .ics (некоторые читатели суетливы), поместите entry_id в сегменте 3 и имя файла в сегменте 4:

<a href="/events/ical/{entry_id}/{url_title}.ics">

Затем просто используйте entry_id в вашемшаблон и игнорировать сегмент 4

1 голос
/ 21 апреля 2011

Я делал это раньше с обычным шаблоном с включенным PHP на выходе.

Таким образом, ваша ссылка iCal будет /events/ical/{entry_id}, а шаблон events.group/ical.html будет выглядеть примерно так:

{exp:channel:entries channel="events" sort="asc" show_future_entries="yes" limit="1" require_entry="yes" disable="member_data|categories|pagination"}
<?php
header('Content-type: text/calendar');
header('Content-Disposition: attachment; filename="event-{entry_date format="%Y-%m-%d"}.ics"');
?>
BEGIN:VCALENDAR
PRODID:MY GREAT EVENTS
VERSION:2.0
METHOD:PUBLISH
BEGIN:VEVENT
SUMMARY;CHARSET={charset}:{summary}
DESCRIPTION;CHARSET={charset}:{description}
LOCATION;CHARSET={charset}:{venue}, {address}
UID:{entry_date format="%Y%m%d"}-{entry_id}@mydomain.com
URL:{permalink="events/detail"}
DTSTART;VALUE=DATE:{entry_date format="%Y%m%d"}
DTSTAMP:{entry_date format="%Y%m%d"}T000000Z
END:VEVENT
END:VCALENDAR
{/exp:channel:entries}

Подробности могут меняться, конечно, в зависимости от того, используете ли вы временную часть ваших полей даты или выделенное временное поле и т. Д., Но вы поняли.

...