Initiation à EasyAdmin
Pré-requis (1/2)
- Avoir un projet Symfony2 existant
- Sf2.3+ (pas de silex)
- Doctrine
- Contraines :
- Les clés primaires doivent être simples (et pas composées)
- Les entités utilisant l'héritage ne sont pas supportés
- Tous types de relations est supportés (sauf many-to-many)
Les Fonctionnalités (2/2)
- EasyAdmin est un bundle qui permet de
- gérer les opérations CRUD sur les entités Doctrine (créer, modifier la liste, supprimer).
- faire une recherche textuel, de la pagination et du tri sur colonnes.
- d'être afficher sur différents supports : smartphones, tablettes et ordinateurs de bureau.
- Les petits plus
- Traduit en des dizaines de langues.
- Rapide, simple et intelligent.
Récupérer le Bundle (1/4)
Ouvrir votre console
Aller dans le répertoire de votre projet Sf2.3+
Exécuter la ligne ci-dessous
$ composer require javiereguiluz/easyadmin-bundleActiver le Bundle (2/4)
Ouvrir le fichier app/AppKernel.php
Ajouter le bundle à la liste des $bundles
<?php
// app/AppKernel.php
// ...
class AppKernel extends Kernel
{
public function registerBundles()
{
$bundles = array(
// ...
new JavierEguiluz\Bundle\EasyAdminBundle\EasyAdminBundle(),
);
}
// ...
}Charger les route du Bundle (3/4)
Ouvrir le fichier app/config/routing.yml (habituellement placé ici)
Ajouter les quatre lignes ci-dessous
# app/config/routing.yml
easy_admin_bundle:
resource: "@EasyAdminBundle/Controller/"
type: annotation
prefix: /admin
# ...Installer les Assets du Bundle (4/4)
Ouvrir votre console
Aller dans le répertoire de votre projet Sf2.3+
Exécuter la ligne ci-dessous
$ php app/console assets:install --symlinkVotre premier Backend (1/6)
Ouvrir le fichier app/config/config.yml
Modifier le nom dans les menus de votre "EasyAdmin"
# app/config/config.yml
easy_admin:
entities:
- AppBundle\Entity\Customer
- AppBundle\Entity\Order
- AppBundle\Entity\Product# app/config/config.yml
easy_admin:
entities:
Customers:
label: 'Active Clients'
class: AppBundle\Entity\Customer
Orders:
label: 'Pending Orders'
class: AppBundle\Entity\Order** transformation **
Personnaliser votre Backend (2/6)
~Global~
Il est possible de :
- changer le prefix pour accéder à l'EasyAdmin
- modifier le nom qui apparaîtra de l'EasyAdmin
- choisir la langue par défaut
- mettre en place de la sécurité
# app/config/config.yml
easy_admin:
entities:
'Active Clients': AppBundle\Entity\Customer
'Pending Orders': AppBundle\Entity\Order
'Inventory (2015)': AppBundle\Entity\Product
Personnaliser votre Backend (3/6)
~Les listes~
<p text-align:left"="" style="text-align: left;">Il est possible de :
- changer le titre de la page
- modifier le nom des boutons
- choisir le nombre d’éléments affichés par page
- sélectionner les colonnes à afficher
- d'afficher des "propriétés virtuels" - ex. : getprettyName()
- création d'un getter personnalisé
- utilisation du nom de la méthode pour l'affichage
- personnaliser / traduire le nom des colonnes
- définir le format des dates et des chiffres
- changer la gestion des booléens
- afficher des images
- modifier l'apparence des champs
Personnaliser votre Backend (4/6)
~La vue~
Il est possible de :
- compléter le titre de la page
- sélectionner les champs à afficher, et leur ordre
- personnaliser les labels
- afficher des images
easy_admin:
entities:
Product:
class: AppBundle\Entity\Product
show:
fields:
- { property: 'photo', format: 'image' }
# ...
# ...
Personnaliser votre Backend (5/6)
~La création / L'édition (1/3)~
Il est possible de :
- modifier le titre de la page
- choisir les champs à afficher et leur ordre
- personnaliser l'apparence des champs
- d'utiliser des types Custom de Doctrine
easy_admin:
entities:
Customer:
class: AppBundle\Entity\Customer
form:
fields: ['id', 'name', 'email']
title: 'Add customer'
new:
fields: ['name', 'email']
edit:
title: 'Edit customer'
# ...
Personnaliser votre Backend (5/6)
~La création / L'édition (2/3)~
Il est possible de surcharger les actions de création et d'édition du controller
<?php
// Ces méthodes existent toujours et sont présentes avant
// la persistance des informations en BDD
// Edition
protected function prepareEditEntityForPersist($entity)
{
return $entity;
}
// New
protected function prepareNewEntityForPersist($entity)
{
return $entity;
}<?php
// Etape 1 - Création d'un nouveau controller
// + il faut étendre le EasyAdminController
// src/AppBundle/Controller/AdminController.php
namespace AppBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use JavierEguiluz\Bundle\EasyAdminBundle\Controller\AdminController
as EasyAdminController;
class AdminController extends EasyAdminController
{
/**
* @Route("/admin/", name="admin")
*/
public function indexAction(Request $request)
{
return parent::indexAction($request);
}
/** @TODO **/
}<?php
// Etape 2 - Etendre les méthodes souhaitées
protected function prepareEditEntityForPersist($entity)
{
if ($entity instanceof Article) {
return $this->updateSlug($entity);
}
}
protected function prepareNewEntityForPersist($entity)
{
if ($entity instanceof Article) {
return $this->updateSlug($entity);
}
}
private function updateSlug($entity)
{
$slug = $this->get('app.slugger')
->slugify($entity->getTitle());
$entity->setSlug($slug);
return $entity;
}
Personnaliser votre Backend (5/6)
~La création / L'édition (3/3)~
Il est possible de surcharger les formulaires par défaut
<?php
// src/AppBundle/Controller/AdminController.php
namespace AppBundle\Controller;
use Symfony\Component\HttpFoundation\Request;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use JavierEguiluz\Bundle\EasyAdminBundle\Controller\AdminController as EasyAdminController;
use AppBundle\Entity\Event;
class AdminController extends EasyAdminController
{
/**
* @Route("/admin/", name="admin")
*/
public function indexAction(Request $request)
{
return parent::indexAction($request);
}
public function createEditForm($entity, array $entityProperties)
{
$editForm = parent::createEditForm($entity, $entityProperties);
if ($entity instanceof Event) {
// the trick is to remove the default field and then
// add the customized field
$editForm->remove('city');
$editForm->add('city', 'choice', array('choices' => array(
'London', 'New York', 'Paris', 'Tokyo'
)));
}
return $editForm;
}
}
Personnaliser votre Backend (6/6)
~Le design~
layout.html.twig c'est la mise en page générale
new.html.twig utilisé pour les actions : new, search
show.html.twig utilisé pour l'action : show
edit.html.twig utilisé pour l'action : edit
list.html.twig utilisé pour l'action : list
_list_paginator.html.twig utilisé pour la pagination
_flashes.html.twig utilisé pour les flash messages
your-project/
├─ app/
│ ├─ ...
│ └─ Resources/
│ └─ EasyAdminBundle/
│ └─ views/
│ └─ _list_paginator.html.twig
├─ src/
├─ vendor/
└─ web/Il est possible de :
- changer les assets
- personnaliser les templates
easy_admin:
assets:
css:
# HTTP protocol-relative URL
- '//example.org/css/admin1.css'
# absolute non-secure URL
- 'http://example.org/css/admin2.css'
# absolute secure URL
- 'https://example.org/css/admin3.css'
# absolute internal bundle URL
- '/bundles/acmedemo/css/admin4.css'
# relative internal bundle URL
- 'bundles/app/css/admin5.css'
js:
# this option works exactly
# the same as the 'css' option
- '//example.org/js/admin1.js'
- 'http://example.org/js/admin2.js'
- 'https://example.org/js/admin3.js'
- '/bundles/acmedemo/js/admin4.js'
- 'bundles/app/js/admin5.js'
# ...Avant de Commencer
Il faut :
- mettre la configuration d'EasyAdmin dans un fichier distinct
- activer le cacher
# app/config/config.yml
imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: services.yml }
- { resource: admin.yml } # <-- Ajouter cette ligne
# app/config/admin.yml # <-- Créer ce fichier
easy_admin:
# ...
# Copier toute la configuration que vous aviez écrit
# ...# app/config/config_prod.yml
doctrine:
orm:
metadata_cache_driver: apc
# memcache, memcached, xcache et service sont validesC'est finito
Los Pollos
Php - Symfony - EasyAdmin
By Robin Duval
Php - Symfony - EasyAdmin
Débuter avec le Bundle EasyAdminBundle. Traduction / Source : https://github.com/javiereguiluz/EasyAdminBundle
- 3,962