SlideShare una empresa de Scribd logo
1 de 26
Descargar para leer sin conexión
Bundles útiles:
SonataBundle
JsRoutingBundle
DoctrineFixturesBundle
Realizada por:
Christian Aquino |@cj_aquino
Diego Ramirez |@thedarsideofit
Gonzalo Alonso |@GonzaloAlonsoD
Diego Barros |@Inmzombie
Para: Hydras C&S |@hydras_cs
Basada en Libro Symfony 2 en español Nacho Pacheco y The Book
¿Que es Sonata?
Sonata fue creado por el entusiasta symfonyano Thomas Rabaix.
La meta del proyecto Sonata es proveer una solución e-commerce basado en Sf2. Pensado como un
conjunto de herramientas para hacer e-commerce de una manera fácil.
● Admin Bundle : Un bundle para generar una interface robusta y amistosa para el usuario.
● Media Bundle : Un bundle para manejar datos multimedia, la multimedia se refiere a archivos,
videos,imagenes.
● Page Bundle : Un bundle para transformar las acciones de Sf2 en un CMS.
Instalando y configurando
Añadir lo siguiente a tu archivo composer.json:
$ php composer.phar update
{
"require": {
...
"sonata-project/admin-bundle": "dev-master",
"friendsofsymfony/user-bundle": "dev-master",
"sonata-project/user-bundle": "dev-master",
"sonata-project/doctrine-orm-admin-bundle": "dev-master"
...
}
}
Registramos los bundles en app/AppKernel.php
// ...
public function registerBundles()
{
$bundles = array(
// ...
new FOSUserBundleFOSUserBundle(),
new SonatajQueryBundleSonatajQueryBundle(),
new SonataAdminBundleSonataAdminBundle(),
new SonataBlockBundleSonataBlockBundle(),
new SonataDoctrineORMAdminBundleSonataDoctrineORMAdminBundle(),
new KnpBundleMenuBundleKnpMenuBundle(),
new SonataUserBundleSonataUserBundle('FOSUserBundle'),
new SonataEasyExtendsBundleSonataEasyExtendsBundle(),
// ...
);
// ...
}
Editar los archivos config.yml, security.yml según la
configuración definida en:
http://blog.dayo.fr/2012/12/symfony2-1-sonata-admin-
sonata-user-fos-userbundle-en/
Listado de campos:
<?php
namespace SonataNewsBundleAdmin;
use SonataAdminBundleAdminAdmin;
use SonataAdminBundleFormFormMapper;
use SonataAdminBundleDatagridDatagridMapper;
use SonataAdminBundleDatagridListMapper;
use SonataAdminBundleShowShowMapper;
class PostAdmin extends Admin
{
protected function configureListFields (ListMapper $listMapper )
{
$listMapper
->addIdentifier ('title')
->add('author')
->add('enabled')
->add('tags')
->add('commentsEnabled' )
// add custom action links
->add('_action', 'actions', array(
'actions' => array(
'view' => array(),
'edit' => array(),)
));
}
}
Tipos disponibles:
● boolean
● datetime
● decimal
● identifier
● integer
● many_to_one : a link will be added to the related edit action
● string
● text
● date
● time
Acciones en el listado:
<?php
$listMapper ->add('_action', 'actions', array(
'actions' => array(
'view' => array(),
'edit' => array(),
)
))
Podemos editar y quitar las acciones. Podemos especificar las templates de renderizado
<?php
$listMapper ->add('_action', 'actions', array(
'actions' => array(
'view' => array(),
'edit' => array(),
'delete' => array('template' => 'MyBundle:MyController:my_partial.html.twig' ),
)
))
Mostrar sub entidades:
<?php
namespace AcmeAcmeBundleAdmin;
use SonataAdminBundleAdminAdmin;
use SonataAdminBundleFormFormMapper;
use SonataAdminBundleDatagridDatagridMapper;
use SonataAdminBundleDatagridListMapper;
use SonataAdminBundleShowShowMapper;
class UserAdmin extends Admin
{
protected function configureListFields (ListMapper $listMapper )
{
$listMapper
->addIdentifier ('id')
->addIdentifier ('firstName' )
->addIdentifier ('lastName')
->addIdentifier ('address.street' )
->addIdentifier ('address.ZIPCode' )
->addIdentifier ('address.town' )
;
}
}
Personalizando Templates
<?php
namespace SonataMediaBundleAdmin;
use SonataAdminBundleAdminAdmin;
use SonataAdminBundleFormFormMapper;
use SonataAdminBundleDatagridDatagridMapper;
use SonataAdminBundleDatagridListMapper;
use SonataAdminBundleShowShowMapper;
class MediaAdmin extends Admin
{
protected function configureListFields (ListMapper $listMapper )
{
$listMapper
->addIdentifier ('id')
->add('image', 'string', array('template' => 'SonataMediaBundle:MediaAdmin:list_image.html.twig' )
->add('custom', 'string', array('template' => 'SonataMediaBundle:MediaAdmin:list_custom.html.twig'
;
}
}
{% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %}
{% block field%}
<div>
<strong> {{ object.name }}</strong> <br />
{{ object.providername }} : {{ object.width }}x{{ object.height }} <br />
</div>
{% endblock %}
La template quedaría:
Redefinir el controlador CRUD
<?php
// src/Tutorial/BlogBundle/Controller/CommentAdminController.php
namespace TutorialBlogBundleController;
use SonataAdminBundleControllerCRUDController as Controller;
class CommentAdminController extends Controller
{
}
DoctrineFixturesBundle
Los accesorios se utilizan para cargar en una base de datos un juego de datos controlado. Puedes
utilizar estos datos para pruebas o podrían ser los datos iniciales necesarios para ejecutar la
aplicación sin problemas. Symfony2 no tiene integrada forma alguna de administrar accesorios, pero
Doctrine2 cuenta con una biblioteca para ayudarte a escribir accesorios para el ORM u ODM de
Doctrine.
Instalando y configurando
Añadir lo siguiente a tu archivo composer.json:
{
"require": {
"doctrine/doctrine-fixtures-bundle": "dev-
master"
}
}
$ php composer.phar update
Actualizar el composer
Por último, registramos el paquete DoctrineFixturesBundle en app/AppKernel.php
// ...
public function registerBundles()
{
$bundles = array(
// ...
new DoctrineBundleFixturesBundleDoctrineFixturesBundle(),
// ...
);
// ...
}
Escribiendo fixtures:
Los fixtures de Doctrine2 son clases PHP que pueden crear y persistir objetos a la base de datos. Al
igual que todas las clases en Symfony2, los fixtures deben estar alojado dentro de uno de los
paquetes de tu aplicación.
Para un paquete situado en src/Acme/HelloBundle, las clasesed los fixtures deben estar dentro de
src/Acme/HelloBundle/DataFixtures/ORM o src/Acme/HelloBundle/DataFixtures/MongoDB, para ORM
y ODM respectivamente, esta guía asume que estás utilizando el ORM — pero, los accesorios se
pueden agregar con la misma facilidad si estás utilizando ODM.
// src/Acme/HelloBundle/DataFixtures/ORM/LoadUserData.php
namespace AcmeHelloBundleDataFixturesORM;
use DoctrineCommonDataFixturesFixtureInterface;
use DoctrineCommonPersistenceObjectManager;
use AcmeHelloBundleEntityUser;
class LoadUserData implements FixtureInterface
{
/**
* {@inheritDoc}
*/
public function load(ObjectManager $manager)
{
$userAdmin = new User();
$userAdmin->setUsername('admin');
$userAdmin->setPassword('test');
$manager->persist($userAdmin);
$manager->flush();
}
}
Cargando los fixtures
php app/console doctrine:fixtures:load
php app/console doctrine:mongodb:fixtures:load
La tarea buscará dentro del directorio DataFixtures/ORM (o DataFixtures/MongoDB paraODM) de
cada paquete y ejecutará cada clase que implemente la FixtureInterface.
Ambas órdenes vienen con unas cuantas opciones:
● --fixtures=/ruta/al/accesorio — Usa esta opción para especificar manualmente el directorio de
donde se deben cargar las clases accesorio;
● --append — Utiliza esta opción para añadir datos en lugar de eliminarlos antes de cargarlos
(borrar primero es el comportamiento predeterminado);
● --em=manager_name — Especifica manualmente el gestor de la entidad a utilizar para cargar
los datos.
Compartiendo objetos entre fixtures
Si tenemos varias clases de fixtures y queremos referir a los datos cargados en otras clases.
Deberemos.
// src/Acme/HelloBundle/DataFixtures/ORM/LoadUserData.php
namespace AcmeHelloBundleDataFixturesORM;
use DoctrineCommonDataFixturesAbstractFixture;
use DoctrineCommonDataFixturesOrderedFixtureInterface;
use DoctrineCommonPersistenceObjectManager;
use AcmeHelloBundleEntityUser;
class LoadUserData extends AbstractFixture implements OrderedFixtureInterface
{
public function load(ObjectManager $manager)
{
$userAdmin = new User();
$userAdmin->setUsername('admin');
$userAdmin->setPassword('test');
$manager->persist($userAdmin);
$manager->flush();
$this->addReference('admin-user', $userAdmin);
}
public function getOrder()
{
return 1; // el orden en el cual serán cargados los accesorios
// src/Acme/HelloBundle/DataFixtures/ORM/LoadUserGroupData.php
namespace AcmeHelloBundleDataFixturesORM;
use DoctrineCommonDataFixturesAbstractFixture;
use DoctrineCommonDataFixturesOrderedFixtureInterface;
use DoctrineCommonPersistenceObjectManager;
use AcmeHelloBundleEntityUserGroup;
class LoadUserGroupData extends AbstractFixture implements OrderedFixtureInterface
{
public function load(ObjectManager $manager)
{
$userGroupAdmin = new UserGroup();
$userGroupAdmin->setUser($this->getReference('admin-user'));
$userGroupAdmin->setGroup($this->getReference('admin-group'));
$manager->persist($userGroupAdmin);
$manager->flush();
}
public function getOrder()
{
return 3;
}
}
Los fixtures ahora se ejecutan en orden ascendente del valor devuelto por getOrder(). Cualquier
objeto que se establece con el método setReference() se puede acceder a través de getReference()
en las clases accesorio que tienen un orden superior.
JsRoutingBundle:
Instalando y configurando
Añadir lo siguiente a tu archivo composer.json:
{
"require": {
"friendsofsymfony/jsrouting-bundle": "dev-
master"
}
}
$ php composer.phar update friendsofsymfony/jsrouting-bundle
Actualizar el composer
Registramos en el app/AppKernel.php
// ...
public function registerBundles()
{
$bundles = array(
// ...
new FOSJsRoutingBundleFOSJsRoutingBundle(),
// ...
);
// ...
}
# app/config/routing.yml
fos_js_routing:
resource: "@FOSJsRoutingBundle/Resources/config/routing/routing.xml"
$ php app/console assets:install --symlink web
Agregamos las siguientes líneas que apuntan al javascript edl bundle
<script src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script>
<script src="{{ path('fos_js_routing_js', {"callback": "fos.Router.setData"}) }}"></script>
Para usar agregamos en donde se debe especificar la url:
Routing.generate('route_id', /* your params */).
Ejemplo de routing
# app/config/routing.yml
my_route_to_expose:
pattern: /foo/{id}/bar
defaults: { _controller: HelloBundle:Hello:index }
options:
expose: true
my_route_to_expose_with_defaults:
pattern: /blog/{page}
defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 }
options:
expose: true
Routing.generate('my_route_to_expose', { id: 10 });
// will result in /foo/10/bar
Routing.generate('my_route_to_expose', { id: 10, foo: "bar" });
// will result in /foo/10/bar?foo=bar
$.get(Routing.generate('my_route_to_expose', { id: 10, foo: "bar" }));
// will call /foo/10/bar?foo=bar
Routing.generate('my_route_to_expose_with_defaults');
// will result in /blog/1
Routing.generate('my_route_to_expose_with_defaults', { id: 2 });
// will result in /blog/2
Routing.generate('my_route_to_expose_with_defaults', { foo: "bar" });
// will result in /blog/1?foo=bar
Routing.generate('my_route_to_expose_with_defaults', { id: 2, foo: "bar" });
// will result in /blog/2?foo=bar

Más contenido relacionado

La actualidad más candente

La magia de jquery
La magia de jqueryLa magia de jquery
La magia de jqueryAngelDX
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controllerhydras_cs
 
Conexión a postgres desde
Conexión a postgres desdeConexión a postgres desde
Conexión a postgres desdejbersosa
 
Servlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLServlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLjubacalo
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascriptguest030dc2
 
Elementos de script en JSP
Elementos de script en JSPElementos de script en JSP
Elementos de script en JSPjubacalo
 
Presentacion diseño web con jquery
Presentacion diseño web con jqueryPresentacion diseño web con jquery
Presentacion diseño web con jqueryEutobar
 
Django: el framework web definitivo
Django: el framework web definitivoDjango: el framework web definitivo
Django: el framework web definitivoAnder Beaskoetxea
 
Practica utilizacion de beans en jsp
Practica  utilizacion de beans en jspPractica  utilizacion de beans en jsp
Practica utilizacion de beans en jspBoris Salleg
 
Manual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcomManual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcomjo_ram
 
Clase 2 conceptos fundamentales
Clase 2   conceptos fundamentalesClase 2   conceptos fundamentales
Clase 2 conceptos fundamentaleshydras_cs
 
Introducción a prototype javascript
Introducción a prototype javascriptIntroducción a prototype javascript
Introducción a prototype javascriptaitorgr
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado JavascriptEl Jota
 

La actualidad más candente (20)

(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery(Muy breve) Introduccion a jQuery
(Muy breve) Introduccion a jQuery
 
Zen AJAX - Programador PHP
Zen AJAX - Programador PHPZen AJAX - Programador PHP
Zen AJAX - Programador PHP
 
La magia de jquery
La magia de jqueryLa magia de jquery
La magia de jquery
 
Clase 5 controller
Clase 5 controllerClase 5 controller
Clase 5 controller
 
Conexión a postgres desde
Conexión a postgres desdeConexión a postgres desde
Conexión a postgres desde
 
Servlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTMLServlets que manejan datos de formularios HTML
Servlets que manejan datos de formularios HTML
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
 
Elementos de script en JSP
Elementos de script en JSPElementos de script en JSP
Elementos de script en JSP
 
Introducción a Flask
Introducción a FlaskIntroducción a Flask
Introducción a Flask
 
I2 u4
I2 u4I2 u4
I2 u4
 
Presentacion diseño web con jquery
Presentacion diseño web con jqueryPresentacion diseño web con jquery
Presentacion diseño web con jquery
 
Django: el framework web definitivo
Django: el framework web definitivoDjango: el framework web definitivo
Django: el framework web definitivo
 
Java beans en jsp
Java beans en jspJava beans en jsp
Java beans en jsp
 
Practica utilizacion de beans en jsp
Practica  utilizacion de beans en jspPractica  utilizacion de beans en jsp
Practica utilizacion de beans en jsp
 
Manual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcomManual de jquery en pdf desarrollowebcom
Manual de jquery en pdf desarrollowebcom
 
Clase 2 conceptos fundamentales
Clase 2   conceptos fundamentalesClase 2   conceptos fundamentales
Clase 2 conceptos fundamentales
 
Bases de datos con PHP y Mysqli
Bases de datos con PHP y MysqliBases de datos con PHP y Mysqli
Bases de datos con PHP y Mysqli
 
Bases de datos con PHP y PDO
Bases de datos con PHP y PDOBases de datos con PHP y PDO
Bases de datos con PHP y PDO
 
Introducción a prototype javascript
Introducción a prototype javascriptIntroducción a prototype javascript
Introducción a prototype javascript
 
El Mal Odiado Javascript
El Mal Odiado JavascriptEl Mal Odiado Javascript
El Mal Odiado Javascript
 

Similar a BundlesSymfony

Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Ricard Luquero
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datosFernando Cejas
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2Mario IC
 
Andrés González Suárez - Acceso a FTP a través de usuarios almacenados en un ...
Andrés González Suárez - Acceso a FTP a través de usuarios almacenados en un ...Andrés González Suárez - Acceso a FTP a través de usuarios almacenados en un ...
Andrés González Suárez - Acceso a FTP a través de usuarios almacenados en un ...Andrés González Suárez
 
The original hacker Nro 1
The original hacker Nro 1The original hacker Nro 1
The original hacker Nro 1Jorge Brunal
 
Migrate, una herramienta de trabajo y desarrollo
Migrate, una herramienta de trabajo y desarrolloMigrate, una herramienta de trabajo y desarrollo
Migrate, una herramienta de trabajo y desarrolloYmbra
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladoresPedro Cambra
 
Guillermo victor instalacion_sakai_2_9_0_lms
Guillermo victor instalacion_sakai_2_9_0_lmsGuillermo victor instalacion_sakai_2_9_0_lms
Guillermo victor instalacion_sakai_2_9_0_lmsDavid Flores
 
44612647 guia-de-instalacion-de-cacti-probada-en-cent os-5-5
44612647 guia-de-instalacion-de-cacti-probada-en-cent os-5-544612647 guia-de-instalacion-de-cacti-probada-en-cent os-5-5
44612647 guia-de-instalacion-de-cacti-probada-en-cent os-5-5pablogarlandeira
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryJavier P.
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryJavier P.
 
Spring OSGI , dm server - Leonardo Torres Altez
Spring OSGI , dm server - Leonardo Torres AltezSpring OSGI , dm server - Leonardo Torres Altez
Spring OSGI , dm server - Leonardo Torres Alteza19987225
 
Laboratorio 3 Andres Moreno
Laboratorio 3 Andres MorenoLaboratorio 3 Andres Moreno
Laboratorio 3 Andres MorenoFelipe Moreno
 
Instalación y configuración de ldap server en Debian 8.7.1
Instalación y configuración de ldap server en Debian 8.7.1Instalación y configuración de ldap server en Debian 8.7.1
Instalación y configuración de ldap server en Debian 8.7.1Diego Montiel
 

Similar a BundlesSymfony (20)

Presentacion YII
Presentacion YIIPresentacion YII
Presentacion YII
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
Cómo domar SonataAdminBundle
Cómo domar SonataAdminBundleCómo domar SonataAdminBundle
Cómo domar SonataAdminBundle
 
Introducción a Kohana Framework
Introducción a Kohana FrameworkIntroducción a Kohana Framework
Introducción a Kohana Framework
 
Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!Php Bitter Sweet Symfony!
Php Bitter Sweet Symfony!
 
APIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptxAPIREST LARAVEL Y PHP.pptx
APIREST LARAVEL Y PHP.pptx
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datos
 
Taller introduccion symfony2
Taller introduccion symfony2Taller introduccion symfony2
Taller introduccion symfony2
 
Andrés González Suárez - Acceso a FTP a través de usuarios almacenados en un ...
Andrés González Suárez - Acceso a FTP a través de usuarios almacenados en un ...Andrés González Suárez - Acceso a FTP a través de usuarios almacenados en un ...
Andrés González Suárez - Acceso a FTP a través de usuarios almacenados en un ...
 
The original hacker Nro 1
The original hacker Nro 1The original hacker Nro 1
The original hacker Nro 1
 
Migrate, una herramienta de trabajo y desarrollo
Migrate, una herramienta de trabajo y desarrolloMigrate, una herramienta de trabajo y desarrollo
Migrate, una herramienta de trabajo y desarrollo
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 
Guillermo victor instalacion_sakai_2_9_0_lms
Guillermo victor instalacion_sakai_2_9_0_lmsGuillermo victor instalacion_sakai_2_9_0_lms
Guillermo victor instalacion_sakai_2_9_0_lms
 
44612647 guia-de-instalacion-de-cacti-probada-en-cent os-5-5
44612647 guia-de-instalacion-de-cacti-probada-en-cent os-5-544612647 guia-de-instalacion-de-cacti-probada-en-cent os-5-5
44612647 guia-de-instalacion-de-cacti-probada-en-cent os-5-5
 
Desarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQueryDesarrollando aplicaciones web usando Catalyst y jQuery
Desarrollando aplicaciones web usando Catalyst y jQuery
 
9.laravel
9.laravel9.laravel
9.laravel
 
Desarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQueryDesarrollo de aplicaciones web usando Catalyst y jQuery
Desarrollo de aplicaciones web usando Catalyst y jQuery
 
Spring OSGI , dm server - Leonardo Torres Altez
Spring OSGI , dm server - Leonardo Torres AltezSpring OSGI , dm server - Leonardo Torres Altez
Spring OSGI , dm server - Leonardo Torres Altez
 
Laboratorio 3 Andres Moreno
Laboratorio 3 Andres MorenoLaboratorio 3 Andres Moreno
Laboratorio 3 Andres Moreno
 
Instalación y configuración de ldap server en Debian 8.7.1
Instalación y configuración de ldap server en Debian 8.7.1Instalación y configuración de ldap server en Debian 8.7.1
Instalación y configuración de ldap server en Debian 8.7.1
 

Más de hydras_cs

Clase 15 FOS
Clase 15 FOSClase 15 FOS
Clase 15 FOShydras_cs
 
Clase 11 continuamos con formularios
Clase 11   continuamos con formulariosClase 11   continuamos con formularios
Clase 11 continuamos con formularioshydras_cs
 
Clase 7 el modelo
Clase 7  el modeloClase 7  el modelo
Clase 7 el modelohydras_cs
 
Clase 6 twig
Clase 6 twigClase 6 twig
Clase 6 twighydras_cs
 
Clase 4 routing
Clase 4 routingClase 4 routing
Clase 4 routinghydras_cs
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasoshydras_cs
 
Sensio labsdesktop
Sensio labsdesktopSensio labsdesktop
Sensio labsdesktophydras_cs
 
Clase 1 introducción a symfony 2
Clase 1   introducción a symfony 2Clase 1   introducción a symfony 2
Clase 1 introducción a symfony 2hydras_cs
 

Más de hydras_cs (8)

Clase 15 FOS
Clase 15 FOSClase 15 FOS
Clase 15 FOS
 
Clase 11 continuamos con formularios
Clase 11   continuamos con formulariosClase 11   continuamos con formularios
Clase 11 continuamos con formularios
 
Clase 7 el modelo
Clase 7  el modeloClase 7  el modelo
Clase 7 el modelo
 
Clase 6 twig
Clase 6 twigClase 6 twig
Clase 6 twig
 
Clase 4 routing
Clase 4 routingClase 4 routing
Clase 4 routing
 
Clase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasosClase 3 instalación y primeros pasos
Clase 3 instalación y primeros pasos
 
Sensio labsdesktop
Sensio labsdesktopSensio labsdesktop
Sensio labsdesktop
 
Clase 1 introducción a symfony 2
Clase 1   introducción a symfony 2Clase 1   introducción a symfony 2
Clase 1 introducción a symfony 2
 

BundlesSymfony

  • 1. Bundles útiles: SonataBundle JsRoutingBundle DoctrineFixturesBundle Realizada por: Christian Aquino |@cj_aquino Diego Ramirez |@thedarsideofit Gonzalo Alonso |@GonzaloAlonsoD Diego Barros |@Inmzombie Para: Hydras C&S |@hydras_cs Basada en Libro Symfony 2 en español Nacho Pacheco y The Book
  • 2. ¿Que es Sonata? Sonata fue creado por el entusiasta symfonyano Thomas Rabaix. La meta del proyecto Sonata es proveer una solución e-commerce basado en Sf2. Pensado como un conjunto de herramientas para hacer e-commerce de una manera fácil. ● Admin Bundle : Un bundle para generar una interface robusta y amistosa para el usuario. ● Media Bundle : Un bundle para manejar datos multimedia, la multimedia se refiere a archivos, videos,imagenes. ● Page Bundle : Un bundle para transformar las acciones de Sf2 en un CMS.
  • 3. Instalando y configurando Añadir lo siguiente a tu archivo composer.json: $ php composer.phar update { "require": { ... "sonata-project/admin-bundle": "dev-master", "friendsofsymfony/user-bundle": "dev-master", "sonata-project/user-bundle": "dev-master", "sonata-project/doctrine-orm-admin-bundle": "dev-master" ... } }
  • 4. Registramos los bundles en app/AppKernel.php // ... public function registerBundles() { $bundles = array( // ... new FOSUserBundleFOSUserBundle(), new SonatajQueryBundleSonatajQueryBundle(), new SonataAdminBundleSonataAdminBundle(), new SonataBlockBundleSonataBlockBundle(), new SonataDoctrineORMAdminBundleSonataDoctrineORMAdminBundle(), new KnpBundleMenuBundleKnpMenuBundle(), new SonataUserBundleSonataUserBundle('FOSUserBundle'), new SonataEasyExtendsBundleSonataEasyExtendsBundle(), // ... ); // ... }
  • 5. Editar los archivos config.yml, security.yml según la configuración definida en: http://blog.dayo.fr/2012/12/symfony2-1-sonata-admin- sonata-user-fos-userbundle-en/
  • 6. Listado de campos: <?php namespace SonataNewsBundleAdmin; use SonataAdminBundleAdminAdmin; use SonataAdminBundleFormFormMapper; use SonataAdminBundleDatagridDatagridMapper; use SonataAdminBundleDatagridListMapper; use SonataAdminBundleShowShowMapper; class PostAdmin extends Admin { protected function configureListFields (ListMapper $listMapper ) { $listMapper ->addIdentifier ('title') ->add('author') ->add('enabled') ->add('tags') ->add('commentsEnabled' ) // add custom action links ->add('_action', 'actions', array( 'actions' => array( 'view' => array(), 'edit' => array(),) )); } }
  • 7. Tipos disponibles: ● boolean ● datetime ● decimal ● identifier ● integer ● many_to_one : a link will be added to the related edit action ● string ● text ● date ● time
  • 8. Acciones en el listado: <?php $listMapper ->add('_action', 'actions', array( 'actions' => array( 'view' => array(), 'edit' => array(), ) )) Podemos editar y quitar las acciones. Podemos especificar las templates de renderizado <?php $listMapper ->add('_action', 'actions', array( 'actions' => array( 'view' => array(), 'edit' => array(), 'delete' => array('template' => 'MyBundle:MyController:my_partial.html.twig' ), ) ))
  • 9. Mostrar sub entidades: <?php namespace AcmeAcmeBundleAdmin; use SonataAdminBundleAdminAdmin; use SonataAdminBundleFormFormMapper; use SonataAdminBundleDatagridDatagridMapper; use SonataAdminBundleDatagridListMapper; use SonataAdminBundleShowShowMapper; class UserAdmin extends Admin { protected function configureListFields (ListMapper $listMapper ) { $listMapper ->addIdentifier ('id') ->addIdentifier ('firstName' ) ->addIdentifier ('lastName') ->addIdentifier ('address.street' ) ->addIdentifier ('address.ZIPCode' ) ->addIdentifier ('address.town' ) ; } }
  • 10. Personalizando Templates <?php namespace SonataMediaBundleAdmin; use SonataAdminBundleAdminAdmin; use SonataAdminBundleFormFormMapper; use SonataAdminBundleDatagridDatagridMapper; use SonataAdminBundleDatagridListMapper; use SonataAdminBundleShowShowMapper; class MediaAdmin extends Admin { protected function configureListFields (ListMapper $listMapper ) { $listMapper ->addIdentifier ('id') ->add('image', 'string', array('template' => 'SonataMediaBundle:MediaAdmin:list_image.html.twig' ) ->add('custom', 'string', array('template' => 'SonataMediaBundle:MediaAdmin:list_custom.html.twig' ; } }
  • 11. {% extends 'SonataAdminBundle:CRUD:base_list_field.html.twig' %} {% block field%} <div> <strong> {{ object.name }}</strong> <br /> {{ object.providername }} : {{ object.width }}x{{ object.height }} <br /> </div> {% endblock %} La template quedaría:
  • 12. Redefinir el controlador CRUD <?php // src/Tutorial/BlogBundle/Controller/CommentAdminController.php namespace TutorialBlogBundleController; use SonataAdminBundleControllerCRUDController as Controller; class CommentAdminController extends Controller { }
  • 13. DoctrineFixturesBundle Los accesorios se utilizan para cargar en una base de datos un juego de datos controlado. Puedes utilizar estos datos para pruebas o podrían ser los datos iniciales necesarios para ejecutar la aplicación sin problemas. Symfony2 no tiene integrada forma alguna de administrar accesorios, pero Doctrine2 cuenta con una biblioteca para ayudarte a escribir accesorios para el ORM u ODM de Doctrine.
  • 14. Instalando y configurando Añadir lo siguiente a tu archivo composer.json: { "require": { "doctrine/doctrine-fixtures-bundle": "dev- master" } } $ php composer.phar update Actualizar el composer
  • 15. Por último, registramos el paquete DoctrineFixturesBundle en app/AppKernel.php // ... public function registerBundles() { $bundles = array( // ... new DoctrineBundleFixturesBundleDoctrineFixturesBundle(), // ... ); // ... }
  • 16. Escribiendo fixtures: Los fixtures de Doctrine2 son clases PHP que pueden crear y persistir objetos a la base de datos. Al igual que todas las clases en Symfony2, los fixtures deben estar alojado dentro de uno de los paquetes de tu aplicación. Para un paquete situado en src/Acme/HelloBundle, las clasesed los fixtures deben estar dentro de src/Acme/HelloBundle/DataFixtures/ORM o src/Acme/HelloBundle/DataFixtures/MongoDB, para ORM y ODM respectivamente, esta guía asume que estás utilizando el ORM — pero, los accesorios se pueden agregar con la misma facilidad si estás utilizando ODM.
  • 17. // src/Acme/HelloBundle/DataFixtures/ORM/LoadUserData.php namespace AcmeHelloBundleDataFixturesORM; use DoctrineCommonDataFixturesFixtureInterface; use DoctrineCommonPersistenceObjectManager; use AcmeHelloBundleEntityUser; class LoadUserData implements FixtureInterface { /** * {@inheritDoc} */ public function load(ObjectManager $manager) { $userAdmin = new User(); $userAdmin->setUsername('admin'); $userAdmin->setPassword('test'); $manager->persist($userAdmin); $manager->flush(); } }
  • 18. Cargando los fixtures php app/console doctrine:fixtures:load php app/console doctrine:mongodb:fixtures:load La tarea buscará dentro del directorio DataFixtures/ORM (o DataFixtures/MongoDB paraODM) de cada paquete y ejecutará cada clase que implemente la FixtureInterface. Ambas órdenes vienen con unas cuantas opciones: ● --fixtures=/ruta/al/accesorio — Usa esta opción para especificar manualmente el directorio de donde se deben cargar las clases accesorio; ● --append — Utiliza esta opción para añadir datos en lugar de eliminarlos antes de cargarlos (borrar primero es el comportamiento predeterminado); ● --em=manager_name — Especifica manualmente el gestor de la entidad a utilizar para cargar los datos.
  • 19. Compartiendo objetos entre fixtures Si tenemos varias clases de fixtures y queremos referir a los datos cargados en otras clases. Deberemos. // src/Acme/HelloBundle/DataFixtures/ORM/LoadUserData.php namespace AcmeHelloBundleDataFixturesORM; use DoctrineCommonDataFixturesAbstractFixture; use DoctrineCommonDataFixturesOrderedFixtureInterface; use DoctrineCommonPersistenceObjectManager; use AcmeHelloBundleEntityUser; class LoadUserData extends AbstractFixture implements OrderedFixtureInterface { public function load(ObjectManager $manager) { $userAdmin = new User(); $userAdmin->setUsername('admin'); $userAdmin->setPassword('test'); $manager->persist($userAdmin); $manager->flush(); $this->addReference('admin-user', $userAdmin); } public function getOrder() { return 1; // el orden en el cual serán cargados los accesorios
  • 20. // src/Acme/HelloBundle/DataFixtures/ORM/LoadUserGroupData.php namespace AcmeHelloBundleDataFixturesORM; use DoctrineCommonDataFixturesAbstractFixture; use DoctrineCommonDataFixturesOrderedFixtureInterface; use DoctrineCommonPersistenceObjectManager; use AcmeHelloBundleEntityUserGroup; class LoadUserGroupData extends AbstractFixture implements OrderedFixtureInterface { public function load(ObjectManager $manager) { $userGroupAdmin = new UserGroup(); $userGroupAdmin->setUser($this->getReference('admin-user')); $userGroupAdmin->setGroup($this->getReference('admin-group')); $manager->persist($userGroupAdmin); $manager->flush(); } public function getOrder() { return 3; } }
  • 21. Los fixtures ahora se ejecutan en orden ascendente del valor devuelto por getOrder(). Cualquier objeto que se establece con el método setReference() se puede acceder a través de getReference() en las clases accesorio que tienen un orden superior.
  • 22. JsRoutingBundle: Instalando y configurando Añadir lo siguiente a tu archivo composer.json: { "require": { "friendsofsymfony/jsrouting-bundle": "dev- master" } } $ php composer.phar update friendsofsymfony/jsrouting-bundle Actualizar el composer
  • 23. Registramos en el app/AppKernel.php // ... public function registerBundles() { $bundles = array( // ... new FOSJsRoutingBundleFOSJsRoutingBundle(), // ... ); // ... }
  • 24. # app/config/routing.yml fos_js_routing: resource: "@FOSJsRoutingBundle/Resources/config/routing/routing.xml" $ php app/console assets:install --symlink web Agregamos las siguientes líneas que apuntan al javascript edl bundle <script src="{{ asset('bundles/fosjsrouting/js/router.js') }}"></script> <script src="{{ path('fos_js_routing_js', {"callback": "fos.Router.setData"}) }}"></script> Para usar agregamos en donde se debe especificar la url: Routing.generate('route_id', /* your params */).
  • 25. Ejemplo de routing # app/config/routing.yml my_route_to_expose: pattern: /foo/{id}/bar defaults: { _controller: HelloBundle:Hello:index } options: expose: true my_route_to_expose_with_defaults: pattern: /blog/{page} defaults: { _controller: AcmeBlogBundle:Blog:index, page: 1 } options: expose: true
  • 26. Routing.generate('my_route_to_expose', { id: 10 }); // will result in /foo/10/bar Routing.generate('my_route_to_expose', { id: 10, foo: "bar" }); // will result in /foo/10/bar?foo=bar $.get(Routing.generate('my_route_to_expose', { id: 10, foo: "bar" })); // will call /foo/10/bar?foo=bar Routing.generate('my_route_to_expose_with_defaults'); // will result in /blog/1 Routing.generate('my_route_to_expose_with_defaults', { id: 2 }); // will result in /blog/2 Routing.generate('my_route_to_expose_with_defaults', { foo: "bar" }); // will result in /blog/1?foo=bar Routing.generate('my_route_to_expose_with_defaults', { id: 2, foo: "bar" }); // will result in /blog/2?foo=bar