clase 14 bundles útiles

26
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

Upload: hydrascs

Post on 13-Jan-2015

711 views

Category:

Documents


1 download

DESCRIPTION

www.hydrascs.com

TRANSCRIPT

Page 1: Clase 14 bundles útiles

Bundles útiles:SonataBundleJsRoutingBundleDoctrineFixturesBundle

Realizada por:Christian Aquino |@cj_aquinoDiego Ramirez |@thedarsideofitGonzalo Alonso |@GonzaloAlonsoDDiego Barros |@Inmzombie

Para: Hydras C&S |@hydras_csBasada en Libro Symfony 2 en español Nacho Pacheco y The Book

Page 3: Clase 14 bundles útiles

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"

...}

}

Page 4: Clase 14 bundles útiles

Registramos los bundles en app/AppKernel.php

// ...public function registerBundles(){ $bundles = array( // ... new FOS\UserBundle\FOSUserBundle(),

new Sonata\jQueryBundle\SonatajQueryBundle(),new Sonata\AdminBundle\SonataAdminBundle(),new Sonata\BlockBundle\SonataBlockBundle(),new Sonata\DoctrineORMAdminBundle\SonataDoctrineORMAdminBundle(),new Knp\Bundle\MenuBundle\KnpMenuBundle(),new Sonata\UserBundle\SonataUserBundle('FOSUserBundle'),new Sonata\EasyExtendsBundle\SonataEasyExtendsBundle(),

// ... ); // ...}

Page 6: Clase 14 bundles útiles

Listado de campos:<?php

namespace Sonata\NewsBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;

use Sonata\AdminBundle\Form\FormMapper;

use Sonata\AdminBundle\Datagrid\DatagridMapper;

use Sonata\AdminBundle\Datagrid\ListMapper;

use Sonata\AdminBundle\Show\ShowMapper;

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(),)

));

}

}

Page 7: Clase 14 bundles útiles

Tipos disponibles:

● boolean● datetime● decimal● identifier● integer● many_to_one : a link will be added to the related edit action● string● text● date● time

Page 8: Clase 14 bundles útiles

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' ),

)

))

Page 9: Clase 14 bundles útiles

Mostrar sub entidades:

<?php

namespace Acme\AcmeBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;

use Sonata\AdminBundle\Form\FormMapper;

use Sonata\AdminBundle\Datagrid\DatagridMapper;

use Sonata\AdminBundle\Datagrid\ListMapper;

use Sonata\AdminBundle\Show\ShowMapper;

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' )

;

}

}

Page 10: Clase 14 bundles útiles

Personalizando Templates

<?php

namespace Sonata\MediaBundle\Admin;

use Sonata\AdminBundle\Admin\Admin;

use Sonata\AdminBundle\Form\FormMapper;

use Sonata\AdminBundle\Datagrid\DatagridMapper;

use Sonata\AdminBundle\Datagrid\ListMapper;

use Sonata\AdminBundle\Show\ShowMapper;

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' ))

;

}

}

Page 11: Clase 14 bundles útiles

{% 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:

Page 12: Clase 14 bundles útiles

Redefinir el controlador CRUD

<?php

// src/Tutorial/BlogBundle/Controller/CommentAdminController.php

namespace Tutorial\BlogBundle\Controller;

use Sonata\AdminBundle\Controller\CRUDController as Controller;

class CommentAdminController extends Controller

{

}

Page 13: Clase 14 bundles útiles

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.

Page 14: Clase 14 bundles útiles

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

Page 15: Clase 14 bundles útiles

Por último, registramos el paquete DoctrineFixturesBundle en app/AppKernel.php

// ...public function registerBundles(){ $bundles = array( // ... new Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle(), // ... ); // ...}

Page 16: Clase 14 bundles útiles

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.

Page 17: Clase 14 bundles útiles

// src/Acme/HelloBundle/DataFixtures/ORM/LoadUserData.phpnamespace Acme\HelloBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\FixtureInterface;use Doctrine\Common\Persistence\ObjectManager;use Acme\HelloBundle\Entity\User;

class LoadUserData implements FixtureInterface{ /** * {@inheritDoc} */ public function load(ObjectManager $manager) { $userAdmin = new User(); $userAdmin->setUsername('admin'); $userAdmin->setPassword('test');

$manager->persist($userAdmin); $manager->flush(); }}

Page 18: Clase 14 bundles útiles

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.

Page 19: Clase 14 bundles útiles

Compartiendo objetos entre fixturesSi tenemos varias clases de fixtures y queremos referir a los datos cargados en otras clases. Deberemos.

// src/Acme/HelloBundle/DataFixtures/ORM/LoadUserData.phpnamespace Acme\HelloBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;use Doctrine\Common\DataFixtures\OrderedFixtureInterface;use Doctrine\Common\Persistence\ObjectManager;use Acme\HelloBundle\Entity\User;

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 }

Page 20: Clase 14 bundles útiles

// src/Acme/HelloBundle/DataFixtures/ORM/LoadUserGroupData.php

namespace Acme\HelloBundle\DataFixtures\ORM;

use Doctrine\Common\DataFixtures\AbstractFixture;use Doctrine\Common\DataFixtures\OrderedFixtureInterface;use Doctrine\Common\Persistence\ObjectManager;use Acme\HelloBundle\Entity\UserGroup;

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; }}

Page 21: Clase 14 bundles útiles

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.

Page 22: Clase 14 bundles útiles

JsRoutingBundle:

Instalando y configurandoAñadir lo siguiente a tu archivo composer.json:

{

"require": {

"friendsofsymfony/jsrouting-bundle": "dev-

master"

}

}

$ php composer.phar update friendsofsymfony/jsrouting-bundle

Actualizar el composer

Page 23: Clase 14 bundles útiles

Registramos en el app/AppKernel.php

// ...

public function registerBundles()

{

$bundles = array(

// ...

new FOS\JsRoutingBundle\FOSJsRoutingBundle(),

// ... ); // ...}

Page 24: Clase 14 bundles útiles

# 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 */).

Page 25: Clase 14 bundles útiles

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

Page 26: Clase 14 bundles útiles

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