symfony 2 cmf

101

Upload: nacho-martin

Post on 05-Dec-2014

4.932 views

Category:

Business


3 download

DESCRIPTION

Presentación del Symfony 2 CMF para deSymfony 2012

TRANSCRIPT

Page 1: Symfony 2 CMF
Page 2: Symfony 2 CMF
Page 3: Symfony 2 CMF

Por qué

Page 4: Symfony 2 CMF

http://www.flickr.com/photos/27734462@N00/4456118597

Python community 2010

Page 5: Symfony 2 CMF

http://www.flickr.com/photos/27734462@N00/4456830956

PHP community, 2010

Page 7: Symfony 2 CMF

http://www.flickr.com/photos/18597080@N04/2566928348

Symfony2 al rescate

Page 8: Symfony 2 CMF
Page 9: Symfony 2 CMF

http://www.flickr.com/photos/61414741@N00/77346889Text

Un entorno común

Page 12: Symfony 2 CMF

Text

Page 13: Symfony 2 CMF

Los componentes de Symfony2 son

genéricos

pero Internet está llena de contenido

Page 14: Symfony 2 CMF

Los componentes de Symfony2 son

genéricos

pero Internet está llena de contenido

Page 15: Symfony 2 CMF

Drupal está muy bien

si eres un usuario

Page 16: Symfony 2 CMF

Drupal está muy bien

si eres un usuario

Page 17: Symfony 2 CMF

Vamos a intentarlo

Page 18: Symfony 2 CMF

¿TinyMCE y a correr?

Page 19: Symfony 2 CMF

No, a lo loco

Page 20: Symfony 2 CMF

Queremos...

Page 21: Symfony 2 CMF

Estructura en árbol

Queremos...

Page 22: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Queremos...

Page 23: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Queremos...

Page 24: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Queremos...

Page 25: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

Queremos...

Page 26: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Queremos...

Page 27: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

Queremos...

Page 28: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

...y tenga varias implementaciones!

Queremos...

Page 29: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

...y tenga varias implementaciones!

Versionable

Queremos...

Page 30: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

...y tenga varias implementaciones!

Versionable

Traducible

Queremos...

Page 31: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

...y tenga varias implementaciones!

Versionable

Traducible

Rutas editables

Queremos...

Page 32: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

...y tenga varias implementaciones!

Versionable

Traducible

Rutas editables

Miles de ellas

Queremos...

Page 33: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

...y tenga varias implementaciones!

Versionable

Traducible

Rutas editables

Miles de ellas

Menús

Queremos...

Page 34: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

...y tenga varias implementaciones!

Versionable

Traducible

Rutas editables

Miles de ellas

Menús

ACL

Queremos...

Page 35: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

...y tenga varias implementaciones!

Versionable

Traducible

Rutas editables

Miles de ellas

Menús

ACL

Admin panel

Queremos...

Page 36: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

...y tenga varias implementaciones!

Versionable

Traducible

Rutas editables

Miles de ellas

Menús

ACL

Admin panel

Editable inline

Queremos...

Page 37: Symfony 2 CMF

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

...y tenga varias implementaciones!

Versionable

Traducible

Rutas editables

Miles de ellas

Menús

ACL

Admin panel

Editable inline

Que no haga falta saberlo todo

Queremos...

Page 38: Symfony 2 CMF

http://www.flickr.com/photos/83476873@N00/110993877

¿Cuánto tardaremos en hacer esa animalada?

Page 39: Symfony 2 CMF

Ya está hecha(O casi)

Page 40: Symfony 2 CMF

Componentes

Page 41: Symfony 2 CMF

PHPCRel estándar

Page 42: Symfony 2 CMF
Page 43: Symfony 2 CMF

API estándar

JCR “phpizado”

Page 44: Symfony 2 CMF

Estructura

Page 45: Symfony 2 CMF

Estructura

Page 46: Symfony 2 CMF

Estructura

Page 47: Symfony 2 CMF

Estructura

Page 48: Symfony 2 CMF

Estructurapaths

Page 49: Symfony 2 CMF

Estructurapathsnode types

Page 50: Symfony 2 CMF

Estructurapathsnode typesmixins

Page 51: Symfony 2 CMF

Estructurapaths

{node typesmixinspropiedades

titletextjcr:createdphpcr:class

Page 52: Symfony 2 CMF

STRINGURLBOOLEANLONGDOUBLEDECIMAL

BINARYDATENAMEPATHWEAKREFERENCEREFERENCE

Page 53: Symfony 2 CMF

Tipos de propiedades

STRINGURLBOOLEANLONGDOUBLEDECIMAL

BINARYDATENAMEPATHWEAKREFERENCEREFERENCE

Page 54: Symfony 2 CMF
Page 55: Symfony 2 CMF

Conexión

use Jackalope\RepositoryFactoryJackrabbit as Factory;

$parameters = array( 'jackalope.jackrabbit_uri' => 'http://localhost:8080/server');

$repository = Factory::getRepository($parameters);

$creds = new \PHPCR\SimpleCredentials('user','pw');$session = $repository->login($creds, 'default');

Page 56: Symfony 2 CMF

CRUD

// Crear$root = $session->getRootNode();$node = $root->addNode('test', 'nt:unstructured');

// Leer$node = $session->getNode('/test');

// Actualizar$node->setProperty('prop', 'value');

// Eliminar$node->remove();

Page 57: Symfony 2 CMF

Guardar las modificaciones

$session->save();

Page 58: Symfony 2 CMF

Obtener hijos

foreach ($node as $child) { var_dump($child->getName());}

Page 59: Symfony 2 CMF

Obtener hijos filtrando

foreach ($node->getNodes('di*') as $child) { var_dump($child->getName());}

Page 60: Symfony 2 CMF

Consultas en SQL2

$qm = $workspace->getQueryManager();

$sql = "SELECT * FROM [nt:unstructured] WHERE [nt:unstructured].type = 'nav' AND ISDESCENDANTNODE('/some/path') ORDER BY score, [nt:unstructured].title";$query = $qm->createQuery($sql, 'JCR-SQL2');$query->setLimit($limit);$query->setOffset($offset);$queryResult = $query->execute();

foreach ($queryResult->getNodes() as $node) { var_dump($node->getPath());}

Page 61: Symfony 2 CMF

Consultas con QOM

$qm = $workspace->getQueryManager();$factory = $qm->getQOMFactory();

// SELECT * FROM nt:file INNER JOIN nt:folder ON ISCHILDNODE(child, parent)$factory->createQuery( $factory->join( $factory->selector('nt:file'), $factory->selector('nt:folder'), Constants::JCR_JOIN_TYPE_INNER, $factory->childNodeJoinCondition('child', 'parent')), null, array(), array());

Page 62: Symfony 2 CMF

Consultas con interfaz fluida

$qm = $workspace->getQueryManager();$factory = $qm->getQOMFactory();

// SELECT * FROM nt:unstructured WHERE name NOT IS NULL$qb = new QueryBuilder($factory);$qb->select($factory->selector('nt:unstructured')) ->where($factory->propertyExistence('name')) ->setFirstResult(10) ->setMaxResults(10) ->execute();

Page 63: Symfony 2 CMF

Implementaciones

(estándar)

Page 64: Symfony 2 CMF

DoctrinePHPCR-ODM

el object document mapper

Page 65: Symfony 2 CMF

Documentosnamespace Foo;

use Doctrine\ODM\PHPCR\Mapping as PHPCR;/** @PHPCR\Document */class Bar{ /** @PHPCR\Id */ public $id;

/** * @PHPCR\ParentDocument */ public $parent;

/** @PHPCR\Nodename */ public $nodename;

/** @PHPCR\String */ public $text;

}

Page 66: Symfony 2 CMF

Referencias

/** * Hijo con nombre "el-logo" * @PHPCR\Child(name="el-logo") */ public $logo;

/** * Hijos que empiecen con "a" * @PHPCR\Children(filter="a*") */ public $children;

/** @PHPCR\ReferenceOne */ public $reference;

/** @PHPCR\Referrers */ public $referrers;

Page 67: Symfony 2 CMF

Ya conoces la interfaz

CRUD

Page 68: Symfony 2 CMF

Ya conoces la interfaz

CRUD

Page 69: Symfony 2 CMF

Versiones con ODM

Page 70: Symfony 2 CMF

// @Document(versionable="simple")$document = $dm->find(null, $id);

// crear versión$dm->checkpoint($document);

// obtener últimas dos versiones$history = $dm->getAllLinearVersions($document, 2);

// obtener versión$version = reset($history);$pre = $dm->findVersionByName(null, $id, $version['versionname']);echo $pre->text;

// restablecer versión$dm->restoreVersion($pre, true);

//eliminar versión$dm->deleteVersion($pre2);

Page 71: Symfony 2 CMF

Las versiones tienen mucha tela

Pero si la ignoras no te hace daño

Page 72: Symfony 2 CMF

Las versiones tienen mucha tela

Pero si la ignoras no te hace daño

Page 73: Symfony 2 CMF

Traducciones con ODM

Page 74: Symfony 2 CMF

/** @PHPCR\Document(translator="attribute") */class Article{ /** * The language this document currently is in * @PHPCR\Locale */ public $locale;

/** * Untranslated property * @PHPCR\Date */ public $publishDate;

/** * Translated property * @PHPCR\String(translated=true) */

public $topic;

/** * Language specific image * @PHPCR\Binary(translated=true) */ public $image;}

Documentos multilingües

Page 75: Symfony 2 CMF

Crear traducción

$article = new Article();$article->topic = 'hola';$dm->persist($article);$dm->bindTranslation($article, 'es');$dm->flush();

Page 76: Symfony 2 CMF

Obtener traducción

$article = $dm->findTranslation(null, '/test', 'es');

Page 77: Symfony 2 CMF

¿A qué lenguas está traducido?

$locales = $dm->getLocalesFor($article);

Page 78: Symfony 2 CMF

MultilangContentBundle

Documentos base para contenido, rutas y menús

Selector de lengua

Las traducciones se almacenan en nodos hijo

Page 79: Symfony 2 CMF

Rutas

Page 80: Symfony 2 CMF

El problema

El usuario quiere definir sus urls

Y quiere unos cientos de miles

Page 81: Symfony 2 CMF

Solucionado!

navigation: pattern: "/{url}" defaults: { _controller: service.controller:indexAction } requirements: url: .*

Page 82: Symfony 2 CMF

Solucionado!

Page 83: Symfony 2 CMF

DynamicRouter

Las rutas son documentos en la BD

La ruta puede especificar un controlador...

...o usar uno por defecto

Page 84: Symfony 2 CMF

DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alias: sandbox_main.controller:aliasAction        controllers_by_class:            Sandbox\MainBundle\Document\DemoClassContent: \\ sandbox_main.controller:classAction

            Symfony\Cmf\Bundle\RoutingExtraBundle\Document\RedirectRoute: \\ symfony_cmf_routing_extra.redirect_controller:redirectAction

        templates_by_class:            Sandbox\MainBundle\Document\EditableStaticContent: SandboxMainBundle:EditableStaticContent:index.html.twig

Page 85: Symfony 2 CMF

DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alias: sandbox_main.controller:aliasAction        controllers_by_class:            Sandbox\MainBundle\Document\DemoClassContent: \\ sandbox_main.controller:classAction

            Symfony\Cmf\Bundle\RoutingExtraBundle\Document\RedirectRoute: \\ symfony_cmf_routing_extra.redirect_controller:redirectAction

        templates_by_class:            Sandbox\MainBundle\Document\EditableStaticContent: SandboxMainBundle:EditableStaticContent:index.html.twig

Page 86: Symfony 2 CMF

DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alias: sandbox_main.controller:aliasAction        controllers_by_class:            Sandbox\MainBundle\Document\DemoClassContent: \\ sandbox_main.controller:classAction

            Symfony\Cmf\Bundle\RoutingExtraBundle\Document\RedirectRoute: \\ symfony_cmf_routing_extra.redirect_controller:redirectAction

        templates_by_class:            Sandbox\MainBundle\Document\EditableStaticContent: SandboxMainBundle:EditableStaticContent:index.html.twig

Page 87: Symfony 2 CMF

DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alias: sandbox_main.controller:aliasAction        controllers_by_class:            Sandbox\MainBundle\Document\DemoClassContent: \\ sandbox_main.controller:classAction

            Symfony\Cmf\Bundle\RoutingExtraBundle\Document\RedirectRoute: \\ symfony_cmf_routing_extra.redirect_controller:redirectAction

        templates_by_class:            Sandbox\MainBundle\Document\EditableStaticContent: SandboxMainBundle:EditableStaticContent:index.html.twig

Page 88: Symfony 2 CMF

ChainRouter

symfony_cmf_routing_extra:    chain:        routers_by_id:            symfony_cmf_routing_extra.dynamic_router: 20            router.default: 100

Page 89: Symfony 2 CMF
Page 90: Symfony 2 CMF
Page 91: Symfony 2 CMF
Page 92: Symfony 2 CMF

¡Más!

Page 93: Symfony 2 CMF

MenuBundle, MultilangContentBundle

Page 94: Symfony 2 CMF
Page 95: Symfony 2 CMF

BlockBundle

Page 96: Symfony 2 CMF

PhpcrAdminBundle

Page 97: Symfony 2 CMF

En resumen...

Page 98: Symfony 2 CMF
Page 99: Symfony 2 CMF
Page 100: Symfony 2 CMF

adou600 (Adrien Nicolet) • beberlei (Benjamin Eberlei)• bergie (Henri Bergius)• brki (Brian King)• chirimoya (Thomas Schedler)• chregu (Christian Stocker)• cordoval (Luis Cordova)• damz (Damien Tournoud)• dbu (David Buchmann)• dotZoki (Zoran)• ebi (Tobias Ebnöther)• iambrosi (Ismael Ambrosi)• jakuza (Jacopo Romei)• justinrainbow (Justin Rainbow)• k-fish (Karsten Dambekalns)• krizon (Kristian Zondervan)

• lapistano (Bastian Feder)• lsmith77 (Lukas K. Smith)• micheleorselli (Michele Orselli)• nacmartin (Nacho Martín)• nicam (Pascal Helfenstein)• Ocramius (Marco Pivetta)• ornicar (Thibault Duplessis)• piotras• pitpit (Damien Pitard)• robertlemke (Robert Lemke)• rndstr (Roland Schilter)• Seldaek (Jordi Boggiano)• sixty-nine (Daniel Barsotti)• uwej711 (Uwe Jäger)• vedranzgela (Vedran Zgela)• videlalvaro (Alvaro Videla)

Participa

#symfony-cmf IRC

http://cmf.symfony.com