48
Entidades en Drupal 8 Luis Ortiz Ramos @luisortizramos

Entidades en drupal 8

Embed Size (px)

Citation preview

Page 1: Entidades en drupal 8

Entidades en Drupal 8Luis Ortiz Ramos@luisortizramos

Page 2: Entidades en drupal 8
Page 3: Entidades en drupal 8

● Somos expertos en Drupal● Somos Siddharta, Oriol, Robert, David,

Patricia, Ignacio, Javier y Luis.● Trabajamos para Estrella Damm, Dexeus,

Médicos Sin Fronteras, Infojobs, Greenpeace, Chupa Chups, Ayuntamiento de Barcelona, Torres, la CUP…

● Estamos en Barcelona● Puedes contactar con nosotros en

[email protected]

Page 4: Entidades en drupal 8

Dos tipos de entidades

Page 5: Entidades en drupal 8

Configuration entities:● Forma parte de CMI● Views, Blocks, Image styles, Menus, Rols…

Content entities

Page 6: Entidades en drupal 8

Historia

Page 7: Entidades en drupal 8

● 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

contrib y añadimos campos con Content Construction Kit

● Drupal 7: entidades limitadas en core● Drupal 8: ¡entidades completas en core!

Page 8: Entidades en drupal 8

¿Qué es una entidad?

Page 9: Entidades en drupal 8

“Entities, in Drupal, are objects that are used for persistent storage of content and configuration information.”

Entity API

Page 10: Entidades en drupal 8

“Loadable thingy, that can optionally be fieldable”

Frando http://dgo.to/460320

Page 11: Entidades en drupal 8

Así que… ¿qué es una entidad?

Page 12: Entidades en drupal 8

A thingy …

Una “unidad” de información estructurada:● Un artículo o entrada en un blog● Un usuario● Un término de un vocabulario● Otra estructura de datos que creemos

Page 13: Entidades en drupal 8

… 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

Page 14: Entidades en drupal 8

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

Page 15: Entidades en drupal 8

En Drupal 8: ● “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

Page 16: Entidades en drupal 8

Entidades en el núcleo de Drupal 8

Page 17: Entidades en drupal 8

Contenidos:● Para contenido!● Cada entidad de este tipo:

○ tiene una página node/ID○ revisiones

Usuarios:● Gestión de cuentas● Cada entidad tiene una página user/ID

Bloques personalizados:● Para contenido secundario

Page 18: Entidades en drupal 8

Términos:● Para organizar otras entidades● Cada entidad de este tipo tiene una página

taxonomy/term/ID

Comentarios:● Para adjuntar información estructurada a

otra entidad en el tiempo

Archivos:● Guarda metainformación sobre los archivos

Page 19: Entidades en drupal 8

Trabajando con entidades

Page 20: Entidades en drupal 8

Acceso a entidades

Page 21: Entidades en drupal 8

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

Page 22: Entidades en drupal 8

Acceso a campos

Page 23: Entidades en drupal 8

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

Page 24: Entidades en drupal 8

if ($node->isPromoted()) { $title = $node->getTitle();} elseif ($node->isPublished()) { $node->setTitle( $node->getAuthor() ->getUsername() );}

Page 25: Entidades en drupal 8

Acceso a traducciones

Page 26: Entidades en drupal 8

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

Page 27: Entidades en drupal 8

Acceso a definiciones

Page 28: Entidades en drupal 8

$entity_type = $entity_manager ->getDefinition('node');

$entity_type->id() == 'node'

$entity_type ->getClass()$entity_type ->hasKey('label')$entity_type ->isSubclassOf('ContentEntityInterface')

Page 29: Entidades en drupal 8

$field_definition = $entity-> getFieldDefinition($field_name);

$field_definition->getName();$field_definition->getPropertyDefinitions();

$entity_manager ->getFieldDefinitions('node', 'article');

Page 30: Entidades en drupal 8

Tipos de entidad personalizados

Page 31: Entidades en drupal 8

Son plugins:● Deben estar en Drupal/module/Entity● Deben cumplir la anotación

@ContentEntityType● Deben implementar ContentEntityBase

Page 32: Entidades en drupal 8

/** * Defines the comment entity class. * * @ContentEntityType( * id = "comment", * label = @Translation("Comment"), * bundle_label = @Translation("Comment type"), * handlers = { * "storage" = "Drupal\comment\CommentStorage", * "storage_schema" = "Drupal\comment\CommentStorageSchema", * "access" = "Drupal\comment\CommentAccessControlHandler", * "list_builder" = "Drupal\Core\Entity\EntityListBuilder", * "view_builder" = "Drupal\comment\CommentViewBuilder", * "views_data" = "Drupal\comment\CommentViewsData", * "form" = { * "default" = "Drupal\comment\CommentForm", * "delete" = "Drupal\comment\Form\DeleteForm" * }, * "translation" = “Drupal\comment\CommentTranslationHandler" * },...

Page 33: Entidades en drupal 8

... * 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" * }, * 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" = {} * } * ) */

Page 34: Entidades en drupal 8

Definen sus campos base:● Implementan la función baseFieldDefinitions● Usan BaseFieldDefinition::create para añadir

campos:○ Tipo de campo○ Propiedades○ Formateadores

Page 35: Entidades en drupal 8

class Comment extends ContentEntityBase implements CommentInterface {

public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {

/** @var \Drupal\Core\Field\BaseFieldDefinition[] $fields */$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',// Default comment body field has weight 20.'weight' => 10,

))->setDisplayConfigurable('form', TRUE);

return $fields;}

}

Page 36: Entidades en drupal 8

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

Page 37: Entidades en drupal 8

Los handlers:● son clases independientes del tipo de

entidad● definen:

○ Storage○ Access○ List and view builder○ Views data○ Forms

Page 38: Entidades en drupal 8

... * handlers = { * "storage" = "Drupal\comment\CommentStorage", * "storage_schema" = "Drupal\comment\CommentStorageSchema", * "access" = "Drupal\comment\CommentAccessControlHandler", * "list_builder" = "Drupal\Core\Entity\EntityListBuilder", * "view_builder" = "Drupal\comment\CommentViewBuilder", * "views_data" = "Drupal\comment\CommentViewsData", * "form" = { * "default" = "Drupal\comment\CommentForm", * "delete" = "Drupal\comment\Form\DeleteForm" * }, * "translation" = “Drupal\comment\CommentTranslationHandler" * },...

Page 39: Entidades en drupal 8

Storage:● Se utiliza para gestionar la persistencia de la

entidad.● Implementa EntityStorageInterface● Implementaciones base:

○ SqlContentEntityStorage○ ContentEntityNullStorage

Page 40: Entidades en drupal 8

class CommentStorage extends SqlContentEntityStorage implements CommentStorageInterface {

... public function loadThread(...) {

...}...

}

Page 41: Entidades en drupal 8

Entity keys:● Definen las claves que se usarán para cargar

las entidades● ContentEntityBase::baseFieldDefinitions crea

campos para ellas automáticamente

Page 42: Entidades en drupal 8

... * entity_keys = { * "id" = "cid", * "bundle" = "comment_type", * "label" = "subject", * "langcode" = "langcode", * "uuid" = "uuid" * },...

Page 43: Entidades en drupal 8

Links● Define la forma de los enlaces:

○ canonical○ add-form○ edit-form○ delete-form○ ...

Page 44: Entidades en drupal 8

... * links = { * "canonical" = "/comment/{comment}", * "delete-form" = "/comment/{comment}/delete", * "edit-form" = "/comment/{comment}/edit", * },...

Page 45: Entidades en drupal 8

Routing● Es posible definir las rutas en el archivo *.

routing.yml● Es mejor usar un handler route_provider

como DefaultHtmlRouteProvider

Page 46: Entidades en drupal 8

¿Por qué?

Page 47: Entidades en drupal 8

● 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 o Paragraphs

Page 48: Entidades en drupal 8

¡Gracias!¿Preguntas?