Voici comment installer le CMS Sonata Page à partir d’une installation neuve de Symfony. Cet article sera modifié régulièrement au fur et à mesure de mes découvertes.
Le but est de mettre en place un environnement complet à savoir:
- Un système de CMS nous permettant de créer des pages, modifier des blocks dans les pages sans avoir à éditer de code
- Une gestion de membres, au moins pour protéger l’administration dans un premier temps
- Une gestion des médias permettant l’insertion d’images, vidéos etc.
- La possibilité d’utiliser de l' »HTML Riche » pour les publications
- Une administration permettant de gérer tout ce petit monde.
Installation de Symfony 2 via composer :
php composer.phar create-project symfony/framework-standard-edition sonata/ 2.2.1
Modifier le composer.json pour y inclure les bundles suivants :
"sonata-project/page-bundle": "2.3.*@dev", "sonata-project/doctrine-orm-admin-bundle": "2.2.*@dev", "sonata-project/admin-bundle": "2.2.*@dev", "sonata-project/block-bundle": "2.2.*@dev", "knplabs/knp-menu-bundle": "1.1.*@dev", "sonata-project/seo-bundle": "1.1.1", "sonata-project/easy-extends-bundle": "2.1.*@dev", "sonata-project/notification-bundle": "2.2.*@dev", "guzzle/guzzle": "3.3.*@dev", "liip/monitor-bundle": "1.0.*@dev", "liip/monitor": "1.0.*@dev", "videlalvaro/php-amqplib": "v2.0.2", "sonata-project/user-bundle": "2.2.*@dev", "sonata-project/media-bundle": "2.2.*@dev", "sonata-project/formatter-bundle": "2.2.*@dev"
puis lancer la commande
php composer.phar update
Pour télécharger les mises à jour.
Activer les Bundles suivants :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public function registerBundles() { return array( // ... new Sonata\CacheBundle\SonataCacheBundle(), new Sonata\BlockBundle\SonataBlockBundle(), new Sonata\SeoBundle\SonataSeoBundle(), new Sonata\EasyExtendsBundle\SonataEasyExtendsBundle(), new Sonata\NotificationBundle\SonataNotificationBundle(), new Sonata\jQueryBundle\SonatajQueryBundle(), new Sonata\AdminBundle\SonataAdminBundle(), new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(), new Sonata\PageBundle\SonataPageBundle(), new Knp\Bundle\MenuBundle\KnpMenuBundle(), new Symfony\Cmf\Bundle\RoutingBundle\CmfRoutingBundle, new FOS\UserBundle\FOSUserBundle(), new Sonata\UserBundle\SonataUserBundle('FOSUserBundle'), new Sonata\MediaBundle\SonataMediaBundle(), new Sonata\MarkItUpBundle\SonataMarkItUpBundle(), new Knp\Bundle\MarkdownBundle\KnpMarkdownBundle(), new Ivory\CKEditorBundle\IvoryCKEditorBundle(), new Sonata\FormatterBundle\SonataFormatterBundle(), // new Application\Sonata\PageBundle\ApplicationSonataPageBundle(), // new Application\Sonata\UserBundle\ApplicationSonataUserBundle(), // new Application\Sonata\MediaBundle\ApplicationSonataMediaBundle(), // ... ); } |
Pensez bien à laisser les lignes indiquées comme commentées, on les activera plus tard ! Puis dans le config.yml
# Configuration Sonata Cache
sonata_cache:
caches:
esi:
token: an unique security key # a random one is generated by default
servers:
- varnishadm -T 127.0.0.1:2000 {{ COMMAND }} "{{ EXPRESSION }}"
ssi:
token: an unique security key # a random one is generated by default
#mongo:
# database: cache
# collection: cache
# servers:
# - {host: 127.0.0.1, port: 27017, user: username, password: pASS'}
# - {host: 127.0.0.2}
#memcached:
# prefix: test # prefix to ensure there is no clash between instances
# servers:
# - {host: 127.0.0.1, port: 11211, weight: 0}
#apc:
# token: s3cur3 # token used to clear the related cache
# prefix: test # prefix to ensure there is no clash between instances
# servers:
# - { domain: kooqit.local, ip: 127.0.0.1, port: 80}
# Configuration Sonata Block
sonata_block:
default_contexts: [cms]
context_manager: sonata.page.block.context_manager
blocks:
sonata.admin.block.admin_list:
contexts: [admin]
#sonata.admin_doctrine_orm.block.audit:
# contexts: [admin]
sonata.page.block.children_pages:
sonata.block.service.text:
sonata.block.service.rss:
sonata.formatter.block.formatter:
# Some specific block from the SonataMediaBundle
#sonata.media.block.media:
#sonata.media.block.gallery:
#sonata.media.block.feature_media:
# Configuration Sonata Seo
sonata_seo:
default: sonata.seo.page.default
encoding: UTF-8
page:
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
head:
'xmlns': http://www.w3.org/1999/xhtml
'xmlns:og': http://opengraphprotocol.org/schema/
#'xmlns:fb': "http://www.facebook.com/2008/fbml"
# Configuration Sonata Notification
sonata_notification:
backend: sonata.notification.backend.runtime
# Symfony CMF
cmf_routing:
chain:
routers_by_id:
# enable the DynamicRouter with high priority to allow overwriting configured routes with content
#symfony_cmf_routing_extra.dynamic_router: 200
# enable the symfony default router with a lower priority
sonata.page.router: 150
router.default: 100
# Configuration Sonata Pages
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_esi_cache
- sonata_page_ssi_cache
- 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 pages
templates:
default: {path: 'SonataPageBundle::layout.html.twig', name: default }
# manage the http errors
catch_exceptions:
not_found: [404] # render 404 page with "not_found" key (name generated: _page_internal_error_{key})
fatal: [500] # so you can use the same page for different http errors or specify specific page for each error
# Configuration KNP Menu
knp_menu:
twig: # use "twig: false" to disable the Twig extension and the TwigRenderer
template: knp_menu.html.twig
templating: false # if true, enables the helper for PHP templates
default_renderer: twig # The renderer to use, list is also available by default
sonata_user:
security_acl: true
manager_type: orm # can be orm or mongodb
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
sonata_media:
default_context: default
db_driver: doctrine_orm # or doctrine_mongodb, doctrine_phpcr
contexts:
default: # the default context is mandatory
providers:
- sonata.media.provider.dailymotion
- sonata.media.provider.youtube
- sonata.media.provider.image
- sonata.media.provider.file
formats:
small: { width: 100 , quality: 70}
big: { width: 500 , quality: 70}
cdn:
server:
path: /uploads/media # http://media.sonata-project.org/
filesystem:
local:
directory: %kernel.root_dir%/../web/uploads/media
create: false
sonata_formatter:
formatters:
markdown:
service: sonata.formatter.text.markdown
extensions:
- sonata.formatter.twig.control_flow
- sonata.formatter.twig.gist
- sonata.media.formatter.twig
text:
service: sonata.formatter.text.text
extensions:
- sonata.formatter.twig.control_flow
- sonata.formatter.twig.gist
- sonata.media.formatter.twig
rawhtml:
service: sonata.formatter.text.raw
extensions:
- sonata.formatter.twig.control_flow
- sonata.formatter.twig.gist
- sonata.media.formatter.twig
richhtml:
service: sonata.formatter.text.raw
extensions:
- sonata.formatter.twig.control_flow
- sonata.formatter.twig.gist
- sonata.media.formatter.twig
twig:
service: sonata.formatter.text.twigengine
extensions: [] # Twig formatter cannot have extensions
sonata_admin:
templates:
# default global templates
layout: SonataAdminBundle::layout.html.twig
Rajouter dans la partie Doctrine :
doctrine: dbal: # ... types: json: Sonata\Doctrine\Types\JsonType
et dans la partie framework :
framework: # ... translator: ~
Enfin dans la partie twig :
twig:
#...
form:
resources:
- 'SonataAdminBundle:Form:silex_form_div_layout.html.twig'
- 'SonataFormatterBundle:Form:formatter.html.twig'
Ajouter dans le routing:
gallery:
resource: '@SonataMediaBundle/Resources/config/routing/gallery.xml'
prefix: /media/gallery
media:
resource: '@SonataMediaBundle/Resources/config/routing/media.xml'
prefix: /media
sonata_page_exceptions:
resource: '@SonataPageBundle/Resources/config/routing/exceptions.xml'
prefix: /
sonata_page_cache:
resource: '@SonataCacheBundle/Resources/config/routing/cache.xml'
prefix: /
admin:
resource: '@SonataAdminBundle/Resources/config/routing/sonata_admin.xml'
prefix: /admin
_sonata_admin:
resource: .
type: sonata_admin
prefix: /admin
sonata_user:
resource: '@SonataUserBundle/Resources/config/routing/admin_security.xml'
prefix: /admin
Modifier le security.yml comme suit :
security:
encoders:
Application\Sonata\UserBundle\Entity\User: sha512
role_hierarchy:
ROLE_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN]
ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_SONATA_ADMIN, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH, SONATA]
SONATA:
- ROLE_SONATA_PAGE_ADMIN_PAGE_EDIT # if you are not using acl then this line must be uncommented
- ROLE_SONATA_PAGE_ADMIN_BLOCK_EDIT
acl:
connection: default
providers:
fos_userbundle:
id: fos_user.user_manager
firewalls:
# -> custom firewall for the admin area of the URL
admin:
switch_user: true
context: user
pattern: /admin(.*)
form_login:
provider: fos_userbundle
login_path: /admin/login
use_forward: false
check_path: /admin/login_check
failure_path: null
use_referer: true
logout:
path: /admin/logout
target: /admin/login
anonymous: true
# -> end custom configuration
# defaut login area for standard users
main:
switch_user: true
context: user
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 }
On va maintenant créer le fichier twig layout.html.twig dans app/Resources/SonataAdminBundle/views/ et y placer ce contenu :
{% extends 'SonataAdminBundle::standard_layout.html.twig' %}
{% block stylesheets %}
{{ parent() }}
<link rel="stylesheet" href="{{ asset('bundles/sonatamarkitup/markitup/markitup/skins/sonata/style.css') }}" type="text/css" media="all" />
<link rel="stylesheet" href="{{ asset('bundles/sonatamarkitup/markitup/markitup/sets/markdown/style.css') }}" type="text/css" media="all" />
<link rel="stylesheet" href="{{ asset('bundles/sonatamarkitup/markitup/markitup/sets/html/style.css') }}" type="text/css" media="all" />
<link rel="stylesheet" href="{{ asset('bundles/sonatamarkitup/markitup/markitup/sets/textile/style.css') }}" type="text/css" media="all" />
{% endblock %}
{% block javascripts %}
{{ parent() }}
<script src="{{ asset('bundles/ivoryckeditor/ckeditor.js') }}" type="text/javascript"></script>
<script src="{{ asset('bundles/sonatamarkitup/markitup/markitup/jquery.markitup.js') }}" type="text/javascript"></script>
<script src="{{ asset('bundles/sonatamarkitup/markitup/markitup/sets/markdown/set.js') }}" type="text/javascript"></script>
<script src="{{ asset('bundles/sonatamarkitup/markitup/markitup/sets/html/set.js') }}" type="text/javascript"></script>
<script src="{{ asset('bundles/sonatamarkitup/markitup/markitup/sets/textile/set.js') }}" type="text/javascript"></script>
{% endblock %}
lancer ensuite les commandes suivantes
> php app/console assets:install web > php app/console sonata:easy-extends:generate --dest=src SonataPageBundle > php app/console sonata:easy-extends:generate --dest=src SonataUserBundle > php app/console sonata:easy-extends:generate --dest=src SonataMediaBundle
Maintenant on va activer le SonataPageBundle et le SonataUserBundle en décommentant la ligne dans l’AppKernel.php:
1 2 3 | new Application\Sonata\PageBundle\ApplicationSonataPageBundle(), new Application\Sonata\UserBundle\ApplicationSonataUserBundle(), new Application\Sonata\MediaBundle\ApplicationSonataMediaBundle(), |
Pensez à paramétrer votre base de données dans parameters.yml puis videz le cache:
> php app/console cache:clear
Enfin on lance la création des tables dans la base de données :
> php app/console doctrine:schema:update --force
Création du site par défaut
> php app/console sonata:page:create-site
Renseigner les informations telles qu’indiquées :
Please define a value for Site.name : Sonata Test Please define a value for Site.host : sonata.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 Creating website with the following information : name : localhost site : http(s)://localhost enabled : Tue, 10 Jan 2012 16:12:08 +0100 => Mon, 10 Jan 2022 16:12:08 +0100 Confirm site creation ?y Site created ! You can now create the related pages and snapshots by running the followings commands: php app/console sonata:page:update-core-routes --site=1 php app/console sonata:page:create-snapshots --site=1
On lance ensuite la mise à jour des pages et des snapshots
> php app/console sonata:page:update-core-routes --site=all > php app/console sonata:page:create-snapshots --site=all
Maintenant on va créer notre premier utilisateur, l’administrateur:
> php app/console fos:user:create
Il faut renseigner le login de d’administrateur, son adresse email et son mot de passe. Maintenant que notre utilisateur est créé, il faut en faire un super administrateur:
> php app/console fos:user:promote admin --super
Normalement si vous vous connectez sur http://sonata.localhost/app_dev.php/admin/dashboard, vous devriez pouvoir vous connecter et accéder à l’administration !
Dans un prochain article, on passera à l’étape utilisation !
Mises à jour :
- 14/05/2013 : Ajout du Bundle SonataMedia
- 24/05/2013 : Ajout du Bundle Formatter
- 31/05/2013 : Activation du Block Children dans config.yml
- 17/07/2013: Mise à jour de composer.json, AppKernel.php et config.yml
