Symfony 2 CMF

Post on 05-Dec-2014

4.915 views 3 download

description

Presentación del Symfony 2 CMF para deSymfony 2012

Transcript of Symfony 2 CMF

Por qué

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

Python community 2010

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

PHP community, 2010

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

Symfony2 al rescate

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

Un entorno común

Text

Los componentes de Symfony2 son

genéricos

pero Internet está llena de contenido

Los componentes de Symfony2 son

genéricos

pero Internet está llena de contenido

Drupal está muy bien

si eres un usuario

Drupal está muy bien

si eres un usuario

Vamos a intentarlo

¿TinyMCE y a correr?

No, a lo loco

Queremos...

Estructura en árbol

Queremos...

Estructura en árbol

Documentos sin estructura

Queremos...

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Queremos...

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Queremos...

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

Queremos...

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Queremos...

Estructura en árbol

Documentos sin estructura

Querys para el árbol

Fulltext

Usable en hosting compartido...

...pero escalable

Que sea un estándar

Queremos...

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...

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...

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...

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...

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...

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...

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...

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...

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...

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...

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

¿Cuánto tardaremos en hacer esa animalada?

Ya está hecha(O casi)

Componentes

PHPCRel estándar

API estándar

JCR “phpizado”

Estructura

Estructura

Estructura

Estructura

Estructurapaths

Estructurapathsnode types

Estructurapathsnode typesmixins

Estructurapaths

{node typesmixinspropiedades

titletextjcr:createdphpcr:class

STRINGURLBOOLEANLONGDOUBLEDECIMAL

BINARYDATENAMEPATHWEAKREFERENCEREFERENCE

Tipos de propiedades

STRINGURLBOOLEANLONGDOUBLEDECIMAL

BINARYDATENAMEPATHWEAKREFERENCEREFERENCE

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

CRUD

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

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

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

// Eliminar$node->remove();

Guardar las modificaciones

$session->save();

Obtener hijos

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

Obtener hijos filtrando

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

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

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

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

Implementaciones

(estándar)

DoctrinePHPCR-ODM

el object document mapper

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;

}

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;

Ya conoces la interfaz

CRUD

Ya conoces la interfaz

CRUD

Versiones con ODM

// @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);

Las versiones tienen mucha tela

Pero si la ignoras no te hace daño

Las versiones tienen mucha tela

Pero si la ignoras no te hace daño

Traducciones con ODM

/** @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

Crear traducción

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

Obtener traducción

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

¿A qué lenguas está traducido?

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

MultilangContentBundle

Documentos base para contenido, rutas y menús

Selector de lengua

Las traducciones se almacenan en nodos hijo

Rutas

El problema

El usuario quiere definir sus urls

Y quiere unos cientos de miles

Solucionado!

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

Solucionado!

DynamicRouter

Las rutas son documentos en la BD

La ruta puede especificar un controlador...

...o usar uno por defecto

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

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

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

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

ChainRouter

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

¡Más!

MenuBundle, MultilangContentBundle

BlockBundle

PhpcrAdminBundle

En resumen...

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

Gracias

Nacho Martín

nacho@limenius.com

@nacmartin