installer-symfony-avec-sonata
Menu

Crixus| votre expert digital

- Agence web & E-Com à Brest
//// Installation d’un CMS minimaliste sous Symfony avec Sonata

Brest, Finistère,
Bretagne, France
contact@crixus.fr
+33 (0)6 09 10 32 61

Citation du jour
Ceux qui disent que Linux c'est compliqué n'ont jamais essayé de comprendre une fille..

Installation d’un CMS minimaliste sous Symfony avec Sonata
symfony-avec-sonata-cms-minimaliste

Installation d’un CMS minimaliste sous Symfony avec Sonata

Dans ce petit tutoriel, vous allez découvrir comment disposer de son propre CMS sous Symfony. C’est-à-dire, vous allez pouvoir intégrer un système d’administration à votre site web ou à votre blog. Pour cela nous nous servirons de bundles open source mis à disposition par les contributeurs du projet Sonata.

Un avant goût

Voici un petit aperçu de votre future interface d’administration …

Bien sur vous pourrez la personnaliser par la suite …

Pour commencer, vous devez avoir installé Symfony2 au préalable. Si ce n’est pas le cas, rendez-vous ici ou ici pour découvrir et installer Symfony2.
Une fois Symfony2 installé …

Ajouter dans composer.json
"sonata-project/core-bundle":  "~2.3@dev,>=2.3.1",
  "sonata-project/block-bundle": "~2.3@dev",
  "knplabs/knp-menu-bundle":  "~2.0",
  "sonata-project/admin-bundle": "~2.4@dev",
  "sonata-project/doctrine-orm-admin-bundle":  "~2.4@dev"

Puis composer.phar update

Ajouter dans AppKernel
             //admin
  new  Sonata\CoreBundle\SonataCoreBundle(),
  new  Sonata\BlockBundle\SonataBlockBundle(),
  new Knp\Bundle\MenuBundle\KnpMenuBundle(),
  new  Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),
  new  Sonata\AdminBundle\SonataAdminBundle(),

Ajouter dans Config.yml
sonata_block:
  default_contexts: [cms]
  blocks:
  sonata.admin.block.admin_list:
  contexts:   [admin]
  sonata.user.block.menu:  # used to display the menu in profile pages
  sonata.user.block.account: # used to  display menu option (login option)
  sonata.block.service.text: # used to if  you plan to use Sonata user routes
  sonata.block.service.rss:

Et dans routing.yml
admin:
  resource:  '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
  prefix:  /admin
_sonata_admin:
resource: .
type: sonata_admin
prefix: /admin

Puis faire php app/console assets:install web

On peux voir l’admin à l’adresse:
http://localhost/votresite/web/app_dev.php/admin/dashboard
optionnel 
  composer.json
  "simplethings/entity-audit-bundle":  "~0.5"

Puis AppKernel:
//possible de desactiver
new  SimpleThings\EntityAudit\SimpleThingsEntityAuditBundle(),

On vas ajouter la gestion des utilisateurs dans l’admin
composer.json
"sonata-project/easy-extends-bundle": "~2.1@dev",
  "sonata-project/datagrid-bundle": "~2.2@dev",
  "sonata-project/user-bundle": "~2.3@dev"

Puis AppKernel:
  //  SONATA FOUNDATION
  new  Sonata\EasyExtendsBundle\SonataEasyExtendsBundle(),
  //user
  new FOS\UserBundle\FOSUserBundle(),
  new Sonata\UserBundle\SonataUserBundle('FOSUserBundle'),

Dans config.yml
  doctrine:
  dbal:
  driver:   "%database_driver%"
  host:     "%database_host%"
  port:      "%database_port%"
  dbname:   "%database_name%"
  user:     "%database_user%"
  password:  "%database_password%"
  charset:  UTF8
  types:
  json:  Sonata\Doctrine\Types\JsonType
  # if using pdo_sqlite as your database  driver:
  #    1. add the path in parameters.yml
  #      e.g. database_path: "%kernel.root_dir%/data/data.db3"
  #    2. Uncomment database_path in parameters.yml.dist
  #   3. Uncomment next line:
  #     path:      "%database_path%"
orm:
auto_generate_proxy_classes: "%kernel.debug%"
entity_managers:
default:
auto_mapping: true
mappings:
#ApplicationSonataUserBundle: ~
SonataUserBundle: ~
FOSUserBundle: ~

Puis encore dans config.yml
sonata_user:
  #security_acl: true # Uncomment for ACL  support
  manager_type: orm # can be orm or mongodb
fos_user:
  db_driver:   orm # can be orm or odm
  firewall_name:  main
  user_class:   Sonata\UserBundle\Entity\BaseUser
group:
  group_class:  Sonata\UserBundle\Entity\BaseGroup
  group_manager:  sonata.user.orm.group_manager
service:
  user_manager: sonata.user.orm.user_manager
 
Dans 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:  /profile
# Admin's routing
  sonata_user:
  resource:  '@SonataUserBundle/Resources/config/routing/admin_security.xml'
  prefix: /admin
 
Puis dans security.yml
security:
  role_hierarchy:
  ROLE_ADMIN:  [ROLE_USER, ROLE_SONATA_ADMIN]
  ROLE_SUPER_ADMIN: [ROLE_ADMIN,  ROLE_ALLOWED_TO_SWITCH]
  SONATA:
  -  ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT  #  comment it when using acl
    providers:
  fos_userbundle:
  id: fos_user.user_provider.username
  encoders:
  FOS\UserBundle\Model\UserInterface:  sha512
  firewalls:
  dev:
  pattern:  ^/(_(profiler|wdt)|css|images|js)/
  security: false
  admin:
  pattern:  /admin(.*)
  context:  user
  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
  main:
  pattern: ^/
  form_login:
  provider: fos_userbundle
  csrf_provider:  form.csrf_provider
  logout:  true
  anonymous:  true
  default:
  anonymous: ~
  access_control:
  #  URL of FOSUserBundle which need to be available to anonymous users
  - { path: ^/login$, role:  IS_AUTHENTICATED_ANONYMOUSLY }
  - { path: ^/register, role:  IS_AUTHENTICATED_ANONYMOUSLY }
  - { path: ^/resetting, role:  IS_AUTHENTICATED_ANONYMOUSLY }
  # Admin login page needs to be access  without credential
  - { path: ^/admin/login$, role:  IS_AUTHENTICATED_ANONYMOUSLY }
  - { path: ^/admin/logout$, role:  IS_AUTHENTICATED_ANONYMOUSLY }
  - { path: ^/admin/login_check$, 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 }

Maintenant si on se rend à l’adresse:
http://localhost/votresite/web/app_dev.php/admin

On doit pouvoir se connecter.

Etendons notre bundle :
php  app/console sonata:easy-extends:generate SonataUserBundle  --dest="./src"

On l’ajoute dans le AppKernel
new  Application\Sonata\UserBundle\ApplicationSonataUserBundle()

Puis de nouveau dans config.yml:

On modifie fos_user
fos_user:
  db_driver:   orm # can be orm or odm
  firewall_name:  main
  user_class:   Application\Sonata\UserBundle\Entity\User
  group:
  group_class:  Application\Sonata\UserBundle\Entity\Group
  group_manager:  sonata.user.orm.group_manager

Et on enlève le commentaire #ApplicationSonataUserBundle: ~ dans doctrine:
Nous allons générer notre base de données après avoir configuré parameters.yml
parameters:
  database_driver: pdo_mysql
  database_host: 127.0.0.1
  database_port: null
  database_name: votrebdd
  database_user: root
  database_password: null
  mailer_transport: smtp
  mailer_host: 127.0.0.1
  mailer_user: null
  mailer_password: null
  locale: fr
  secret:  ThisTokenIsNotSoSecretChangeIt

Puis dans la console:
  php  app/console doctrine:database:create
  php  app/console doctrine:schema:update --force
Puis on créer un admin:
  php  app/console fos:user:create

Renseignez le login, email et mdp
Puis
php app/console fos:user:promote afin d’assigner les droits

Votre login saisie plus haut puis ROLE_SONATA_ADMIN

Essayer de vous connecter sur l’admin, vous pouvez déjà éditer et modifier votre compte ou créer d’autres utilisateurs 

Maintenant on continue avec le PageBundle de Sonata

Tous d’abord le SonataCacheBundle

Dans composer.json on ajoute
"sonata-project/cache-bundle":  "2.2.*@dev"
Puis php composer.phar update

On active dans AppKernel:
new  Sonata\CacheBundle\SonataCacheBundle(),
On  modifie autoload.php
<?php
use  Doctrine\Common\Annotations\AnnotationRegistry;
  use  Composer\Autoload\ClassLoader;
/**
  * @var ClassLoader $loader
  */
  $loader = require  __DIR__.'/../vendor/autoload.php';
AnnotationRegistry::registerLoader(array($loader,  'loadClass'));
  $loader->add('Sonata',  __DIR__);
  return $loader;

dans config.yml
sonata_cache:
  caches:
  symfony:
  token: s3cur3 # token used to clear  the related cache
  php_cache_enabled: true # Optional  (default: false), clear APC or PHP OPcache
  types: [mytype1, mycustomtype2] #  Optional, you can restrict allowed cache types
  servers:
  - { domain: kooqit.local, ip: 127.0.0.1, port: 80}

Depuis le site de Sonata, plus d’options peuvent être ajoutées suivant votre configuration.

On ajoute dans routing.yml
sonata_cache_cache:
  resource:  '@SonataCacheBundle/Resources/config/routing/cache.xml'
  prefix: /

Installation de SonataSeoBundle

Dans composer.json:
"sonata-project/seo-bundle":  "2.0.*@dev"

Puis php composer.phar update

Dans le AppKernel:
new Sonata\SeoBundle\SonataSeoBundle()
Dans config.yml
sonata_seo:
  encoding:         UTF-8
  page:
  default:          sonata.seo.page.default
  title:            Sonata Project
  metas:
  name:
  keywords:             foo bar
  description:          The description
  robots:               index, follow
  property:
  # Facebook application settings
  #'fb:app_id':          XXXXXX
  #'fb:admins':          admin1,  admin2
  # Open Graph information
  # see  http://developers.facebook.com/docs/opengraphprotocol/#types or http://ogp.me/
  'og:site_name':       Sonata Project Sandbox
  'og:description':     A demo of the some rich bundles for your  Symfony2 projects
  http-equiv:
  'Content-Type':         text/html;  charset=utf-8
  #'X-Ua-Compatible':       IE=EmulateIE7
  charset:
  UTF-8:    ''
  head:
  'xmlns':              http://www.w3.org/1999/xhtml
  'xmlns:og':           http://opengraphprotocol.org/schema/
  #'xmlns:fb':            "http://www.facebook.com/2008/fbml"

Installation de SonataNotificationBundle

Dans composer.json
"sonata-project/notification-bundle":  "2.3.*@dev"
Puis php composer.phar update

Dans le AppKernel:
new  Sonata\NotificationBundle\SonataNotificationBundle(),

Dans config.yml on l’ajoute pour le mapping de doctrine
orm:
  # ...
  entity_managers:
  default:
  # ...
  mappings:
  # ...
  SonataNotificationBundle: ~
  ApplicationSonataNotificationBundle: ~

Et aussi
sonata_notification:
  backend:  sonata.notification.backend.runtime

Nous allons étendre ce bundle:
php  app/console sonata:easy-extends:generate SonataNotificationBundle --dest=src
Toutes nos dépendances sont installés on continue avec SonataPageBundle etSymfony Cmf routing

Dans composer.json
"symfony-cmf/routing-bundle": "1.3.*@dev",
"sonata-project/page-bundle": "2.4.*@dev"
Puis php composer.phar update

Dans le AppKernel:
  new  Sonata\PageBundle\SonataPageBundle(),
  new  Symfony\Cmf\Bundle\RoutingBundle\CmfRoutingBundle()

On édite à nouveau config.yml

Dans doctrine:
mappings:
  #ApplicationSonataPageBundle: ~ # only once the  ApplicationSonataPageBundle is generated
  SonataPageBundle:  ~
Dans sonata_block :
On ajoute context_manager: sonata.page.block.context_manager

Puis:
sonata_page:
  multisite: host
  use_streamed_response: true # set the value  to false in debug mode or if the reverse proxy does not handle streamed  response
  ignore_route_patterns:
  -  ^(.*)admin(.*)   # ignore admin route, ie  route containing 'admin'
  -  ^_(.*)          # ignore symfony routes
  ignore_routes:
  -  sonata_page_cache_esi
  -  sonata_page_cache_ssi
  -  sonata_page_js_sync_cache
  -  sonata_page_js_async_cache
  -  sonata_cache_esi
  -  sonata_cache_ssi
  -  sonata_cache_js_async
  -  sonata_cache_js_sync
  -  sonata_cache_apc
  ignore_uri_patterns:
  - ^/admin\/   # ignore admin route, ie route containing  'admin'
  page_defaults:
  homepage: {decorate: false} # disable  decoration for homepage, key - is a page route
  default_template: default # template key  from templates section, used as default for
  templates:
  default:  { path:  'SonataPageBundle::layout.html.twig',           name: 'default' }
  2columns: { path:  'SonataPageBundle::2columns_layout.html.twig', name: '2 columns layout' }
  catch_exceptions:
  not_found: [404]
  fatal:     [500]

#ajouter seulement pour modifier l’admin
  #sonata_admin:
  #assets:
  #javascripts:
  #- bundles/sonataadmin/vendor/jquery/dist/jquery.min.js
  #- bundles/sonataadmin/vendor/jquery.scrollTo/jquery.scrollTo.js
  #- bundles/sonataadmin/vendor/jqueryui/ui/minified/jquery-ui.min.js
  #-  bundles/sonataadmin/vendor/jqueryui/ui/minified/i18n/jquery-ui-i18n.min.js
  #stylesheets:
  #-  bundles/sonataadmin/vendor/AdminLTE/css/font-awesome.min.css
  #-  bundles/sonataadmin/vendor/jqueryui/themes/flick/jquery-ui.min.css
  # app/config/config.yml
  cmf_routing:
  chain:
  routers_by_id:
  # enable the DynamicRouter with  high priority to allow overwriting configured routes with content
  #cmf_routing.dynamic_router:  200
  # enable the symfony  default router with a lower priority
  sonata.page.router:  150
  router.default: 100

Dans routing.yml on ajoute les routes
sonata_page_exceptions:
  resource:  '@SonataPageBundle/Resources/config/routing/exceptions.xml'
  prefix: /
  sonata_page_cache:
  resource:  '@SonataPageBundle/Resources/config/routing/cache.xml'

Et dans security on modifie, pour ajouter – ROLE_SONATA_PAGE_ADMIN_BLOCK_EDIT
role_hierarchy:
  ROLE_ADMIN:  [ROLE_USER, ROLE_SONATA_ADMIN]
  ROLE_SUPER_ADMIN: [ROLE_ADMIN,  ROLE_ALLOWED_TO_SWITCH]
  SONATA:
  -  ROLE_SONATA_PAGE_ADMIN_BLOCK_EDIT
  -  ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT

Tous est prêt pour notre nouveau bundle
php app/console sonata:easy-extends:generate  SonataPageBundle --dst=src

On dé-commente ApplicationSonataPageBundle dans config.yml

Enfin enregistrement dans le AppKernel
new  Application\Sonata\NotificationBundle\ApplicationSonataNotificationBundle(),

On met à jour la base de données
php app/console doctrine:schema:update –force

A nouveau les assets:
php  app/console assets:install web

On vide le cache (de temps à autre c’est conseiller);
php app/console  cache:clear

Enfin on crée notre site
php  app/console sonata:page:create-site

Vous devriez avoir quelques lignes similaires à renseigner avec vos informations …
Please define a value for  Site.name : localhost
  Please define a value for  Site.host : localhost
  Please define a value for  Site.relativePath : /
  Please define a value for  Site.enabled : true
  Please define a value for  Site.locale : -
  Please define a value for  Site.enabledFrom : now
  Please define a value for  Site.enabledTo : +10 years
  Please define a value for  Site.default : true
Puis répondre yes lors de la création

Enfin et pour en finir avec sonataPageBundle
php  app/console sonata:page:update-core-routes --site=1
Et
php  app/console sonata:page:create-snapshots --site=1
Voilà pour ce premier tutoriel, vous disposez d’un système d’administration de démarrage pour les pages de votre site internet sous Symfony … reste à vous d’être inventif et ingénieux afin de le compléter et le rendre encore plus fonctionnel et agréable d’utilisation.

Télécharger les sources au format zip et placer le répertoire Application dans src/ .

Nota : Il se peut que lors de la création de ApplicationSonataNotificationBundle vous rencontriez un petit souci. Même en le désactivant dans doctrine, il semble qu’ApplicationSonataNotificationBundle doit être quand même installé, on trouve ce fichier sur github (en cherchant bien), cependant il est dans les fichiers mis à disposition en téléchargement.

INFORMATIONS CRIXUS

Depuis 2014 Crixus dispose de son propre CMS (système d’administration) nommé JARVIS 1.0. Développé avec des technologies de pointes, cette première version est à l’origine des sites Web CRIXUS.

Véritable tableau de bord Intelligent, JARVIS permet une gestion simple et intuitive des sites web sans presque aucunes limites dans le développement des fonctionnalités spécifiques à une organisation. Cependant, l’interface graphique étant quelque peu dépassé et les modules difficiles à faire évoluer, CRIXUS a choisi le Framework Symfony2 comme base de développement pour la nouvelle version de son CMS.

GENUS 2.0 est en cours de préparation et sera déployé d’ici début 2016.  Plus d’informations sur la nouvelle version dans les semaines à venir  …
 

partager : - - - -


0Commentaire , soyez le premier

Laissez un commentaire