Jump to content


Photo

MarkupiCalendar

Module

  • Please log in to reply
11 replies to this topic

#1 ffub

ffub

    Jr. Member

  • Members
  • PipPip
  • 37 posts
  • 20

  • LocationLondon, UK

Posted 11 October 2011 - 06:22 AM

Hi guys,

I've been doing events sections for a few sites and for each I needed to make an iCal feed. I've wrapped up this functionality into a module now to make it a little easier for myself and anyone else that needs to make these feeds.

The module is basically a simple wrapper around the iCalcreator library (a copy is included). It's modelled on the MarkupRSS module from Ryan, so anyone familiar with that should have a feed up and running in no time.

Usage
 

The module takes a PageArray and creates the feed from that. The [tt]->render[/tt] method will send the output to the browser with a generated filename and will automatically download. Because it will return HTTP headers, it has to be included before any html and is best in its own template or followed up by [tt]exit;[/tt]

<?php

	$today = time();
	$items = $pages->find("template=event, sort=start_date, start_date>$today");

	$ics = $modules->get("MarkupiCalendar");
	$ics->title = "Upcoming Events";
	$ics->description = "Some upcoming events";
	$ics->itemStartDateField = 'start_date';
	$ics->itemEndDateField = 'end_date';
	$ics->itemLocationField = 'location';
	$ics->render($items);

You can use the [tt]->renderFeed[/tt] method to return the output as a string instead, which is particularly useful if you want to debug or write the output to a file.

<?php

	$today = time();
	$items = $pages->find("template=event, sort=start_date, start_date>$today");

	$ics = $modules->get("MarkupiCalendar");
	$ics->title = "Upcoming Events";
	$ics->description = "Some upcoming events";
	$ics->itemStartDateField = 'start_date';
	$ics->itemEndDateField = 'end_date';
	$ics->itemLocationField = 'location';
	$cal = $ics->renderFeed($items);

	echo $cal;

I often put RSS and iCal feeds at the top of my listing pages so as not to clutter up the site tree with extra templates. This way /events/ may point to my events page, and /events/ical will point to it's feed. Here is an example:

<?php

// iCal feed
if ($input->urlSegment1 == "ical") {
	
	$today = time();
	$items = $page->children("sort=start_date, start_date>$today");
	
	$ics = $modules->get("MarkupiCalendar");
	$ics->title = "Upcoming Events";
	$ics->description = "Upcoming events for my company";
	$ics->itemStartDateField = 'start_date';
	$ics->itemEndDateField = 'end_date';
	$ics->itemLocationField = 'location';
	$ics->url = $page->httpUrl;
	$ics->render($items);
	exit;
	
}

// Render the template as normal.
include("./includes/head.inc");

Download and feedback
 

You can download or fork the module here: https://github.com/f...MarkupiCalendar

At the moment it only supports all day events (as these are all I have dealt with) but I hope to add time based events soon. Any feedback is warmly appreciated and feel free to report bugs or suggestions for improvement.

Stephen

#2 apeisa

apeisa

    Hero Member

  • Moderators
  • 3,154 posts
  • 1705

  • LocationVihti, Finland

Posted 11 October 2011 - 07:14 AM

Great stuff! Will definitely try this soon.

#3 alchime.net

alchime.net

    Distinguished Member

  • Members
  • PipPip
  • 31 posts
  • 0

  • LocationReunion - Island ile de la Reunion

Posted 11 October 2011 - 08:41 AM

Could be usefull for somes ! thanks for sharing.

Maybe add a link to a demo or live site to see the kind of results you got with that module ?

#4 ryan

ryan

    Reiska

  • Administrators
  • 7,797 posts
  • 6572

  • LocationAtlanta, GA

Posted 11 October 2011 - 10:49 AM

Great job ffub! Nice work with the code and documenting how to use it too. I will add to the modules directory asap. Thanks for your work here. I will definitely be using this module in the future.

#5 Michael Murphy

Michael Murphy

    Distinguished Member

  • Members
  • PipPipPipPip
  • 101 posts
  • 66

  • LocationBasel, Switzerland

Posted 12 October 2011 - 02:30 PM

Thanks, thats great timing, as I was just about to start hacking the rss module to do something similar for an events section.

Can I also suggest another tip that I found useful .
If you want the users to subscribe to the calendar, instead of just downloading it, use the  webcal:// uri scheme - e.g.

webcal://you.com/upcoming/ical

When the user clicks on the link, it should open up in their default calendar application.
Then whenever you update the events section, the users calendar will also get updated.  Nice!

#6 ffub

ffub

    Jr. Member

  • Members
  • PipPip
  • 37 posts
  • 20

  • LocationLondon, UK

Posted 13 October 2011 - 06:44 AM

Thanks for the feedback everyone. I hope it can be useful. As I said above, the module is still lacking support for times. I'd be curious to know how others are storing events - whether you are using a single field for date and time, or whether you are storing time separately and taking its absence to mean all-day? The main reason I can see for having it as a separate field is it leaves the date picker to work it's magic and thus makes adding events fairly painless for the user.

mjmurphy:

You are right to point out that the webcal: uri is informally used to denote iCal feeds. You can do this with the links in my examples above. While the [tt]->render[/tt] method will send the page as a download when accessed directly, I've tried it out with iCal and Google Calendar and it works just fine as a feed. If you wish to use the feed differently, such as sending different headers then [tt]->renderFeed[/tt] will let you do that. In addition to your suggested webcal:// link I tend to add Google Calendar links as many people use this now. Here's an example:

<?php
	$gcalLink = urlencode($pages->get("/")->httpUrl . "events/ical");
	echo "<a href='webcal://{$config->httpHost}/events/ical'>Subscribe to Calendar</a><br/>";
	echo "<a href='https://www.google.com/calendar/render?cid=$gcalLink'>Add to Google Calendar</a>";

Thanks,
Stephen

#7 ryan

ryan

    Reiska

  • Administrators
  • 7,797 posts
  • 6572

  • LocationAtlanta, GA

Posted 13 October 2011 - 11:05 AM

I'd be curious to know how others are storing events - whether you are using a single field for date and time, or whether you are storing time separately and taking its absence to mean all-day?


Actually there is no such thing as absence of time in unix timestamps (which is what PW uses). Every date is also storing a time. It's just a matter of whether you are using and outputting a time with it. I think that if you only specify a date, then it just uses the earliest possible time from that date (i.e. midnight).

I've developed a module that is somewhat related to yours in the opposite direction, though don't yet have it release ready. But what it does is lets you to query a Google Calendar for date ranges or keywords, and then lets you iterate and output the results like pages.

#8 Michael Murphy

Michael Murphy

    Distinguished Member

  • Members
  • PipPipPipPip
  • 101 posts
  • 66

  • LocationBasel, Switzerland

Posted 13 October 2011 - 11:43 AM

@Ryan

I would be very interested in that Google calendar module. Building an event system can get quite complicated especially when you add on all the extra features that clients normally request like repeating and multiday events. Google calendar would solve all these issues, and give them a highly functional and collaborative calendar. The pw site could then just display the upcoming events. nice and simple

@ffub

I am using two datefields - start and end time. Each field accepts a time string (d/m/Y H:i).
I've not implemented "all day" events functionality, but i think If the date and times are the same, then this could indicate an "all day" event? Another idea might be to have an additional checkbox field which gets ticked if its an "all dayer".

While we are the subject of time (maybe I should move this to another thread), I have been trying to extend the datatime calendar widget to include a nice Time picker. It's just a plugin for the existing jqueryui datepicker

http://trentrichards...les/timepicker/

I managed to get it sort of working, but it was not saving the correct date. I was also hacking at the core module, which is probably not best practice. Any tips or advice on how to get this working would be welcome.


Thanks,
Michael




#9 ryan

ryan

    Reiska

  • Administrators
  • 7,797 posts
  • 6572

  • LocationAtlanta, GA

Posted 14 October 2011 - 08:03 AM

I would be very interested in that Google calendar module. Building an event system can get quite complicated especially when you add on all the extra features that clients normally request like repeating and multiday events. Google calendar would solve all these issues, and give them a highly functional and collaborative calendar. The pw site could then just display the upcoming events. nice and simple


I agree! I hadn't worked much with Google Calendar before, but am really liking it. I'm looking forward to finishing up this module.

#10 ffub

ffub

    Jr. Member

  • Members
  • PipPip
  • 37 posts
  • 20

  • LocationLondon, UK

Posted 19 October 2011 - 11:39 AM

@ryan

I realise that unix timestamps include a time as well, but this seems to confuse Google Calendar somewhat as multiple day events where I had not specified a time seemed to begin at 1 in the morning. It may well be something to do with the timezone and/or daylight savings though. I've not had time to debug this so for the sake of ease I am passing the events as dates rather than timestamps, eg:

CREATED:20111005T020915Z
DTSTART;VALUE=DATE:20111028

I used Google Calendar originally on my sites and I really love it. I was pulling the events in via an RSS feed. I will definitely be interested in your new module for my simpler sites now.

@mjmurphy

It's actually from the UX perspective that I have suggested having separate time fields. The datepicker lets you pick a date with relative ease and you can manually amend a time to that. This is a bit confusing for users though. Also, changing the date with the date picker, seems to remove the time. I encourage my users to stick to the jQuery UI picker as we are used to writing d/m/Y here in the UK, which is indistinguishable from m/d/Y to PHP. No amount of prodding or helpful reminders seems to make entering in a different format (such as Y-m-d) stick for them. Your date picker changes look like a very good solution to this problem for me though!

I have considered making a new dates InputType/FieldType for events that more closely mimics Google's excellent one to tackle some of these problems (see attachments). I'm not entirely sure how to go about that though. Aside from date entry, having events in PW is a doddle and presents some great possibilities in terms of linking them with other aspects of a site or providing more than a summary for each event (bookings!).

I would strongly suggest anyone else working on events to check out fullCalendar, a great little jQuery plugin. I pass my events to this with a simple JSON feed in order to make a scrollable calendar widget.

Stephen

Attached Thumbnails

  • Screen Shot 2011-10-19 at 17.21.14.png
  • Screen Shot 2011-10-19 at 17.21.05.png


#11 yellowled

yellowled

    Sr. Member

  • Members
  • PipPipPipPip
  • 201 posts
  • 152

  • LocationEutin, Germany

Posted 06 June 2012 - 08:38 AM

See, this is what I love about ProcessWire.

I was just in a meeting, and the question came up whether it was possible to export a list of events and dates as a calender, i.e. in iCal format. I wasn't sure about it, but I took a wild guess that there would be some way to do this. Back at home, checked the modules page, BAM, there you go.

For someone like me who is not able to do "real" PHP coding, this is a life saver. Thank you so much. :)

#12 yellowled

yellowled

    Sr. Member

  • Members
  • PipPipPipPip
  • 201 posts
  • 152

  • LocationEutin, Germany

Posted 08 June 2012 - 07:58 AM

At the moment it only supports all day events (as these are all I have dealt with) but I hope to add time based events soon.


Any chance of adding this any time soon? :)

My suggestion would be to point to this thread in the module documentation. It may be because I'm not a skilled PHP coder, but I got along much better once I read your posts here.





Also tagged with one or more of these keywords: Module

0 user(s) are reading this topic

0 members, 0 guests, 0 anonymous users