Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Entidades en drupal 8

1,342 views

Published on

Presentación sobre Entidades en Drupal 8 realizada por Luis Ortiz Ramos en la Drupal Camp Spain 2017

Published in: Internet
  • Login to see the comments

  • Be the first to like this

Entidades en drupal 8

  1. 1. Entidades en Drupal 8 DrupalCamp Spain 2017
  2. 2. Luis Ortiz Ramos CTO de Atenea tech luis@ateneatech.com @luisortizramos
  3. 3. Somos expertos en Drupal desde 2007 Somos Siddharta, Oriol, Robert, David, Patricia, Xavi, Rubén y Luis. Trabajamos para La Vanguardia, Thermomix, Ayuntamiento de Barcelona, Bodegas Torres, Clínica Dexeus, Amnistía Internacional, Médicos Sin Fronteras, Infojobs, Estrella Damm, Greenpeace, Chupa Chups, la CUP… Estamos en Barcelona Puedes contactar con nosotros en hola@ateneatech.com
  4. 4. Dos tipos de entidades
  5. 5. Configuration entities: Views, Blocks, Image styles, Menus, Rols… Forman parte de CMI Se exportan en archivos Yaml Content entities
  6. 6. Historia
  7. 7. Drupal 3 y anteriores: solo nodos Drupal 4: flexinode Drupal 5: nodos con campos con Content Construction Kit Drupal 6: nodificamos todo con módulos contribuidos y añadimos campos con Content Construction Kit Drupal 7: entidades limitadas en core Drupal 8: ¡entidades completas en core!
  8. 8. ¿Qué es una entidad?
  9. 9. “Entities, in Drupal, are objects that are used for persistent storage of content and configuration information.” ̶ Entity API
  10. 10. “Loadable thingy, that can optionally be fieldable” ̶ Frando http://dgo.to/460320
  11. 11. Así que… ¿qué es una entidad?
  12. 12. A thingy … Una unidad de información estructurada: Un contenido Un usuario Un término de un vocabulario Otra estructura de datos que creemos
  13. 13. … loadable ... Dispone de un conjunto de funciones para gestionar la información: Funciones comunes para crear, leer, actualizar y borrar entidades Propiedades comunes Integración con Views y otros servicios
  14. 14. … and optionally fieldable Cada tipo de entidad tiene un conjunto de propiedades. Cada tipo de entidad puede tener subtipos llamados bundles. Podemos adjuntar un conjunto de campos diferenciados a cada uno.
  15. 15. Glosario
  16. 16. “contenido” es un tipo de entidad “artículo” es un tipo de contenido (un bundle) “Integración Continua y trabajo en equipo en Pantheon” es una entidad
  17. 17. Entidades relevantes en el núcleo de Drupal 8
  18. 18. Contenido Cada entidad de este tipo tiene: ID y UUID Idioma, Título Tipo Autor Estado de publicación, promovido a la página de inicio y al principio de las listas Fecha de creación y del último cambio
  19. 19. Usuario Cada entidad de este tipo tiene: ID y UUID Idioma Nombre Clave Correo electrónico Idioma predefinido y idioma predefinido de administración Zona horaria
  20. 20. Bloques personalizados Cada entidad de este tipo tiene: ID y UUID Idioma Info Tipo Fecha de creación Información de la última revisión
  21. 21. Término Cada entidad de este tipo tiene: ID y UUID Idioma Nombre Vocabulario Descripción Término padre Peso
  22. 22. Comentario Cada entidad de este tipo tiene: ID y UUID Idioma Tipo Asunto Comentario padre Entidad que se comenta y campo Autor
  23. 23. Archivos Cada entidad de este tipo tiene: ID y UUID Idioma Nombre del archivo Usuario del archivo URI Tipo MIME Tamaño del archivo
  24. 24. Trabajando con entidades
  25. 25. Acceso a entidades
  26. 26. $manager = Drupal::entityTypeManager(); $entity = $manager ->getStorage('comment') ->load($id); $entity = Comment::load($id); $user = User::create(array('name' => 'me')); $entity->getEntityTypeId(); $entity->label(); $entity->id();
  27. 27. Acceso a campos
  28. 28. echo $entity->subject->value; $term_id = $entity ->field_tags[2] ->target_id; $entity->hasField($field_name); $entity = $field_item->getEntity(); $entity->title->value = 'new Title'; $entity->save();
  29. 29. if ($node->isPromoted()) { $title = $node->getTitle(); } elseif ($node->isPublished()) { $node->setTitle( $node->getAuthor() ->getUsername() ); }
  30. 30. Acceso a traducciones
  31. 31. echo $entity ->getTranslation('de') ->title->value; $translation = $entity->getTranslation('de'); $translation->language()->id == 'de'; $translation->title->value = 'German title'; $translation = $manager ->getTranslationFromContext($entity); echo $translation->label(); $entity = $translation->getUntranslated();
  32. 32. Acceso a definiciones
  33. 33. echo $entity ->getTranslation('de') ->title->value; $translation = $entity->getTranslation('de'); $translation->language()->id == 'de'; $translation->title->value = 'German title'; $translation = $manager ->getTranslationFromContext($entity); echo $translation->label(); $entity = $translation->getUntranslated();
  34. 34. Acceso a definiciones
  35. 35. $entity_type = $entity_manager ->getDefinition('node'); $entity_type->id() == 'node' $entity_type ->getClass() $entity_type ->hasKey('label') $entity_type ->isSubclassOf('ContentEntityInterface')
  36. 36. $field_definition = $entity-> getFieldDefinition($field_name); $field_definition->getName(); $field_definition->getPropertyDefinitions(); $entity_manager ->getFieldDefinitions('node', 'article');
  37. 37. Tipos de entidad personalizados
  38. 38. Son plugins Deben estar en Drupal/module/Entity Deben cumplir la anotación @ContentEntityType Deben implementar ContentEntityBase
  39. 39. /** * Defines the comment entity class. * * @ContentEntityType( * id = "comment", * label = @Translation("Comment"), * bundle_label = @Translation("Comment type"), ...
  40. 40. ... * handlers = { * "storage" = "DrupalcommentCommentStorage", * "storage_schema" = "DrupalcommentCommentStorageSchema", * "access" = "DrupalcommentCommentAccessControlHandler", * "list_builder" = "DrupalCoreEntityEntityListBuilder", * "view_builder" = "DrupalcommentCommentViewBuilder", * "views_data" = "DrupalcommentCommentViewsData", * "form" = { * "default" = "DrupalcommentCommentForm", * "delete" = "DrupalcommentFormDeleteForm" * }, * "translation" = “DrupalcommentCommentTranslationHandler" * }, ...
  41. 41. ... * base_table = "comment", * data_table = "comment_field_data", * uri_callback = "comment_uri", * translatable = TRUE, * entity_keys = { * "id" = "cid", * "bundle" = "comment_type", * "label" = "subject", * "langcode" = "langcode", * "uuid" = "uuid" * }, ...
  42. 42. ... * links = { * "canonical" = "/comment/{comment}", * "delete-form" = "/comment/{comment}/delete", * "edit-form" = "/comment/{comment}/edit", * }, * bundle_entity_type = "comment_type", * field_ui_base_route = "entity.comment_type.edit_form", * constraints = { * "CommentName" = {} * } * ) */
  43. 43. Definen sus campos base Implementan la función baseFieldDefinitions Usan BaseFieldDefinition::create para añadir campos: Tipo de campo Propiedades Formateadores
  44. 44. ... public static function baseFieldDefinitions(EntityTypeInterface $entity_type) { $fields = parent::baseFieldDefinitions($entity_type); $fields['subject'] = BaseFieldDefinition::create('string') ->setLabel(t('Subject')) ->setTranslatable(TRUE) ->setSetting('max_length', 64) ->setDisplayOptions('form', array( 'type' => 'string_textfield', 'weight' => 10, )) ->setDisplayConfigurable('form', TRUE); return $fields; } ...
  45. 45. ... $fields['title'] = FieldDefinition::create('string') ->setLabel(t('Title')) ... ->setDisplayOptions('view', array( 'label' => 'hidden', 'type' => 'string', 'weight' => -5, )) ->setDisplayOptions('form', array( 'type' => 'string', 'weight' => -5, )) ->setDisplayConfigurable('form', TRUE); ...
  46. 46. Implementan handlers Son clases independientes del tipo de entidad Definen: Storage Access List and view builder Views data Forms
  47. 47. ... * handlers = { * "storage" = "DrupalcommentCommentStorage", * "storage_schema" = "DrupalcommentCommentStorageSchema", * "access" = "DrupalcommentCommentAccessControlHandler", * "list_builder" = "DrupalCoreEntityEntityListBuilder", * "view_builder" = "DrupalcommentCommentViewBuilder", * "views_data" = "DrupalcommentCommentViewsData", * "form" = { * "default" = "DrupalcommentCommentForm", * "delete" = "DrupalcommentFormDeleteForm" * }, * "translation" = “DrupalcommentCommentTranslationHandler" * }, ...
  48. 48. Handler de ejemplo: Storage Se utiliza para gestionar la persistencia de la entidad. Implementa EntityStorageInterface Implementaciones base: SqlContentEntityStorage ContentEntityNullStorage
  49. 49. class CommentStorage extends SqlContentEntityStorage implements CommentStorageInterface { ... public function loadThread(...) { ... } ... }
  50. 50. Entity keys Definen las claves que se usarán para cargar las entidades ContentEntityBase::baseFieldDefinitions crea campos para ellas automáticamente
  51. 51. ... * entity_keys = { * "id" = "cid", * "bundle" = "comment_type", * "label" = "subject", * "langcode" = "langcode", * "uuid" = "uuid" * }, ...
  52. 52. Links Define la forma de los enlaces: canonical add-form edit-form delete-form ...
  53. 53. ... * links = { * "canonical" = "/comment/{comment}", * "delete-form" = "/comment/{comment}/delete", * "edit-form" = "/comment/{comment}/edit", * }, ...
  54. 54. Routing Se debe implementar el routing de los enlaces Dos formas: Es posible definir las rutas en el archivo *.routing.yml Es mejor usar un handler route_provider como DefaultHtmlRouteProvider
  55. 55. ¿Por qué crear nuevos tipos de entidades?
  56. 56. Cuando necesitas un tipo de entidad específico: propiedades, métodos, acceso, almacenamiento… Cuando no quieres usar un tipo existente: puedes clonar uno y los demás módulos no sabrán de él Cuando necesitas control total sobre él: los campos base no pueden modificarse usando la interfaz Cuando el modelo de datos es muy complicado: como pasa con Commerce, Flag o Paragraphs
  57. 57. Modificar tipos de entidades existentes
  58. 58. Entity API Funciones para alterar: Campos base, de bundle y extras Control de acceso CRUD Visualización Formularios https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21enti
  59. 59. ¡Gracias! ¿Preguntas?

×