agantarcom/calendar-bundle
Symfony bundle that adds calendar functionality to your application. Install via Composer and, if not using Symfony Flex, register AgantarCom\CalendarBundle\CalendarBundle in config/bundles.php to enable it.
Installation:
composer require agantarcom/calendar-bundle
For non-Flex projects, manually add the bundle to config/bundles.php:
AgantarCom\CalendarBundle\CalendarBundle::class => ['all' => true],
First Use Case: Generate a basic calendar view in a Twig template:
{{ render(controller('AgantarComCalendarBundle:Calendar:index')) }}
This renders a default monthly calendar with no customization.
Where to Look First:
templates/AgantarComCalendarBundle/Calendar/ for customization hooks.calendar.manager service for programmatic calendar generation.Dynamic Calendar Rendering:
Use the calendar.manager service to generate calendars dynamically:
// src/Controller/CalendarController.php
use AgantarCom\CalendarBundle\Manager\CalendarManager;
class CalendarController extends AbstractController {
public function show(CalendarManager $calendarManager, int $year, int $month) {
$calendar = $calendarManager->generate($year, $month);
return $this->render('calendar/index.html.twig', ['calendar' => $calendar]);
}
}
Twig Integration: Extend the default Twig templates by overriding them in your project:
templates/AgantarComCalendarBundle/Calendar/
├── index.html.twig # Override full layout
├── _calendar.html.twig # Override calendar table
└── _day.html.twig # Override individual day cells
Event Integration: Pass events to the calendar manager to highlight dates:
$events = [
['date' => '2024-10-15', 'title' => 'Team Meeting', 'class' => 'event-success'],
['date' => '2024-10-20', 'title' => 'Deadline', 'class' => 'event-danger'],
];
$calendar = $calendarManager->generate($year, $month, $events);
Localization: Override the default date format or month names via Twig:
{% set calendar = calendar|calendar_format('d M Y', 'en_US') %}
CalendarManager in APIs to return calendar data as JSON:
return $this->json($calendarManager->generateAsArray($year, $month));
$cacheKey = "calendar_{$year}_{$month}";
if (!$calendar = $cache->get($cacheKey)) {
$calendar = $calendarManager->generate($year, $month);
$cache->set($cacheKey, $calendar, 3600);
}
Template Overrides:
php bin/console cache:clear).AgantarComCalendarBundle/Calendar/ structure).Date Handling:
DateTime objects or Y-m-d strings. Invalid formats may throw exceptions.generate()) default to the server’s timezone. Explicitly set it if needed:
$calendarManager->generate($year, $month, [], 'Europe/London');
Event Data:
date key (string or DateTime). Missing or malformed data will be ignored silently.class for styling) are not validated; ensure they match your CSS.Symfony Flex Compatibility:
AppKernel.php (though the bundle claims Flex compatibility).No Calendar Rendered?:
Check if the bundle is enabled (config/bundles.php) and the route exists (php bin/console debug:router).
Verify the Twig template path is correct.
Styling Issues:
Inspect the generated HTML for missing classes or IDs. Override _day.html.twig to add custom classes:
<td class="day {{ day.class }}">{{ day.date|date('d') }}</td>
Custom Calendar Types:
Extend the CalendarManager to support weekly/yearly views:
// src/Service/CustomCalendarManager.php
class CustomCalendarManager extends CalendarManager {
public function generateWeekly(int $year, int $week) { ... }
}
Register it as a service and replace the default manager in config/services.yaml:
services:
AgantarCom\CalendarBundle\Manager\CalendarManager:
alias: custom_calendar_manager
Event Providers: Create a custom event provider to fetch events from a database:
// src/Event/DatabaseEventProvider.php
class DatabaseEventProvider implements EventProviderInterface {
public function getEvents(int $year, int $month): array {
return $entityManager->getRepository(Event::class)->findByMonth($year, $month);
}
}
Bind it to the calendar.manager service in services.yaml:
services:
App\Event\DatabaseEventProvider:
tags: ['agantar_com.calendar.event_provider']
Configuration:
Override default settings (e.g., start day of week) in config/packages/agantar_com_calendar.yaml:
agantar_com_calendar:
first_day_of_week: 1 # Monday
show_week_numbers: true
generateAsArray() method to build calendars client-side with JavaScript._day.html.twig for screen readers:
<td aria-label="{{ day.date|date('d MMMM Y') }}">{{ day.date|date('d') }}</td>
CalendarManager in PHPUnit:
$this->mockBuilder()
->disableOriginalConstructor()
->getMock()
->method('generate')
->willReturn($mockCalendarData);
How can I help you explore Laravel packages today?