Install the Bundle
Run composer require corvet/light-field-bundle in your Symfony 8.4+ project.
Ensure your composer.json meets the PHP 8.4+ and Symfony 8.0+ requirements.
Register Asset Dependencies
Add Flatpickr and Inputmask to your config/packages/framework/importmap.php:
return [
'flatpickr' => 'https://cdn.jsdelivr.net/npm/flatpickr@latest/dist/flatpickr.min.js',
'inputmask' => 'https://cdn.jsdelivr.net/npm/inputmask@latest/dist/inputmask.min.js',
];
Then run:
php bin/console importmap:require flatpickr inputmask
First Use Case
Replace a standard DateType in your form with MaskedDateType:
use Corvet\LightFieldBundle\Form\MaskedDateType;
$builder->add('expiryDate', MaskedDateType::class, [
'label' => 'Expiry Date (DD.MM.YYYY)',
'widget' => 'single_text', // Default; omit for calendar-only
]);
Twig Template:
{{ form_row(form.expiryDate) }}
The field will auto-format input as DD.MM.YYYY and render a dark-themed Flatpickr calendar.
Form Integration
widget option to disable the text input:
$builder->add('birthDate', MaskedDateType::class, ['widget' => 'calendar']);
attr:
$builder->add('dueDate', MaskedDateType::class, [
'attr' => ['placeholder' => 'DD/MM/YYYY (US format)'],
]);
Asset Optimization
webpack or npm needed./* assets/app.css */
.flatpickr-dark .flatpickr-calendar {
background: #1a1a1a !important;
}
Validation Integration
DateType validation (e.g., constraints: [NotBlank(), GreaterThan('today')]).dd.mm.yyyy format).Dynamic Forms
MaskedDateType in dynamic form builders (e.g., with FormFactory or EntityType for collections):
$formFactory->createNamedBuilder('order', null, null)
->add('shipDate', MaskedDateType::class, ['required' => false]);
fr_FR → JJ.MM.AAAA). Override via:
$builder->add('date', MaskedDateType::class, [
'mask_locale' => 'de_DE', // German format: TT.MM.JJJJ
]);
attr:
$builder->add('deadline', MaskedDateType::class, [
'attr' => ['aria-describedby' => 'deadline-help'],
]);
Asset Loading Failures
importmap:require or incorrect CDN paths.importmap:require was run post-install.flatpickr.min.js/inputmask.min.js.node_modules) if CDN fails:
return [
'flatpickr' => '/node_modules/flatpickr/dist/flatpickr.min.js',
];
Mask Conflicts
$() or jQuery overrides Flatpickr’s selectors. Use:
// assets/app.js
document.addEventListener('DOMContentLoaded', () => {
// Your custom JS here (avoid document.ready conflicts)
});
PHP 8.4+ Strict Typing
TypeError in MaskedDateType constructor.// Override the type in your custom form class
public function __construct(string $class = null, array $options = [])
{
parent::__construct($class, $options);
}
Symfony 8.4+ AssetMapper Quirks
importmap.php:
return [
'flatpickr' => [
'js' => 'https://cdn.jsdelivr.net/npm/flatpickr@latest',
'css' => 'https://cdn.jsdelivr.net/npm/flatpickr@latest/dist/flatpickr.min.css',
],
];
Uncaught ReferenceError in browser dev tools (missing assets).flatpickr.min.js and inputmask.min.js load with 200 OK.debug: true in config/packages/dev/debug.php to log form type errors.Custom Buttons Extend Flatpickr’s footer via Twig:
{% block corvet_light_field_buttons %}
<button type="button" class="flatpickr-button" data-fp-action="customAction">
Custom Action
</button>
{% endblock %}
Register the block in your base template.
Dynamic Masking Override the mask format via JavaScript:
document.addEventListener('DOMContentLoaded', () => {
document.querySelectorAll('.masked-date-input').forEach(el => {
el._inputmask.options.mask = 'MM-DD-YYYY'; // US format
});
});
Server-Side Format Handling Ensure your entity setter/getter aligns with the mask format:
// src/Entity/Order.php
public function setCreatedAt(?\DateTimeInterface $createdAt): self
{
$this->createdAt = $createdAt?->format('Y-m-d'); // Store as YYYY-MM-DD
return $this;
}
Testing
Use Symfony’s FormTestCase to validate masked input:
public function testMaskedDateSubmission()
{
$form = $this->factory->create(MaskedDateType::class);
$form->submit('15.12.2023'); // DD.MM.YYYY
$this->assertEquals('2023-12-15', $form->getData()->format('Y-m-d'));
}
How can I help you explore Laravel packages today?