Se ha denunciado esta presentación.
Utilizamos tu perfil de LinkedIn y tus datos de actividad para personalizar los anuncios y mostrarte publicidad más relevante. Puedes cambiar tus preferencias de publicidad en cualquier momento.
Por qué
Python community 2010             http://www.flickr.com/photos/27734462@N00/4456118597
PHP community, 2010           http://www.flickr.com/photos/27734462@N00/4456830956
http://www.flickr.com/photos/57768341@N00/3387704295
Symfony2 al rescate              http://www.flickr.com/photos/18597080@N04/2566928348
Un entorno común            http://www.flickr.com/photos/61414741@N00/77346889Text
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...
Queremos...Estructura en árbol
Queremos...Estructura en árbolDocumentos sinestructura
Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbol
Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbolFulltext
Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbolFulltextUsable en hostingcompartido...
Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbolFulltextUsable en hostingcompartido......pero es...
Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbolFulltextUsable en hostingcompartido......pero es...
Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbolFulltextUsable en hostingcompartido......pero es...
Queremos...Estructura en árbol    VersionableDocumentos sinestructuraQuerys para el árbolFulltextUsable en hostingcomparti...
Queremos...Estructura en árbol    VersionableDocumentos sin         TraducibleestructuraQuerys para el árbolFulltextUsable...
Queremos...Estructura en árbol    VersionableDocumentos sin         Traducibleestructura                       Rutas edita...
Queremos...Estructura en árbol    VersionableDocumentos sin         Traducibleestructura                       Rutas edita...
Queremos...Estructura en árbol    VersionableDocumentos sin         Traducibleestructura                       Rutas edita...
Queremos...Estructura en árbol    VersionableDocumentos sin         Traducibleestructura                       Rutas edita...
Queremos...Estructura en árbol    VersionableDocumentos sin         Traducibleestructura                       Rutas edita...
Queremos...Estructura en árbol    VersionableDocumentos sin         Traducibleestructura                       Rutas edita...
Queremos...Estructura en árbol    VersionableDocumentos sin         Traducibleestructura                       Rutas edita...
¿Cuánto tardaremos en hacer esa           animalada?                     http://www.flickr.com/photos/83476873@N00/110993877
Ya está hecha    (O casi)
Componentes
PHPCRel estándar
API estándarJCR “phpizado”
Estructura
Estructura
Estructura
Estructura
Estructurapaths
Estructuranodepaths types
Estructuramixinsnodepaths types
Estructuramixinsnodepaths typespropiedades     {         title         text         jcr:created         phpcr:class
STRING    BINARYURL       DATEBOOLEAN   NAMELONG      PATHDOUBLE    WEAKREFERENCEDECIMAL   REFERENCE
Tipos de propiedadesSTRING    BINARYURL       DATEBOOLEAN   NAMELONG      PATHDOUBLE    WEAKREFERENCEDECIMAL   REFERENCE
Conexiónuse JackalopeRepositoryFactoryJackrabbit as Factory;$parameters = array(    jackalope.jackrabbit_uri        => htt...
CRUD// Crear$root = $session->getRootNode();$node = $root->addNode(test, nt:unstructured);// Leer$node = $session->getNode...
Guardar las modificaciones      $session->save();
Obtener hijosforeach ($node as $child) {    var_dump($child->getName());}
Obtener hijos filtrandoforeach ($node->getNodes(di*) as $child) {    var_dump($child->getName());}
Consultas en SQL2$qm = $workspace->getQueryManager();$sql = "SELECT * FROM [nt:unstructured]    WHERE [nt:unstructured].ty...
Consultas con QOM$qm = $workspace->getQueryManager();$factory = $qm->getQOMFactory();// SELECT * FROM nt:file INNER JOIN n...
Consultas con interfaz fluida$qm = $workspace->getQueryManager();$factory = $qm->getQOMFactory();// SELECT * FROM nt:unstru...
Implementaciones   (estándar)
DoctrinePHPCR-ODMel object document mapper
Documentosnamespace Foo;use DoctrineODMPHPCRMapping as PHPCR;/** @PHPCRDocument */class Bar{  /** @PHPCRId */  public $id;...
Referencias/** * Hijo con nombre "el-logo" * @PHPCRChild(name="el-logo") */public $logo;/** * Hijos que empiecen con "a" *...
CRUDYa conoces la   interfaz
CRUDYa conoces la   interfaz
Versiones con ODM
// @Document(versionable="simple")$document = $dm->find(null, $id);// crear versión$dm->checkpoint($document);// obtener ú...
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
Documentos multilingües/** @PHPCRDocument(translator="attribute") */class Article{    /**     * The language this document...
Crear traducción$article = new Article();$article->topic = hola;$dm->persist($article);$dm->bindTranslation($article, es);...
Obtener traducción$article = $dm->findTranslation(null, /test, es);
¿A qué lenguas está traducido?$locales = $dm->getLocalesFor($article);
MultilangContentBundleDocumentos base para contenido, rutas ymenúsSelector de lenguaLas traducciones se almacenan en nodos...
Rutas
El problemaEl usuario quiere definir sus urlsY quiere unos cientos de miles
Solucionado!navigation:    pattern: "/{url}"    defaults: { _controller: service.controller:indexAction }    requirements:...
Solucionado!
DynamicRouterLas rutas son documentos en la BDLa ruta puede especificar un controlador......o usar uno por defecto
DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alia...
DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alia...
DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alia...
DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alia...
ChainRoutersymfony_cmf_routing_extra:    chain:        routers_by_id:            symfony_cmf_routing_extra.dynamic_router:...
¡Más!
MenuBundle, MultilangContentBundle
BlockBundle
PhpcrAdminBundle
En resumen...
Participa    adou600 (Adrien Nicolet)                •   lapistano (Bastian Feder)•   beberlei (Benjamin Eberlei)         ...
GraciasNacho Martínnacho@limenius.com@nacmartin
Symfony 2 CMF
Symfony 2 CMF
Symfony 2 CMF
Symfony 2 CMF
Symfony 2 CMF
Symfony 2 CMF
Symfony 2 CMF
Symfony 2 CMF
Symfony 2 CMF
Symfony 2 CMF
Symfony 2 CMF
Próxima SlideShare
Cargando en…5
×

Symfony 2 CMF

Presentación del Symfony 2 CMF para deSymfony 2012

  • Sé el primero en comentar

Symfony 2 CMF

  1. 1. Por qué
  2. 2. Python community 2010 http://www.flickr.com/photos/27734462@N00/4456118597
  3. 3. PHP community, 2010 http://www.flickr.com/photos/27734462@N00/4456830956
  4. 4. http://www.flickr.com/photos/57768341@N00/3387704295
  5. 5. Symfony2 al rescate http://www.flickr.com/photos/18597080@N04/2566928348
  6. 6. Un entorno común http://www.flickr.com/photos/61414741@N00/77346889Text
  7. 7. http://www.flickr.com/photos/10209031@N08/4542049217
  8. 8. http://www.flickr.com/photos/38158467@N00/83109701
  9. 9. Text
  10. 10. Los componentes de Symfony2 son genéricos pero Internet estállena de contenido
  11. 11. Los componentes de Symfony2 son genéricos pero Internet estállena de contenido
  12. 12. Drupal está muy bien si eres un usuario
  13. 13. Drupal está muy bien si eres un usuario
  14. 14. Vamos a intentarlo
  15. 15. ¿TinyMCE y a correr?
  16. 16. No, a lo loco
  17. 17. Queremos...
  18. 18. Queremos...Estructura en árbol
  19. 19. Queremos...Estructura en árbolDocumentos sinestructura
  20. 20. Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbol
  21. 21. Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbolFulltext
  22. 22. Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbolFulltextUsable en hostingcompartido...
  23. 23. Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbolFulltextUsable en hostingcompartido......pero escalable
  24. 24. Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbolFulltextUsable en hostingcompartido......pero escalableQue sea un estándar
  25. 25. Queremos...Estructura en árbolDocumentos sinestructuraQuerys para el árbolFulltextUsable en hostingcompartido......pero escalableQue sea un estándar...y tenga variasimplementaciones!
  26. 26. Queremos...Estructura en árbol VersionableDocumentos sinestructuraQuerys para el árbolFulltextUsable en hostingcompartido......pero escalableQue sea un estándar...y tenga variasimplementaciones!
  27. 27. Queremos...Estructura en árbol VersionableDocumentos sin TraducibleestructuraQuerys para el árbolFulltextUsable en hostingcompartido......pero escalableQue sea un estándar...y tenga variasimplementaciones!
  28. 28. Queremos...Estructura en árbol VersionableDocumentos sin Traducibleestructura Rutas editablesQuerys para el árbolFulltextUsable en hostingcompartido......pero escalableQue sea un estándar...y tenga variasimplementaciones!
  29. 29. Queremos...Estructura en árbol VersionableDocumentos sin Traducibleestructura Rutas editablesQuerys para el árbol Miles de ellasFulltextUsable en hostingcompartido......pero escalableQue sea un estándar...y tenga variasimplementaciones!
  30. 30. Queremos...Estructura en árbol VersionableDocumentos sin Traducibleestructura Rutas editablesQuerys para el árbol Miles de ellasFulltext MenúsUsable en hostingcompartido......pero escalableQue sea un estándar...y tenga variasimplementaciones!
  31. 31. Queremos...Estructura en árbol VersionableDocumentos sin Traducibleestructura Rutas editablesQuerys para el árbol Miles de ellasFulltext MenúsUsable en hostingcompartido... ACL...pero escalableQue sea un estándar...y tenga variasimplementaciones!
  32. 32. Queremos...Estructura en árbol VersionableDocumentos sin Traducibleestructura Rutas editablesQuerys para el árbol Miles de ellasFulltext MenúsUsable en hostingcompartido... ACL...pero escalable Admin panelQue sea un estándar...y tenga variasimplementaciones!
  33. 33. Queremos...Estructura en árbol VersionableDocumentos sin Traducibleestructura Rutas editablesQuerys para el árbol Miles de ellasFulltext MenúsUsable en hostingcompartido... ACL...pero escalable Admin panelQue sea un estándar Editable inline...y tenga variasimplementaciones!
  34. 34. Queremos...Estructura en árbol VersionableDocumentos sin Traducibleestructura Rutas editablesQuerys para el árbol Miles de ellasFulltext MenúsUsable en hostingcompartido... ACL...pero escalable Admin panelQue sea un estándar Editable inline...y tenga varias Que no haga faltaimplementaciones! saberlo todo
  35. 35. ¿Cuánto tardaremos en hacer esa animalada? http://www.flickr.com/photos/83476873@N00/110993877
  36. 36. Ya está hecha (O casi)
  37. 37. Componentes
  38. 38. PHPCRel estándar
  39. 39. API estándarJCR “phpizado”
  40. 40. Estructura
  41. 41. Estructura
  42. 42. Estructura
  43. 43. Estructura
  44. 44. Estructurapaths
  45. 45. Estructuranodepaths types
  46. 46. Estructuramixinsnodepaths types
  47. 47. Estructuramixinsnodepaths typespropiedades { title text jcr:created phpcr:class
  48. 48. STRING BINARYURL DATEBOOLEAN NAMELONG PATHDOUBLE WEAKREFERENCEDECIMAL REFERENCE
  49. 49. Tipos de propiedadesSTRING BINARYURL DATEBOOLEAN NAMELONG PATHDOUBLE WEAKREFERENCEDECIMAL REFERENCE
  50. 50. Conexiónuse JackalopeRepositoryFactoryJackrabbit as Factory;$parameters = array( jackalope.jackrabbit_uri => http://localhost:8080/server);$repository = Factory::getRepository($parameters);$creds = new PHPCRSimpleCredentials(user,pw);$session = $repository->login($creds, default);
  51. 51. CRUD// Crear$root = $session->getRootNode();$node = $root->addNode(test, nt:unstructured);// Leer$node = $session->getNode(/test);// Actualizar$node->setProperty(prop, value);// Eliminar$node->remove();
  52. 52. Guardar las modificaciones $session->save();
  53. 53. Obtener hijosforeach ($node as $child) { var_dump($child->getName());}
  54. 54. Obtener hijos filtrandoforeach ($node->getNodes(di*) as $child) { var_dump($child->getName());}
  55. 55. 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());}
  56. 56. Consultas con QOM$qm = $workspace->getQueryManager();$factory = $qm->getQOMFactory();// SELECT * FROM nt:file INNER JOIN nt:folder ONISCHILDNODE(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());
  57. 57. Consultas con interfaz fluida$qm = $workspace->getQueryManager();$factory = $qm->getQOMFactory();// SELECT * FROM nt:unstructured WHERE name NOT ISNULL$qb = new QueryBuilder($factory);$qb->select($factory->selector(nt:unstructured)) ->where($factory->propertyExistence(name)) ->setFirstResult(10) ->setMaxResults(10) ->execute();
  58. 58. Implementaciones (estándar)
  59. 59. DoctrinePHPCR-ODMel object document mapper
  60. 60. Documentosnamespace Foo;use DoctrineODMPHPCRMapping as PHPCR;/** @PHPCRDocument */class Bar{ /** @PHPCRId */ public $id; /** * @PHPCRParentDocument */ public $parent; /** @PHPCRNodename */ public $nodename; /** @PHPCRString */ public $text;}
  61. 61. Referencias/** * Hijo con nombre "el-logo" * @PHPCRChild(name="el-logo") */public $logo;/** * Hijos que empiecen con "a" * @PHPCRChildren(filter="a*") */public $children;/** @PHPCRReferenceOne */public $reference;/** @PHPCRReferrers */public $referrers;
  62. 62. CRUDYa conoces la interfaz
  63. 63. CRUDYa conoces la interfaz
  64. 64. Versiones con ODM
  65. 65. // @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);
  66. 66. Las versiones tienen mucha tela Pero si la ignoras no te hace daño
  67. 67. Las versiones tienen mucha tela Pero si la ignoras no te hace daño
  68. 68. Traducciones con ODM
  69. 69. Documentos multilingües/** @PHPCRDocument(translator="attribute") */class Article{ /** * The language this document currently is in * @PHPCRLocale */ public $locale; /** * Untranslated property * @PHPCRDate */ public $publishDate; /** * Translated property * @PHPCRString(translated=true) */ public $topic; /** * Language specific image * @PHPCRBinary(translated=true) */ public $image;}
  70. 70. Crear traducción$article = new Article();$article->topic = hola;$dm->persist($article);$dm->bindTranslation($article, es);$dm->flush();
  71. 71. Obtener traducción$article = $dm->findTranslation(null, /test, es);
  72. 72. ¿A qué lenguas está traducido?$locales = $dm->getLocalesFor($article);
  73. 73. MultilangContentBundleDocumentos base para contenido, rutas ymenúsSelector de lenguaLas traducciones se almacenan en nodos hijo
  74. 74. Rutas
  75. 75. El problemaEl usuario quiere definir sus urlsY quiere unos cientos de miles
  76. 76. Solucionado!navigation: pattern: "/{url}" defaults: { _controller: service.controller:indexAction } requirements: url: .*
  77. 77. Solucionado!
  78. 78. DynamicRouterLas rutas son documentos en la BDLa ruta puede especificar un controlador......o usar uno por defecto
  79. 79. DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alias: sandbox_main.controller:aliasAction        controllers_by_class:            SandboxMainBundleDocumentDemoClassContent: sandbox_main.controller:classAction            SymfonyCmfBundleRoutingExtraBundleDocumentRedirectRoute: symfony_cmf_routing_extra.redirect_controller:redirectAction        templates_by_class:            SandboxMainBundleDocumentEditableStaticContent:SandboxMainBundle:EditableStaticContent:index.html.twig
  80. 80. DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alias: sandbox_main.controller:aliasAction        controllers_by_class:            SandboxMainBundleDocumentDemoClassContent: sandbox_main.controller:classAction            SymfonyCmfBundleRoutingExtraBundleDocumentRedirectRoute: symfony_cmf_routing_extra.redirect_controller:redirectAction        templates_by_class:            SandboxMainBundleDocumentEditableStaticContent:SandboxMainBundle:EditableStaticContent:index.html.twig
  81. 81. DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alias: sandbox_main.controller:aliasAction        controllers_by_class:            SandboxMainBundleDocumentDemoClassContent: sandbox_main.controller:classAction            SymfonyCmfBundleRoutingExtraBundleDocumentRedirectRoute: symfony_cmf_routing_extra.redirect_controller:redirectAction        templates_by_class:            SandboxMainBundleDocumentEditableStaticContent:SandboxMainBundle:EditableStaticContent:index.html.twig
  82. 82. DynamicRoutersymfony_cmf_routing_extra:    dynamic:        enabled: true        controllers_by_alias:            demo_alias: sandbox_main.controller:aliasAction        controllers_by_class:            SandboxMainBundleDocumentDemoClassContent: sandbox_main.controller:classAction            SymfonyCmfBundleRoutingExtraBundleDocumentRedirectRoute: symfony_cmf_routing_extra.redirect_controller:redirectAction        templates_by_class:            SandboxMainBundleDocumentEditableStaticContent:SandboxMainBundle:EditableStaticContent:index.html.twig
  83. 83. ChainRoutersymfony_cmf_routing_extra:    chain:        routers_by_id:            symfony_cmf_routing_extra.dynamic_router: 20            router.default: 100
  84. 84. ¡Más!
  85. 85. MenuBundle, MultilangContentBundle
  86. 86. BlockBundle
  87. 87. PhpcrAdminBundle
  88. 88. En resumen...
  89. 89. Participa adou600 (Adrien Nicolet) • lapistano (Bastian Feder)• beberlei (Benjamin Eberlei) • lsmith77 (Lukas K. Smith)• bergie (Henri Bergius) • micheleorselli (Michele Orselli)• brki (Brian King) • nacmartin (Nacho Martín)• chirimoya (Thomas Schedler) • nicam (Pascal Helfenstein)• chregu (Christian Stocker) • Ocramius (Marco Pivetta)• cordoval (Luis Cordova) • ornicar (Thibault Duplessis)• damz (Damien Tournoud) • piotras• dbu (David Buchmann) • pitpit (Damien Pitard)• dotZoki (Zoran) • robertlemke (Robert Lemke)• ebi (Tobias Ebnöther) • rndstr (Roland Schilter)• iambrosi (Ismael Ambrosi) • Seldaek (Jordi Boggiano)• jakuza (Jacopo Romei) • sixty-nine (Daniel Barsotti)• justinrainbow (Justin Rainbow) • uwej711 (Uwe Jäger)• k-fish (Karsten Dambekalns) • vedranzgela (Vedran Zgela)• krizon (Kristian Zondervan) • videlalvaro (Alvaro Videla) http://cmf.symfony.com #symfony-cmf IRC
  90. 90. GraciasNacho Martínnacho@limenius.com@nacmartin

×