Saturday, August 10, 2013

Symfony 2.2 project admin using Sonata admin bundles



Hello Friends,

This is my second post to build Symfony admin panel using sonata admin bundles. In this post we will create basic administrator panel for Symfony 2.2 project with authentication, user and group management. So let's start steps for it.


1 - Download & setup
Download Symfony 2.2 package with vendor and configure project with proper write permission for cache, logs directory & vhost to access package in browser.

2 - Check version of your Symfony package
  1. > php app/console -V
  2. > Symfony version 2.2.3 - app/dev/debug

3 - Install required bundles
Install sonata-project/block-bundle
  1. > php composer.phar require sonata-project/block-bundle:2.2.3

Install sonata-project/jquery-bundle
  1. > php composer.phar require sonata-project/jquery-bundle:1.8.0

Install knplabs/knp-menu
  1. > php composer.phar require knplabs/knp-menu:1.1.2

Install knplabs/knp-menu-bundle
  1. > php composer.phar require knplabs/knp-menu-bundle:1.1.2

Install sonata-project/exporter
  1. > php composer.phar require sonata-project/exporter:1.3.0

Install sonata-project/admin-bundle
  1. > php composer.phar require sonata-project/admin-bundle:2.2.2

Install sonata-project/doctrine-orm-admin-bundle
  1. > php composer.phar require sonata-project/doctrine-orm-admin-bundle:2.2.*@dev

Install sonata-project/intl-bundle
  1. > php composer.phar require sonata-project/intl-bundle:2.1.*

4 - Alter your config.yml and add following configurations.
  1. # app/config/config.yml
  2. # Sonata block Configuration
  3. sonata_block:
  4.     default_contexts: [cms]
  5.     blocks:
  6.         sonata.admin.block.admin_list:
  7.             contexts:   [admin]
  8.         #sonata.admin_doctrine_orm.block.audit:
  9.         #    contexts:   [admin]
  10.         sonata.block.service.text:
  11.         sonata.block.service.rss:
  12.  
  13.  
  14. # knp menu configuration (optional)
  15. knp_menu:
  16.     twig:
  17.         template: knp_menu.html.twig
  18.     templating: false
  19.     default_renderer: twig
  20.  
  21.  
  22. # Translator configuration
  23. framework:
  24.     translator: ~
  25.  
  26.  
  27. # Sonata intl configuration
  28. sonata_intl:
  29.     timezone:
  30.         # default timezone used as fallback
  31.         default: Europe/Paris
  32.  
  33.  
  34.         # locale specific overrides
  35.  
  36.         locales:
  37.             fr: Europe/Paris
  38.             en_UK: Europe/London

5 - Be sure to enable these bundles in your AppKernel.php file.
  1. // app/AppKernel.php
  2. public function registerBundles()
  3. {
  4.     return array(
  5.         // ...
  6.         new Sonata\BlockBundle\SonataBlockBundle(),
  7.         new Knp\Bundle\MenuBundle\KnpMenuBundle(),
  8.         new Sonata\jQueryBundle\SonatajQueryBundle(),
  9.         new Sonata\AdminBundle\SonataAdminBundle(),
  10.         new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),
  11.         new Sonata\IntlBundle\SonataIntlBundle(),
  12.         // ...
  13.     );
  14. }

6 - Install the assets from the bundles
  1. > php app/console assets:install web

7 - Now lets add routes for sonata admin bundle.
  1. # app/config/routing.yml
  2. admin:
  3.     resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
  4.     prefix: /admin
  5.  
  6. _sonata_admin:
  7.     resource: .
  8.     type: sonata_admin
  9.     prefix: /admin

8 - Delete cache files
  1. > php app/console cache:clear

9 - Install FOS & sonata-project/user-bundle
9-A :Install friendsofsymfony/user-bundle
  1. > php composer.phar require friendsofsymfony/user-bundle:1.3.2

9-B :Install sonata-project/user-bundle
  1. > php composer.phar require sonata-project/user-bundle:2.1.1

10 - Be sure to enable these bundles in your AppKernel.php file.
  1. // app/AppKernel.php
  2. public function registerBundles()
  3. {
  4.     return array(
  5.         // ...
  6.         new Sonata\BlockBundle\SonataBlockBundle(),
  7.         new Knp\Bundle\MenuBundle\KnpMenuBundle(),
  8.         new Sonata\jQueryBundle\SonatajQueryBundle(),
  9.         new Sonata\AdminBundle\SonataAdminBundle(),
  10.         new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),
  11.         new Sonata\IntlBundle\SonataIntlBundle(),
  12.  
  13.     new FOS\UserBundle\FOSUserBundle(),
  14.     new Sonata\UserBundle\SonataUserBundle('FOSUserBundle'),
  15.     new Sonata\EasyExtendsBundle\SonataEasyExtendsBundle(),
  16.         // ...
  17.     );
  18. }

11 - Alter config.yml and add configurations for FOS user bundle.
  1. # app/config/config.yml
  2.  
  3. # FOS user bundle configuration
  4. fos_user:
  5.     db_driver: orm
  6.     firewall_name: main
  7.     user_class: Application\Sonata\UserBundle\Entity\User

12 - Generate & configure User bundle
12-A : Generate user bundle
This bundle will gives an interface to manage users in application. Execute below command to generate User bundle for you by extending SontaUserBundle.
  1. > php app/console sonata:easy-extends:generate SonataUserBundle

12-B : Register generated user bundle in autoload.php
Add below line in autoload.php
  1. $loader->add('Application', __DIR__);
  2.  
Your autoload.php file looks like below
  1. <?php
  2.     use Doctrine\Common\Annotations\AnnotationRegistry;
  3.     use Composer\Autoload\ClassLoader;
  4.  
  5.     /**
  6.      * @var $loader ClassLoader
  7.      */
  8.     $loader = require __DIR__.'/../vendor/autoload.php';
  9.  
  10.     // intl
  11.     if (!function_exists('intl_get_error_code')) {
  12.         require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';
  13.     }
  14.  
  15.     $loader->add('Application', __DIR__);
  16.  
  17.     AnnotationRegistry::registerLoader(array($loader, 'loadClass'));
  18.  
  19.     return $loader;

12-C : Register User bundle in app/AppKernel.php
Add below line to register generated user bundle.
  1.    new Application\Sonata\UserBundle\ApplicationSonataUserBundle()
  1.     // app/AppKernel.php
  2.     public function registerBundles()
  3.     {
  4.         return array(
  5.         // ...
  6.         new Sonata\BlockBundle\SonataBlockBundle(),
  7.         new Knp\Bundle\MenuBundle\KnpMenuBundle(),
  8.         new Sonata\jQueryBundle\SonatajQueryBundle(),
  9.         new Sonata\AdminBundle\SonataAdminBundle(),
  10.         new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),
  11.         new Sonata\IntlBundle\SonataIntlBundle(),
  12.  
  13.         new FOS\UserBundle\FOSUserBundle(),
  14.         new Sonata\UserBundle\SonataUserBundle('FOSUserBundle'),
  15.         new Sonata\EasyExtendsBundle\SonataEasyExtendsBundle(),
  16.         new Application\Sonata\UserBundle\ApplicationSonataUserBundle(),
  17.         // ...
  18.         );
  19.     }

12- D : Add fos and sonata user routes in app/routing.yml
  1.    #app/routing.yml
  2.     fos_user_security:
  3.        resource: "@FOSUserBundle/Resources/config/routing/security.xml"
  4.     fos_user_profile:
  5.        resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
  6.        prefix: /profile
  7.     fos_user_register:
  8.        resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
  9.        prefix: /register
  10.     fos_user_resetting:
  11.        resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
  12.        prefix: /resetting
  13.     fos_user_change_password:
  14.        resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
  15.        prefix: /change-password
  16.     fos_user_security:
  17.        resource: "@FOSUserBundle/Resources/config/routing/security.xml"
  18.     fos_user_profile:
  19.        resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
  20.        prefix: /profile
  21.     fos_user_register:
  22.        resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
  23.        prefix: /register
  24.     fos_user_resetting:
  25.        resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
  26.        prefix: /resetting
  27.     fos_user_change_password:
  28.        resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
  29.        prefix: /change-password
  30.  
  31.     soanata_user:
  32.        resource: '@SonataUserBundle/Resources/config/routing/admin_security.xml'
  33.        prefix: /admin
  34.     sonata_user_impersonating:
  35.        pattern: /
  36.        defaults: { _controller: SonataPageBundle:Page:catchAll }

12-E : Clear cache
  1. > php app/console cache:clear

13 - Update db schema
  1. > php app/console doctrine:schema:update --force
NOTE : if symfony give 'Unknown column type "json" requested.......'  error, add custom type in Doctrine configuration, see below code

  1. # app/config/config.yml
  2. doctrine:
  3.     dbal:
  4.     #for SonataNotificationBundle
  5.     types:
  6.         json: Sonata\Doctrine\Types\JsonType
  7.     #----

14 - Add sonata admin configuration
  1. #app/config/config.yml
  2. sonata_admin:
  3.     title:      <your application title>
  4.     title_logo: /path/to/logo.png
  5.  
  6.     dashboard:
  7.     blocks:
  8.         #          # display a dashboard block
  9.         - { position: left, type: sonata.admin.block.admin_list }



15 - Lets create super admin user
All configurations completed, So lets create super admin user for our newly created Symfony 2.2 admin panel.
  1. > php app/console fos:user:create <username> <email> <password> --super-admin

Now you can access your admin panel using below url
URL : http://yourdomain/app_dev.php/admin/dashboard


16 - Bundles url
https://github.com/sonata-project/SonataBlockBundle
https://github.com/sonata-project/SonatajQueryBundle
https://github.com/KnpLabs/KnpMenu
https://github.com/KnpLabs/KnpMenuBundle
https://github.com/sonata-project/exporter
https://github.com/sonata-project/SonataAdminBundle
https://github.com/sonata-project/SonataDoctrineORMAdminBundle
https://github.com/sonata-project/SonataIntlBundle


Now, our fully functional Symfony2.2 admin panel is ready.

Please post your comments, share my post and join this blog.





Rajesh Meniya
Symfony Developer