Symfony 2 CMF
-
Upload
nacho-martin -
Category
Business
-
view
4.915 -
download
3
description
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/57768341@N00/3387704295
http://www.flickr.com/photos/18597080@N04/2566928348
Symfony2 al rescate
http://www.flickr.com/photos/61414741@N00/77346889Text
Un entorno común
http://www.flickr.com/photos/10209031@N08/4542049217
http://www.flickr.com/photos/38158467@N00/83109701
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