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
> php app/console -V
> Symfony version 2.2.3 - app/dev/debug

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

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

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

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

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

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

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

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

4 - Alter your config.yml and add following configurations.
# app/config/config.yml
# Sonata block Configuration
sonata_block:
    default_contexts: [cms]
    blocks:
        sonata.admin.block.admin_list:
            contexts:   [admin]
        #sonata.admin_doctrine_orm.block.audit:
        #    contexts:   [admin]
        sonata.block.service.text:
        sonata.block.service.rss:


# knp menu configuration (optional)
knp_menu:
    twig:
        template: knp_menu.html.twig
    templating: false
    default_renderer: twig


# Translator configuration
framework:
    translator: ~


# Sonata intl configuration
sonata_intl:
    timezone:
        # default timezone used as fallback
        default: Europe/Paris


        # locale specific overrides

        locales:
            fr: Europe/Paris
            en_UK: Europe/London

5 - Be sure to enable these bundles in your AppKernel.php file.
// app/AppKernel.php
public function registerBundles()
{
    return array(
        // ...
        new Sonata\BlockBundle\SonataBlockBundle(),
        new Knp\Bundle\MenuBundle\KnpMenuBundle(),
        new Sonata\jQueryBundle\SonatajQueryBundle(),
        new Sonata\AdminBundle\SonataAdminBundle(),
        new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),
        new Sonata\IntlBundle\SonataIntlBundle(),
        // ...
    );
}

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

7 - Now lets add routes for sonata admin bundle.
# app/config/routing.yml
admin:
    resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
    prefix: /admin

_sonata_admin:
    resource: .
    type: sonata_admin
    prefix: /admin

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

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

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

10 - Be sure to enable these bundles in your AppKernel.php file.
// app/AppKernel.php
public function registerBundles()
{
    return array(
        // ...
        new Sonata\BlockBundle\SonataBlockBundle(),
        new Knp\Bundle\MenuBundle\KnpMenuBundle(),
        new Sonata\jQueryBundle\SonatajQueryBundle(),
        new Sonata\AdminBundle\SonataAdminBundle(),
        new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),
        new Sonata\IntlBundle\SonataIntlBundle(),

    new FOS\UserBundle\FOSUserBundle(),
    new Sonata\UserBundle\SonataUserBundle('FOSUserBundle'),
    new Sonata\EasyExtendsBundle\SonataEasyExtendsBundle(),
        // ...
    );
}

11 - Alter config.yml and add configurations for FOS user bundle.
# app/config/config.yml

# FOS user bundle configuration
fos_user:
    db_driver: orm
    firewall_name: main
    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.
> php app/console sonata:easy-extends:generate SonataUserBundle

12-B : Register generated user bundle in autoload.php
Add below line in autoload.php
$loader->add('Application', __DIR__);

Your autoload.php file looks like below
<?php
    use Doctrine\Common\Annotations\AnnotationRegistry;
    use Composer\Autoload\ClassLoader;

    /**
     * @var $loader ClassLoader
     */
    $loader = require __DIR__.'/../vendor/autoload.php';

    // intl
    if (!function_exists('intl_get_error_code')) {
        require_once __DIR__.'/../vendor/symfony/symfony/src/Symfony/Component/Locale/Resources/stubs/functions.php';
    }

    $loader->add('Application', __DIR__);

    AnnotationRegistry::registerLoader(array($loader, 'loadClass'));

    return $loader;

12-C : Register User bundle in app/AppKernel.php
Add below line to register generated user bundle.
   new Application\Sonata\UserBundle\ApplicationSonataUserBundle()
    // app/AppKernel.php
    public function registerBundles()
    {
        return array(
        // ...
        new Sonata\BlockBundle\SonataBlockBundle(),
        new Knp\Bundle\MenuBundle\KnpMenuBundle(),
        new Sonata\jQueryBundle\SonatajQueryBundle(),
        new Sonata\AdminBundle\SonataAdminBundle(),
        new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),
        new Sonata\IntlBundle\SonataIntlBundle(),

        new FOS\UserBundle\FOSUserBundle(),
        new Sonata\UserBundle\SonataUserBundle('FOSUserBundle'),
        new Sonata\EasyExtendsBundle\SonataEasyExtendsBundle(),
        new Application\Sonata\UserBundle\ApplicationSonataUserBundle(),
        // ...
        );
    }

12- D : Add fos and sonata user routes in app/routing.yml
   #app/routing.yml
    fos_user_security:
       resource: "@FOSUserBundle/Resources/config/routing/security.xml"
    fos_user_profile:
       resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
       prefix: /profile
    fos_user_register:
       resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
       prefix: /register
    fos_user_resetting:
       resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
       prefix: /resetting
    fos_user_change_password:
       resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
       prefix: /change-password
    fos_user_security:
       resource: "@FOSUserBundle/Resources/config/routing/security.xml"
    fos_user_profile:
       resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
       prefix: /profile
    fos_user_register:
       resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
       prefix: /register
    fos_user_resetting:
       resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
       prefix: /resetting
    fos_user_change_password:
       resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
       prefix: /change-password

    soanata_user:
       resource: '@SonataUserBundle/Resources/config/routing/admin_security.xml'
       prefix: /admin
    sonata_user_impersonating:
       pattern: /
       defaults: { _controller: SonataPageBundle:Page:catchAll }

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

13 - Update db schema
> 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

# app/config/config.yml
doctrine:
    dbal:
    #for SonataNotificationBundle
    types:
        json: Sonata\Doctrine\Types\JsonType
    #----

14 - Add sonata admin configuration
#app/config/config.yml
sonata_admin:
    title:      <your application title>
    title_logo: /path/to/logo.png

    dashboard:
    blocks:
        #          # display a dashboard block
        - { 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.
> 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

Monday, January 7, 2013

Update PHP in Ubuntu



Update php with latest version in ubuntu 11.10



 
commands
----------------------------------------
sudo echo "deb http://php53.dotdeb.org stable all" >> /etc/apt/sources.list

sudo apt-get update

(optional) below 2 for solve gpg certificate verify warning during update
gpg --keyserver keys.gnupg.net --recv-key 89DF5277
gpg -a --export 89DF5277 | sudo apt-key add -

sudo apt-get install php5-cli php5-common php5-suhosin
----------------------------------------

Now check
php -v
PHP 5.3.18-1~dotdeb.0 with Suhosin-Patch (cli) (built: Oct 19 2012 08:17:21)

Congratulations, your php is updated with latest version




Reference
http://askubuntu.com/questions/108929/easiest-way-to-upgrade-php-to-latest-version-on-11-10

http://www.dotdeb.org/2010/07/11/dotdeb-packages-are-now-signed/

Symfony2.1 Setup Sonata Admin bundle


 
This post is specially for create basic administrator panel for symfony2.1 project with authentication, user management and beautiful admin interface. We will use FOSUserBundle and SonataAdminBundle and their supported bundle for create our admin application. This post explain installation and minimum configuration for each bundle. For detail visit official documentation of particular bundle.


Before starting you should create basic symfony2.1 package and create virtual host for your project.


My Server configuration :

PHP 5.3.18-1~dotdeb.0 with Suhosin-Patch (cli) (built: Oct 19 2012 08:17:21)

Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies
   with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
   with Suhosin v0.9.33, Copyright (c) 2007-2012, by SektionEins GmbH

My Symfony version :
Symfony version 2.1.3 - app/dev/debug

Step : 1 - Add following requirements in your composer.json
php composer.phar require friendsofsymfony/user-bundle (version :  *)
php composer.phar require sonata-project/admin-bundle (version : dev-master)
php composer.phar require sonata-project/doctrine-orm-admin-bundle (version : dev-master)
php composer.phar require sonata-project/intl-bundle (version : dev-master)
php composer.phar require sonata-project/user-bundle
(version : dev-master)


Step : 2 - Active following bundle in app/AppKernel.php
new FOS\UserBundle\FOSUserBundle(),
new Sonata\jQueryBundle\SonatajQueryBundle(),
new Sonata\AdminBundle\SonataAdminBundle(),
new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),
new Knp\Bundle\MenuBundle\KnpMenuBundle(),
new Sonata\BlockBundle\SonataBlockBundle(),
new Sonata\UserBundle\SonataUserBundle('FOSUserBundle'),
new Sonata\EasyExtendsBundle\SonataEasyExtendsBundle(),
new Application\Sonata\UserBundle\ApplicationSonataUserBundle(),
new Sonata\IntlBundle\SonataIntlBundle(),


Step : 3 - Configure fos_user
in app/config/config.yml
fos_user:
   db_driver: orm
   firewall_name: main
   user_class: Application\Sonata\UserBundle\Entity\User


Step : 4 - Generate user bundle in app/Application/Sonata/UserBundle
php app/console sonata:easy-extends:generate SonataUserBundle


Step : 5 - Register application sonata user bundle in app/autoload.php
$loader->add('Application', __DIR__);



Step : 6 - Active new Bundle in app/AppKernel.php
new Application\Sonata\UserBundle\ApplicationSonataUserBundle(),


Step : 7 - Add routing in app/config.routing.yml
fos_user_security:
   resource: "@FOSUserBundle/Resources/config/routing/security.xml"
fos_user_profile:
   resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
   prefix: /profile
fos_user_register:
   resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
   prefix: /register
fos_user_resetting:
   resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
   prefix: /resetting
fos_user_change_password:
   resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
   prefix: /change-password
admin:
   resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
   prefix: /admin
_sonata_admin:
   resource: .
   type: sonata_admin
   prefix: /admin
soanata_user:
   resource: '@SonataUserBundle/Resources/config/routing/admin_security.xml'
   prefix: /admin
sonata_user_impersonating:
   pattern: /
   defaults: { _controller: SonataPageBundle:Page:catchAll }# app/config/routing.yml
fos_user_security:
   resource: "@FOSUserBundle/Resources/config/routing/security.xml"
fos_user_profile:
   resource: "@FOSUserBundle/Resources/config/routing/profile.xml"
   prefix: /profile
fos_user_register:
   resource: "@FOSUserBundle/Resources/config/routing/registration.xml"
   prefix: /register
fos_user_resetting:
   resource: "@FOSUserBundle/Resources/config/routing/resetting.xml"
   prefix: /resetting
fos_user_change_password:
   resource: "@FOSUserBundle/Resources/config/routing/change_password.xml"
   prefix: /change-password
admin:
   resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
   prefix: /admin
_sonata_admin:
   resource: .
   type: sonata_admin
   prefix: /admin
soanata_user:
   resource: '@SonataUserBundle/Resources/config/routing/admin_security.xml'
   prefix: /admin
sonata_user_impersonating:
   pattern: /
   defaults: { _controller: SonataPageBundle:Page:catchAll }


Step : 8 - Add the following to app/config/security.yml
security:
   encoders:
       FOS\UserBundle\Model\UserInterface: sha512
   role_hierarchy:
       ROLE_ADMIN:       ROLE_USER
       ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]
       SONATA:
           - ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT  # if you are not using acl then this line must be uncommented
   providers:
       fos_userbundle:
           id: fos_user.user_manager
   firewalls:
       # ---> custom firewall for the admin area of the URL
       admin:
           pattern:      /admin(.*)
           form_login:
               provider:       fos_userbundle
               login_path:     /admin/login
               use_forward:    false
               check_path:     /admin/login_check
               failure_path:   null
           logout:
               path:           /admin/logout
           anonymous:    true
       # ---> end custom configuration
       # defaut login area for standard users
       main:
           pattern:      .*
           form_login:
               provider:       fos_userbundle
               login_path:     /login
               use_forward:    false
               check_path:     /login_check
               failure_path:   null
           logout:       true
           anonymous:    true

#--------------
   access_control:
       # URL of FOSUserBundle which need to be available to anonymous users
       - { path: ^/_wdt, role: IS_AUTHENTICATED_ANONYMOUSLY }
       - { path: ^/_profiler, role: IS_AUTHENTICATED_ANONYMOUSLY }
       - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
       # -> custom access control for the admin area of the URL
       - { path: ^/admin/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
       - { path: ^/admin/logout$, role: IS_AUTHENTICATED_ANONYMOUSLY }
       - { path: ^/admin/login-check$, role: IS_AUTHENTICATED_ANONYMOUSLY }
       # -> end
       - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
       - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
       # Secured part of the site
       # This config requires being logged for the whole site and having the admin role for the admin part.
       # Change these rules to adapt them to your needs
       - { path: ^/admin, role: [ROLE_ADMIN, ROLE_SONATA_ADMIN] }
       - { path: ^/.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
#--------------


Step : 9 - Update db schema
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

doctrine:
   dbal:
       #for SonataNotificationBundle
       types:
         json: Sonata\Doctrine\Types\JsonType
       #----


Step : 10 - Install assets and clear cache
php app/console assets:install web
php app/console cache:clear


Step : 11 - Lets create admin user
php app/console fos:user:create admin admin@admin.com rajesh --super-admin



Step : 12 - Add sonata admin configuration in app/config/config.yml
sonata_admin:
 title:      <your application title>
 title_logo: /path/to/logo_title.png
 
 dashboard:
     blocks:
         #          # display a dashboard block
         - { position: left, type: sonata.admin.block.admin_list }



Step : 13 - Add sonata block configuration in app/config/config.yml
sonata_block:
   default_contexts: [cms]
   blocks:
       sonata.admin.block.admin_list:
           contexts:   [admin]

       #sonata.admin_doctrine_orm.block.audit:
       #    contexts:   [admin]

       sonata.block.service.text:
       sonata.block.service.rss:

       # Some specific block from the SonataMediaBundle
       #sonata.media.block.media:
       #sonata.media.block.gallery:
       #sonata.media.block.feature_media:


Step : 13 - Enable your translator in /app/config.yml
framework:
   translator: ~


Step : 14 - Add SonataIntl configuration in app/config/config.yml
sonata_intl:
   timezone:
       # default timezone used as fallback
       default: Europe/Paris

       # locale specific overrides
       locales:
           fr: Europe/Paris
           en_UK: Europe/London


Step : 15 - Now open and login
http://yourdomain/app_dev.php/admin/dashboard
User : admin
Paassword : rajesh



  
Now, your fully functional symfony 2.1 admin panel is ready.
For more reference see http://sonata-project.org


Please share your ideas, comments and join my blog

Thanks,
Rajesh Meniya
Symfony Developer