- Documentation >
- Administration >
- Back Office >
- Customize calendar
Customize calendar
By default, the Calendar displays scheduled events of the following types:
- Content publication (
future_publication
)
- Content hide (
future_hide
)
- Block reveal (
page_block_reveal
)
- Block hide (
page_block_hide
)
You can perform basic actions on these events.
You can also configure the calendar to display custom event types.
Customize colors and icons
You can change the color of a calendar event or change the icon of an action.
The setting is SiteAccess-aware.
To customize the appearance settings, use the ibexa.system.<scope>.calendar.event_types
configuration key:
| ibexa:
system:
admin_group:
calendar:
event_types:
future_publication:
color: '#47BEDB'
actions:
reschedule:
icon: '/bundles/ibexaplatformicons/img/all-icons.svg#notice'
|
Line 6 contains the name of the event type, either a built-in custom one.
color
defines the color in which events of this type are displayed in the calendar.
icon
is the icon used for a button with the relevant event action.
The following example shows how to create custom events which add different holidays to the calendar.
First, create a new event in src/Calendar/Holidays/Event.php
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | <?php declare(strict_types=1);
namespace App\Calendar\Holidays;
use DateTimeInterface;
use Ibexa\Contracts\Calendar\Event as CalendarEvent;
class Event extends CalendarEvent
{
public function __construct(string $id, DateTimeInterface $dateTime, EventType $type)
{
parent::__construct($type, $id, $dateTime);
}
}
|
Here, you define a new class for your event based on Ibexa\Contracts\Calendar\Event
.
Next, create src/Calendar/Holidays/EventType.php
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39 | <?php declare(strict_types=1);
namespace App\Calendar\Holidays;
use Ibexa\Calendar\EventAction\EventActionCollection;
use Ibexa\Contracts\Calendar\Event;
use Ibexa\Contracts\Calendar\EventType\EventTypeInterface;
class EventType implements EventTypeInterface
{
private const EVENT_TYPE_IDENTIFIER = 'holiday';
private EventActionCollection $actions;
public function __construct(iterable $actions)
{
$this->actions = new EventActionCollection($actions);
}
public function getTypeIdentifier(): string
{
return self::EVENT_TYPE_IDENTIFIER;
}
public function getTypeLabel(): string
{
return 'Holidays';
}
public function getEventName(Event $event): string
{
return $event->getId();
}
public function getActions(): EventActionCollection
{
return $this->actions;
}
}
|
You can use the identifier defined in lines 20-23 to configure event colors.
Complete the procedure by registering the new event type as a service:
| services:
App\Calendar\Holidays\EventType:
arguments:
$actions: [ ]
tags:
- { name: ibexa.calendar.event.type }
|
To add specific events to your calendar, you need to create an event source.
An event source must implement Ibexa\Contracts\Calendar\EventSource\EventSourceInterface
.
One such built-in implementation is InMemoryEventSource
.
To add an in-memory collection as an event source, create src/Calendar/Holidays/EventSourceFactory.php
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33 | <?php declare(strict_types=1);
namespace App\Calendar\Holidays;
use DateTime;
use DateTimeInterface;
use Ibexa\Calendar\EventSource\InMemoryEventSource;
use Ibexa\Contracts\Calendar\EventCollection;
use Ibexa\Contracts\Calendar\EventSource\EventSourceInterface;
class EventSourceFactory
{
private EventType $eventType;
public function __construct(EventType $eventType)
{
$this->eventType = $eventType;
}
public function createEventSource(): EventSourceInterface
{
$eventCollectionArray = [];
$eventCollectionArray[] = $this->createEvent('April Fools', new DateTime('2024-04-01'));
$collection = new EventCollection($eventCollectionArray);
return new InMemoryEventSource($collection);
}
private function createEvent(string $id, DateTimeInterface $dateTime): Event
{
return new Event($id, $dateTime, $this->eventType);
}
}
|
Note
When creating the list of events, you must list all the createEvent()
entities chronologically.
For example:
| $collection = new EventCollection([
$this->createEvent("Event 1", new DateTime("2024-01-01")),
$this->createEvent("Event 2", new DateTime("2024-01-02")),
// ...
|
Next, register the event source as a service:
| services:
App\Calendar\Holidays\EventSourceFactory:
arguments:
$eventType: '@App\Calendar\Holidays\EventType'
App\Calendar\Holidays\EventSource:
class: Ibexa\Calendar\EventSource\InMemoryEventSource
factory: [ '@App\Calendar\Holidays\EventSourceFactory', 'createEventSource' ]
tags:
- { name: ibexa.calendar.event.source }
|
Now you can go to the Calendar tab and see the configured holiday.
Import events from external sources
You can also import events from external sources, for example, a JSON file.
To do this, place the following holidays.json
file in src/Calendar/Holidays
:
| [
{
"date": "2024-01-01",
"name": "New Year Day"
},
{
"date": "2023-12-25",
"name": "Christmas Day"
}
]
|
Next, import this file in src/Calendar/Holidays/EventSourceFactory.php
:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 | public function createEventSource(): EventSourceInterface
{
$eventCollectionArray = [];
$eventCollectionArray[] = $this->createEvent('April Fools', new DateTime('2024-04-01'));
$items = json_decode(file_get_contents(__DIR__ . \DIRECTORY_SEPARATOR . 'holidays.json'), true);
foreach ($items as $item) {
$eventCollectionArray[] = $this->createEvent($item['name'], new DateTime($item['date']));
}
$collection = new EventCollection($eventCollectionArray);
return new InMemoryEventSource($collection);
}
|
The calendar now displays the events listed in the JSON file.