It is possible for users of your web site to keep a list of events you have published that they are interested in. This works similarly to a shopping cart in that they can add or remove events to their own personal list of events. This is available to both logged-in users and anonymous users.
The difference between the "event cart" and a real shopping cart is that you can't buy events, and the event cart doesn't have the concept of quantities.
For this to work you need to give your user the option to add an event to their cart. You can do this when outputting a list of events (with the Calendar: Event Index container rule) or when displaying a single event's details (with the Calendar: Event Details container rule).
You can then add the Calendar Event Cart container rule so a user can view and manage their events.
In the event a user adds events that clashes with each other, you can give the user the option to choose their preference for clashing events. This is covered below.
You can add or remove events using either normal forms or Ajax requests. If you use Ajax, JSON data is returned that you can use as required. This is covered shortly.
To add an event, submit your form to $forms.cartadd.action
with a form method of $forms.cartadd.method
. This form requires a
parameter called event which contains the URL value (such as
$event.url
) of the event.
If not using Ajax, you can specify the return parameter which contains the URL of the page to load after the event has been added. If this omitted the user is returned to page they were on when they added the event.
Here is a sample template:
<form method="{$forms.cartadd.method}" action="{$forms.cartbulk.action}"> <div> <input type="hidden" name="event" value="{$content.url|escape}" /> <input type="submit" value="Add" /> </div> </form>
Additionally, the event data contains a parameter called in_cart which is true if the event is already in the user's cart, and false if not. You can use this determine whether to show add button or a remove button (removing is covered shortly).
{if $content.in_cart} {* show remove form or no form *} {else} {* show add form *} {/if}
Similar to adding events, you can also remove them. The only difference is that
you use the $forms.cartremove.action
and
$forms.cartremove.method
values instead.
You can use the in_cart
variable once again to determine if
the event is already in the cart, although if you're using the event cart rule you
can assume that all events are already in the cart.
A sample template is as follows:
<form method="{$forms.cartremove.method}" action="{$forms.cartremove.action}"> <div> <input type="hidden" name="event" value="{$content.url|escape}" /> <input type="submit" value="Remove" /> </div> </form>
To remove all events in a user's cart, submit to the
$forms.cartempty.action
URL.
<form method="{$forms.cartempty.method}" action="{$forms.cartempty.action}"> <div> <input type="submit" value="Remove All" /> </div> </form>
When using the event cart and displaying a list of all events for a user, you can also determine any clashes using the clashes array. Each element in this array has a key and value: The key is the ID field of the event it clashes with, while the value is the URL field of the preferred event.
To resolve a clash you must submit to $forms.cartclash.action
.
There are three required parameters: event1
,
event2
and preferred
. The first two
parameters (event1
and event2
) correspond to
the ID field of the two events the clash is being resolved for, while the preferred
field should contain 0
for no preference, the value of
event1
if the first event is preferred, or the value of
event2
if the second event is preferred.
A sample template is provided with Recite for outputting clash data and resolve form.
You can bulk add or remove events using the
$forms.cartbulk.action
URL. This action can accept an array
called add[]
which contains the URL field of events to add, an
array called remove[]
which contains the URL field of events to
remove, and a parameter called empty, which if present will empty the cart.
Events are removed prior to being added, so if the same URL is present in the remove and the add arrays then ultimately the event will be added.
There is a sample template provided with Recite which demonstrates this functionality.
When you submit any of the described actions, you can access a summary of what has
occurred in the event cart container rule. This is available with the
$status
array, which contains the following keys:
added
– List of events that were added
updated
– List of events that were updated (specifically,
events that has clashes resolved)
removed
– List of events that were removed
emptied
– True if the event cart was just emptied
There is a sample of this in the cart-summary.tpl
template in
Recite.
If you submit any of the cart actions using Ajax, the following data is returned as a JSON array. Note that any of these may be omitted.
added
– An array of events that were added. Each element is an
object with an id
and title
property
corresponding to the event that was added.
removed
– An array of events that were removed. Each element is
an object with an id
and title
property
corresponding to the event that was removed.
emptied
– This is a boolean set to to true
if the
cart was emptied.
error
– This is a boolean set to true
if an error
occurred.
errormsg
– If an error occurred then this contains a
description of the error that occurred.