Installation:
composer require doctrs/sonata-import-bundle white-october/pagerfanta-bundle
Register bundles in AppKernel.php:
new Doctrs\SonataImportBundle\DoctrsSonataImportBundle(),
new WhiteOctober\PagerfantaBundle\WhiteOctoberPagerfantaBundle(),
Doctrine ORM Mapping:
Add to config.yml:
doctrine:
orm:
entity_managers:
default:
mappings:
DoctrsSonataImportBundle: ~
Basic Configuration:
Define import mappings in config.yml:
doctrs_sonata_import:
mappings:
- { name: date, class: doctrs.type.datetime }
- { name: datetime, class: doctrs.type.datetime }
First Use Case: Extend a Sonata Admin class to enable imports:
use Doctrs\SonataImportBundle\Admin\AdminImportExtension;
class YourAdmin extends AbstractAdmin
{
protected function configureSideMenu()
{
$this->menu->addChild('Import', 'fa-upload');
}
protected function configure()
{
$this->addImportExtension();
}
}
Admin Extension:
Use AdminImportExtension to add import functionality to any Sonata Admin:
$this->addImportExtension([
'template' => '@DoctrsSonataImport/import.html.twig',
'mappings' => [
'date' => 'doctrs.type.datetime',
'status' => 'doctrs.type.choice',
],
]);
Custom Mapping Classes: Extend or create custom mapping classes (e.g., for autocomplete fields):
# config.yml
doctrs_sonata_import:
mappings:
- { name: city, class: AppBundle\Form\Mapping\CityAutocomplete }
Validation & Error Handling: Validate imports via Symfony’s validator or custom logic:
$this->addImportExtension([
'validator' => $this->getValidator(),
]);
Batch Processing: Use Pagerfanta for large imports:
$this->addImportExtension([
'pagerfanta' => true,
]);
DoctrsSonataImportBundle.Outdated Dependencies:
sonata-admin-bundle, doctrine/orm).Missing Pagerfanta:
white-october/pagerfanta-bundle will break pagination in imports.AppKernel.php.Mapping Class Errors:
Doctrs\SonataImportBundle\Form\Mapping\AbstractMapping.var/log/dev.log for ClassNotFoundException if mappings fail.CSRF & Security:
$this->addImportExtension([
'access_control' => 'ROLE_ADMIN',
]);
# config.yml
monolog:
handlers:
main:
level: debug
@DoctrsSonataImport/import.html.twig) for custom UI:
{% extends '@SonataAdmin/CRUD/base_edit.html.twig' %}
{% block import_form %}
{{ form_start(form) }}
<input type="file" name="import_file" />
{{ form_end(form) }}
{% endblock %}
Custom Importers: Create a service to handle post-import logic:
// services.yml
app.import_handler:
class: AppBundle\Service\ImportHandler
tags:
- { name: sonata.admin.import.handler }
Event Listeners:
Listen to sonata.admin.import.pre and sonata.admin.import.post events:
$eventDispatcher->addListener('sonata.admin.import.pre', function ($event) {
// Pre-import logic
});
Override Mapping Classes:
Extend existing classes (e.g., doctrs.type.datetime) for custom logic:
class CustomDateMapping extends \Doctrs\SonataImportBundle\Form\Mapping\DateMapping
{
public function transform($value)
{
return parent::transform($value)->format('Y-m-d H:i:s');
}
}
How can I help you explore Laravel packages today?