Install the Bundle
composer require a5sys/easyadminpopup-bundle
Register in AppKernel.php
new A5sys\EasyAdminPopupBundle\EasyAdminPopupBundle(),
Configure the Bundle
In config/packages/easy_admin_popup.yaml:
easy_admin_popup:
layout: "::admin_layout.html.twig" # Path to your Twig layout
customized_flash: false # Set to `true` if using custom flash translations
Ensure Layout Compliance
Your admin_layout.html.twig must:
body block.<!-- In <head> -->
{{ include('EasyAdminPopupBundle::scripts.html.twig') }}
{% block stylesheets %}
{% javascripts '@EasyAdminPopupBundle/Resources/assets/js/form-modal.js' %}
<script src="{{ asset(url) }}"></script>
{% endjavascripts %}
{% javascripts '@EasyAdminPopupBundle/Resources/assets/js/humane-error.js' %}
<script src="{{ asset(url) }}"></script>
{% endjavascripts %}
{% endblock %}
First Use Case: Popup CRUD
Extend the provided AdminController and annotate a route:
use A5sys\EasyAdminPopupBundle\Controller\AdminController;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
class UserAdminController extends AdminController
{
/**
* @Route("/admin/users/popup", name="admin_users_popup")
*/
public function popupAction()
{
return $this->render('EasyAdminPopupBundle:CRUD:index.html.twig');
}
}
AdminController for all popup-enabled CRUD operations.class PostAdminController extends AdminController
{
protected function configureFields(string $pageName): iterable
{
return [
// Custom fields with popup-friendly configurations
Field::new('title')->setFormType(PopupTextType::class),
];
}
}
PopupTextType, PopupDateTimeType) for modal-based inputs:
use A5sys\EasyAdminPopupBundle\Form\Type\PopupTextType;
$builder->add('description', PopupTextType::class, [
'popup_route' => 'admin_posts_edit_description', // Custom route for the popup
'options' => ['attr' => ['class' => 'popup-field']],
]);
config/routes.yaml:
admin_posts_edit_description:
path: /admin/posts/edit-description/{id}
controller: App\Controller\Admin\PostAdminController::editDescriptionPopup
methods: [GET, POST]
EasyAdminPopupBundle::base.html.twig for consistent popup styling:
{% extends 'EasyAdminPopupBundle::base.html.twig' %}
{% block body %}
{{ parent() }}
<div class="popup-overlay"></div>
{% endblock %}
popup.pre_open, popup.post_save):
// src/EventListener/PopupListener.php
public function onPopupPreOpen(PopupEvent $event)
{
$event->setOption('maxWidth', 800); // Customize popup dimensions
}
Missing Dependencies
jquery, bootstrap-datetimepicker, select2, or humane in your layout will break popup functionality.scripts.html.twig is included in your base template.Assetic/Webpack Conflicts
public/build/ or configure Encore to process:
// webpack.config.js
Encore.addEntry('admin-popup', './vendor/a5sys/easyadminpopup-bundle/Resources/assets/js/form-modal.js');
CSRF Token Mismatch
{% csrf_token() %} in Twig templates or pass tokens via AJAX.Route Caching
php bin/console cache:clear --env=prod
Flash Message Translation
customized_flash: true, ensure translation keys exist (e.g., flash.User.persist in messages.yml).Check Console Errors
F12) to verify JS errors (e.g., missing form-modal.js).Inspect Popup HTML
{{ dump(app.request) }} in Twig to debug route parameters passed to popups.Log Events
# config/packages/dev/monolog.yaml
handlers:
main:
type: stream
level: debug
channels: ["event"]
Override Default Templates
EasyAdminPopupBundle::CRUD/edit.html.twig to templates/admin/CRUD/edit_popup.html.twig for customizations.Custom Popup Templates
EasyAdminPopupBundle::popup.html.twig to modify modal structure.Dynamic Popup Content
// form-modal.js extension
$.fn.easyAdminPopup.loadContent = function(url) {
return this.load(url).promise().done(function() {
$(this).find('.popup-body').show();
});
};
Add New Field Types
PopupFieldType to support custom inputs (e.g., PopupSelect2Type).Integrate with EasyAdmin 4.x
config/bundles.php:
A5sys\EasyAdminPopupBundle\EasyAdminPopupBundle::class => ['all' => true],
How can I help you explore Laravel packages today?