Symfony 2 CMF

5,405 views

Published on

Presentación del Symfony 2 CMF para deSymfony 2012

Published in: Business, Technology
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
5,405
On SlideShare
0
From Embeds
0
Number of Embeds
3,500
Actions
Shares
0
Downloads
57
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

×