SlideShare una empresa de Scribd logo
1 de 48
Descargar para leer sin conexión
Entidades en Drupal 8
Luis Ortiz Ramos
@luisortizramos
● 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
hola@ateneatech.com
Dos tipos de entidades
Configuration entities:
● Forma parte de CMI
● Views, Blocks, Image styles, Menus, Rols…
Content entities
Historia
● 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!
¿Qué es una entidad?
“Entities, in Drupal, are objects that are used for
persistent storage of content and configuration
information.”
̶ Entity API
“Loadable thingy, that can optionally be
fieldable”
̶ Frando
http://dgo.to/460320
Así que… ¿qué es una
entidad?
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
… 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
… 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.
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
Entidades en el
núcleo de 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
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
Trabajando con entidades
Acceso a entidades
$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();
Acceso a campos
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();
if ($node->isPromoted()) {
$title = $node->getTitle();
} elseif ($node->isPublished()) {
$node->setTitle(
$node->getAuthor()
->getUsername()
);
}
Acceso a traducciones
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();
Acceso a definiciones
$entity_type = $entity_manager
->getDefinition('node');
$entity_type->id() == 'node'
$entity_type
->getClass()
$entity_type
->hasKey('label')
$entity_type
->isSubclassOf('ContentEntityInterface')
$field_definition = $entity->
getFieldDefinition($field_name);
$field_definition->getName();
$field_definition->getPropertyDefinitions();
$entity_manager
->getFieldDefinitions('node', 'article');
Tipos de entidad
personalizados
Son plugins:
● Deben estar en Drupal/module/Entity
● Deben cumplir la anotación
@ContentEntityType
● Deben implementar ContentEntityBase
/**
* Defines the comment entity class.
*
* @ContentEntityType(
* id = "comment",
* label = @Translation("Comment"),
* bundle_label = @Translation("Comment type"),
* handlers = {
* "storage" = "DrupalcommentCommentStorage",
* "storage_schema" = "DrupalcommentCommentStorageSchema",
* "access" = "DrupalcommentCommentAccessControlHandler",
* "list_builder" = "DrupalCoreEntityEntityListBuilder",
* "view_builder" = "DrupalcommentCommentViewBuilder",
* "views_data" = "DrupalcommentCommentViewsData",
* "form" = {
* "default" = "DrupalcommentCommentForm",
* "delete" = "DrupalcommentFormDeleteForm"
* },
* "translation" =
“DrupalcommentCommentTranslationHandler"
* },
...
...
* 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" = {}
* }
* )
*/
Definen sus campos base:
● Implementan la función baseFieldDefinitions
● Usan BaseFieldDefinition::create para añadir
campos:
○ Tipo de campo
○ Propiedades
○ Formateadores
class Comment extends ContentEntityBase implements
CommentInterface {
public static function baseFieldDefinitions
(EntityTypeInterface $entity_type) {
/** @var DrupalCoreFieldBaseFieldDefinition[] $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;
}
}
$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);
Los handlers:
● son clases independientes del tipo de
entidad
● definen:
○ Storage
○ Access
○ List and view builder
○ Views data
○ Forms
...
* handlers = {
* "storage" = "DrupalcommentCommentStorage",
* "storage_schema" = "DrupalcommentCommentStorageSchema",
* "access" = "DrupalcommentCommentAccessControlHandler",
* "list_builder" = "DrupalCoreEntityEntityListBuilder",
* "view_builder" = "DrupalcommentCommentViewBuilder",
* "views_data" = "DrupalcommentCommentViewsData",
* "form" = {
* "default" = "DrupalcommentCommentForm",
* "delete" = "DrupalcommentFormDeleteForm"
* },
* "translation" =
“DrupalcommentCommentTranslationHandler"
* },
...
Storage:
● Se utiliza para gestionar la persistencia de la
entidad.
● Implementa EntityStorageInterface
● Implementaciones base:
○ SqlContentEntityStorage
○ ContentEntityNullStorage
class CommentStorage extends SqlContentEntityStorage implements
CommentStorageInterface {
...
public function loadThread(...) {
...
}
...
}
Entity keys:
● Definen las claves que se usarán para cargar
las entidades
● ContentEntityBase::baseFieldDefinitions crea
campos para ellas automáticamente
...
* entity_keys = {
* "id" = "cid",
* "bundle" = "comment_type",
* "label" = "subject",
* "langcode" = "langcode",
* "uuid" = "uuid"
* },
...
Links
● Define la forma de los enlaces:
○ canonical
○ add-form
○ edit-form
○ delete-form
○ ...
...
* links = {
* "canonical" = "/comment/{comment}",
* "delete-form" = "/comment/{comment}/delete",
* "edit-form" = "/comment/{comment}/edit",
* },
...
Routing
● Es posible definir las rutas en el archivo *.
routing.yml
● Es mejor usar un handler route_provider
como DefaultHtmlRouteProvider
¿Por qué?
● 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
¡Gracias!
¿Preguntas?

Más contenido relacionado

La actualidad más candente

Introduction of Html/css/js
Introduction of Html/css/jsIntroduction of Html/css/js
Introduction of Html/css/jsKnoldus Inc.
 
Complete Lecture on Css presentation
Complete Lecture on Css presentation Complete Lecture on Css presentation
Complete Lecture on Css presentation Salman Memon
 
Redis - for duplicate detection on real time stream
Redis - for duplicate detection on real time streamRedis - for duplicate detection on real time stream
Redis - for duplicate detection on real time streamCodemotion
 
PPPoE With Mikrotik and Radius
PPPoE With Mikrotik and RadiusPPPoE With Mikrotik and Radius
PPPoE With Mikrotik and RadiusDashamir Hoxha
 
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...confluent
 
Open vSwitch - Stateful Connection Tracking & Stateful NAT
Open vSwitch - Stateful Connection Tracking & Stateful NATOpen vSwitch - Stateful Connection Tracking & Stateful NAT
Open vSwitch - Stateful Connection Tracking & Stateful NATThomas Graf
 
Linux Networking Explained
Linux Networking ExplainedLinux Networking Explained
Linux Networking ExplainedThomas Graf
 
HTML presentation for beginners
HTML presentation for beginnersHTML presentation for beginners
HTML presentation for beginnersjeroenvdmeer
 
nl80211 and libnl
nl80211 and libnlnl80211 and libnl
nl80211 and libnlawkman
 
Nsq & python worker
Nsq & python workerNsq & python worker
Nsq & python workerFelinx Lee
 
Php tutorial(w3schools)
Php tutorial(w3schools)Php tutorial(w3schools)
Php tutorial(w3schools)Arjun Shanka
 
Practical file on web technology(html)
Practical file on web technology(html)Practical file on web technology(html)
Practical file on web technology(html)RAJWANT KAUR
 
Using Wildcards with rsyslog's File Monitor imfile
Using Wildcards with rsyslog's File Monitor imfileUsing Wildcards with rsyslog's File Monitor imfile
Using Wildcards with rsyslog's File Monitor imfileRainer Gerhards
 
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...Redis Labs
 
Introduction to HTML
Introduction to HTMLIntroduction to HTML
Introduction to HTMLAnn Alcid
 
Dom date and objects and event handling
Dom date and objects and event handlingDom date and objects and event handling
Dom date and objects and event handlingsmitha273566
 

La actualidad más candente (20)

Introduction of Html/css/js
Introduction of Html/css/jsIntroduction of Html/css/js
Introduction of Html/css/js
 
Complete Lecture on Css presentation
Complete Lecture on Css presentation Complete Lecture on Css presentation
Complete Lecture on Css presentation
 
Understanding DPDK
Understanding DPDKUnderstanding DPDK
Understanding DPDK
 
div tag.pdf
div tag.pdfdiv tag.pdf
div tag.pdf
 
Redis - for duplicate detection on real time stream
Redis - for duplicate detection on real time streamRedis - for duplicate detection on real time stream
Redis - for duplicate detection on real time stream
 
PPPoE With Mikrotik and Radius
PPPoE With Mikrotik and RadiusPPPoE With Mikrotik and Radius
PPPoE With Mikrotik and Radius
 
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
Apache kafka meet_up_zurich_at_swissre_from_zero_to_hero_with_kafka_connect_2...
 
Open vSwitch - Stateful Connection Tracking & Stateful NAT
Open vSwitch - Stateful Connection Tracking & Stateful NATOpen vSwitch - Stateful Connection Tracking & Stateful NAT
Open vSwitch - Stateful Connection Tracking & Stateful NAT
 
Linux Networking Explained
Linux Networking ExplainedLinux Networking Explained
Linux Networking Explained
 
HTML presentation for beginners
HTML presentation for beginnersHTML presentation for beginners
HTML presentation for beginners
 
nl80211 and libnl
nl80211 and libnlnl80211 and libnl
nl80211 and libnl
 
Nsq & python worker
Nsq & python workerNsq & python worker
Nsq & python worker
 
Php tutorial(w3schools)
Php tutorial(w3schools)Php tutorial(w3schools)
Php tutorial(w3schools)
 
Practical file on web technology(html)
Practical file on web technology(html)Practical file on web technology(html)
Practical file on web technology(html)
 
Dtd
DtdDtd
Dtd
 
Using Wildcards with rsyslog's File Monitor imfile
Using Wildcards with rsyslog's File Monitor imfileUsing Wildcards with rsyslog's File Monitor imfile
Using Wildcards with rsyslog's File Monitor imfile
 
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...
The Happy Marriage of Redis and Protobuf by Scott Haines of Twilio - Redis Da...
 
Introduction to HTML
Introduction to HTMLIntroduction to HTML
Introduction to HTML
 
XSLT. Basic.
XSLT. Basic.XSLT. Basic.
XSLT. Basic.
 
Dom date and objects and event handling
Dom date and objects and event handlingDom date and objects and event handling
Dom date and objects and event handling
 

Destacado

Descripción Modelo Entidad Relación Drupal Autora Marc Bria Ramírez
Descripción Modelo Entidad Relación Drupal Autora Marc Bria RamírezDescripción Modelo Entidad Relación Drupal Autora Marc Bria Ramírez
Descripción Modelo Entidad Relación Drupal Autora Marc Bria RamírezDoryan Mathos
 
Formularios en Drupal 8
Formularios en Drupal 8Formularios en Drupal 8
Formularios en Drupal 8Atenea tech
 
PHP-FIG: how the PHP world got off their islands (DrupalCamp Vienna 2015)
PHP-FIG: how the PHP world got off their islands (DrupalCamp Vienna 2015)PHP-FIG: how the PHP world got off their islands (DrupalCamp Vienna 2015)
PHP-FIG: how the PHP world got off their islands (DrupalCamp Vienna 2015)Bart Feenstra
 
Payment processing in drupal 8 (DrupalCamp Ghent 2014)
Payment processing in drupal 8 (DrupalCamp Ghent 2014)Payment processing in drupal 8 (DrupalCamp Ghent 2014)
Payment processing in drupal 8 (DrupalCamp Ghent 2014)Bart Feenstra
 
Conference Migrate to Drupal 8 by Leon Cros at Drupal Developer Days 2015 in ...
Conference Migrate to Drupal 8 by Leon Cros at Drupal Developer Days 2015 in ...Conference Migrate to Drupal 8 by Leon Cros at Drupal Developer Days 2015 in ...
Conference Migrate to Drupal 8 by Leon Cros at Drupal Developer Days 2015 in ...Chipway
 
Julgamento de eichmann autoria mediata e tribunal de exceção uma análise jurí...
Julgamento de eichmann autoria mediata e tribunal de exceção uma análise jurí...Julgamento de eichmann autoria mediata e tribunal de exceção uma análise jurí...
Julgamento de eichmann autoria mediata e tribunal de exceção uma análise jurí...Milena Quaresma
 
Anatomy of payment systems in Drupal 8
Anatomy of payment systems in Drupal 8Anatomy of payment systems in Drupal 8
Anatomy of payment systems in Drupal 8Oleg Natalushko
 
Drupal commerce 2.x for Drupal 8
Drupal commerce 2.x for Drupal 8Drupal commerce 2.x for Drupal 8
Drupal commerce 2.x for Drupal 8Iztok Smolic
 
Drupal 8 & Commerce 2.x insights
Drupal 8 & Commerce 2.x insightsDrupal 8 & Commerce 2.x insights
Drupal 8 & Commerce 2.x insightsNayan Velde
 
Diagramas de proceso
Diagramas de procesoDiagramas de proceso
Diagramas de procesojulietas
 
Proceso de crear una pelicula animada (Pixar Studios)
Proceso de crear una pelicula animada (Pixar Studios)Proceso de crear una pelicula animada (Pixar Studios)
Proceso de crear una pelicula animada (Pixar Studios)Deyvi De La Cruz Ambrosio
 

Destacado (13)

Descripción Modelo Entidad Relación Drupal Autora Marc Bria Ramírez
Descripción Modelo Entidad Relación Drupal Autora Marc Bria RamírezDescripción Modelo Entidad Relación Drupal Autora Marc Bria Ramírez
Descripción Modelo Entidad Relación Drupal Autora Marc Bria Ramírez
 
Formularios en Drupal 8
Formularios en Drupal 8Formularios en Drupal 8
Formularios en Drupal 8
 
PHP-FIG: how the PHP world got off their islands (DrupalCamp Vienna 2015)
PHP-FIG: how the PHP world got off their islands (DrupalCamp Vienna 2015)PHP-FIG: how the PHP world got off their islands (DrupalCamp Vienna 2015)
PHP-FIG: how the PHP world got off their islands (DrupalCamp Vienna 2015)
 
Payment processing in drupal 8 (DrupalCamp Ghent 2014)
Payment processing in drupal 8 (DrupalCamp Ghent 2014)Payment processing in drupal 8 (DrupalCamp Ghent 2014)
Payment processing in drupal 8 (DrupalCamp Ghent 2014)
 
Conference Migrate to Drupal 8 by Leon Cros at Drupal Developer Days 2015 in ...
Conference Migrate to Drupal 8 by Leon Cros at Drupal Developer Days 2015 in ...Conference Migrate to Drupal 8 by Leon Cros at Drupal Developer Days 2015 in ...
Conference Migrate to Drupal 8 by Leon Cros at Drupal Developer Days 2015 in ...
 
Julgamento de eichmann autoria mediata e tribunal de exceção uma análise jurí...
Julgamento de eichmann autoria mediata e tribunal de exceção uma análise jurí...Julgamento de eichmann autoria mediata e tribunal de exceção uma análise jurí...
Julgamento de eichmann autoria mediata e tribunal de exceção uma análise jurí...
 
Custom entities in d8
Custom entities in d8Custom entities in d8
Custom entities in d8
 
Cmi en drupal 8
Cmi en drupal 8Cmi en drupal 8
Cmi en drupal 8
 
Anatomy of payment systems in Drupal 8
Anatomy of payment systems in Drupal 8Anatomy of payment systems in Drupal 8
Anatomy of payment systems in Drupal 8
 
Drupal commerce 2.x for Drupal 8
Drupal commerce 2.x for Drupal 8Drupal commerce 2.x for Drupal 8
Drupal commerce 2.x for Drupal 8
 
Drupal 8 & Commerce 2.x insights
Drupal 8 & Commerce 2.x insightsDrupal 8 & Commerce 2.x insights
Drupal 8 & Commerce 2.x insights
 
Diagramas de proceso
Diagramas de procesoDiagramas de proceso
Diagramas de proceso
 
Proceso de crear una pelicula animada (Pixar Studios)
Proceso de crear una pelicula animada (Pixar Studios)Proceso de crear una pelicula animada (Pixar Studios)
Proceso de crear una pelicula animada (Pixar Studios)
 

Similar a Entidades en drupal 8

Entidades en drupal 8
Entidades en drupal 8Entidades en drupal 8
Entidades en drupal 8Atenea tech
 
MADs about Drupal: Programación de entities para D7
MADs about Drupal: Programación de entities para D7MADs about Drupal: Programación de entities para D7
MADs about Drupal: Programación de entities para D7Pablo López Escobés
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladoresPedro Cambra
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQueryDanae Aguilar Guzmán
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con HibernateMauro Gomez Mejia
 
Migrate, una herramienta de trabajo y desarrollo
Migrate, una herramienta de trabajo y desarrolloMigrate, una herramienta de trabajo y desarrollo
Migrate, una herramienta de trabajo y desarrolloYmbra
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Ronald Cuello
 
Persistencia de un modelo de objetos
Persistencia de un modelo de objetosPersistencia de un modelo de objetos
Persistencia de un modelo de objetosJorge Ercoli
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentacionesmary taipe
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentacionesmary taipe
 
Novedades de aries
Novedades de ariesNovedades de aries
Novedades de arieslmrv
 
Bases de Datos en Java - Intro a Hibernate
Bases de Datos en Java - Intro a HibernateBases de Datos en Java - Intro a Hibernate
Bases de Datos en Java - Intro a HibernateCarlos Hernando
 
Poo 2009 u2_introd_a_la_poo_2
Poo 2009 u2_introd_a_la_poo_2Poo 2009 u2_introd_a_la_poo_2
Poo 2009 u2_introd_a_la_poo_2Axel
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datosFernando Cejas
 

Similar a Entidades en drupal 8 (20)

Entidades en drupal 8
Entidades en drupal 8Entidades en drupal 8
Entidades en drupal 8
 
MADs about Drupal: Programación de entities para D7
MADs about Drupal: Programación de entities para D7MADs about Drupal: Programación de entities para D7
MADs about Drupal: Programación de entities para D7
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 
03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery03. Introduccion a JavaScript y JQuery
03. Introduccion a JavaScript y JQuery
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con Hibernate
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
Migrate, una herramienta de trabajo y desarrollo
Migrate, una herramienta de trabajo y desarrolloMigrate, una herramienta de trabajo y desarrollo
Migrate, una herramienta de trabajo y desarrollo
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)
 
Persistencia de un modelo de objetos
Persistencia de un modelo de objetosPersistencia de un modelo de objetos
Persistencia de un modelo de objetos
 
Semana 6 Módulos Clases y Objetos
Semana 6   Módulos Clases y ObjetosSemana 6   Módulos Clases y Objetos
Semana 6 Módulos Clases y Objetos
 
Introducción a DJango
Introducción a DJangoIntroducción a DJango
Introducción a DJango
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentaciones
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentaciones
 
Novedades de aries
Novedades de ariesNovedades de aries
Novedades de aries
 
Novedades de aries
Novedades de ariesNovedades de aries
Novedades de aries
 
Bases de Datos en Java - Intro a Hibernate
Bases de Datos en Java - Intro a HibernateBases de Datos en Java - Intro a Hibernate
Bases de Datos en Java - Intro a Hibernate
 
Mv vol2 ver5.0(corregido)
Mv vol2 ver5.0(corregido)Mv vol2 ver5.0(corregido)
Mv vol2 ver5.0(corregido)
 
Oo basico
Oo basicoOo basico
Oo basico
 
Poo 2009 u2_introd_a_la_poo_2
Poo 2009 u2_introd_a_la_poo_2Poo 2009 u2_introd_a_la_poo_2
Poo 2009 u2_introd_a_la_poo_2
 
Desarrollo android almacenamiento de datos
Desarrollo android    almacenamiento de datosDesarrollo android    almacenamiento de datos
Desarrollo android almacenamiento de datos
 

Más de Atenea tech

Qué he aprendido durante 10 años vendiendo Drupal - DrupalCamp Spain 2018
Qué he aprendido durante 10 años vendiendo Drupal - DrupalCamp Spain 2018Qué he aprendido durante 10 años vendiendo Drupal - DrupalCamp Spain 2018
Qué he aprendido durante 10 años vendiendo Drupal - DrupalCamp Spain 2018Atenea tech
 
Layout discovery. Drupal Summer Barcelona 2017
Layout discovery. Drupal Summer Barcelona 2017Layout discovery. Drupal Summer Barcelona 2017
Layout discovery. Drupal Summer Barcelona 2017Atenea tech
 
Casos de éxito con Drupal. Eada: escuela de negocios con drupal 8
Casos de éxito con Drupal. Eada: escuela de negocios con drupal 8Casos de éxito con Drupal. Eada: escuela de negocios con drupal 8
Casos de éxito con Drupal. Eada: escuela de negocios con drupal 8Atenea tech
 
Extreme page composition with paragraphs
Extreme page composition with paragraphsExtreme page composition with paragraphs
Extreme page composition with paragraphsAtenea tech
 
Composición de páginas complejas con paragraphs
Composición de páginas complejas con paragraphsComposición de páginas complejas con paragraphs
Composición de páginas complejas con paragraphsAtenea tech
 
¿Qué es drupal?
¿Qué es drupal? ¿Qué es drupal?
¿Qué es drupal? Atenea tech
 
Cultura empresarial, Open Source y Drupal
Cultura empresarial, Open Source y DrupalCultura empresarial, Open Source y Drupal
Cultura empresarial, Open Source y DrupalAtenea tech
 
Introduciendo drupal 8
Introduciendo drupal 8Introduciendo drupal 8
Introduciendo drupal 8Atenea tech
 
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014Atenea tech
 
Éxitos y desastrosas experiencias con el agilismo en la gestión de proyectos ...
Éxitos y desastrosas experiencias con el agilismo en la gestión de proyectos ...Éxitos y desastrosas experiencias con el agilismo en la gestión de proyectos ...
Éxitos y desastrosas experiencias con el agilismo en la gestión de proyectos ...Atenea tech
 
Drupal: Funcionalitats i mòduls
Drupal: Funcionalitats i mòdulsDrupal: Funcionalitats i mòduls
Drupal: Funcionalitats i mòdulsAtenea tech
 
Drupal: Posada en Funcionament
Drupal: Posada en FuncionamentDrupal: Posada en Funcionament
Drupal: Posada en FuncionamentAtenea tech
 
Introducció a Drupal
Introducció a DrupalIntroducció a Drupal
Introducció a DrupalAtenea tech
 
Context vs panels
Context vs panelsContext vs panels
Context vs panelsAtenea tech
 
Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012Atenea tech
 
Display suite - Drupal.cat
Display suite - Drupal.catDisplay suite - Drupal.cat
Display suite - Drupal.catAtenea tech
 
AEPap web en Drupal desenvolupada per Atenea tech
AEPap web en Drupal desenvolupada per Atenea techAEPap web en Drupal desenvolupada per Atenea tech
AEPap web en Drupal desenvolupada per Atenea techAtenea tech
 
Fundacio Cim Drupal Camp 2010
Fundacio Cim   Drupal Camp 2010Fundacio Cim   Drupal Camp 2010
Fundacio Cim Drupal Camp 2010Atenea tech
 

Más de Atenea tech (20)

Qué he aprendido durante 10 años vendiendo Drupal - DrupalCamp Spain 2018
Qué he aprendido durante 10 años vendiendo Drupal - DrupalCamp Spain 2018Qué he aprendido durante 10 años vendiendo Drupal - DrupalCamp Spain 2018
Qué he aprendido durante 10 años vendiendo Drupal - DrupalCamp Spain 2018
 
Layout discovery. Drupal Summer Barcelona 2017
Layout discovery. Drupal Summer Barcelona 2017Layout discovery. Drupal Summer Barcelona 2017
Layout discovery. Drupal Summer Barcelona 2017
 
Casos de éxito con Drupal. Eada: escuela de negocios con drupal 8
Casos de éxito con Drupal. Eada: escuela de negocios con drupal 8Casos de éxito con Drupal. Eada: escuela de negocios con drupal 8
Casos de éxito con Drupal. Eada: escuela de negocios con drupal 8
 
Let’s encrypt
Let’s encryptLet’s encrypt
Let’s encrypt
 
Extreme page composition with paragraphs
Extreme page composition with paragraphsExtreme page composition with paragraphs
Extreme page composition with paragraphs
 
Composición de páginas complejas con paragraphs
Composición de páginas complejas con paragraphsComposición de páginas complejas con paragraphs
Composición de páginas complejas con paragraphs
 
¿Qué es drupal?
¿Qué es drupal? ¿Qué es drupal?
¿Qué es drupal?
 
Cultura empresarial, Open Source y Drupal
Cultura empresarial, Open Source y DrupalCultura empresarial, Open Source y Drupal
Cultura empresarial, Open Source y Drupal
 
Introduciendo drupal 8
Introduciendo drupal 8Introduciendo drupal 8
Introduciendo drupal 8
 
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
Contratos y presupuestos en proyectos Drupal - Drupal Camp Spain 2014
 
Éxitos y desastrosas experiencias con el agilismo en la gestión de proyectos ...
Éxitos y desastrosas experiencias con el agilismo en la gestión de proyectos ...Éxitos y desastrosas experiencias con el agilismo en la gestión de proyectos ...
Éxitos y desastrosas experiencias con el agilismo en la gestión de proyectos ...
 
Drupal: Funcionalitats i mòduls
Drupal: Funcionalitats i mòdulsDrupal: Funcionalitats i mòduls
Drupal: Funcionalitats i mòduls
 
Drupal: Posada en Funcionament
Drupal: Posada en FuncionamentDrupal: Posada en Funcionament
Drupal: Posada en Funcionament
 
Introducció a Drupal
Introducció a DrupalIntroducció a Drupal
Introducció a Drupal
 
Context vs panels
Context vs panelsContext vs panels
Context vs panels
 
Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012Presentación sobre Display Suite en el Drupal Day Valencia 2012
Presentación sobre Display Suite en el Drupal Day Valencia 2012
 
Xarxes socials
Xarxes socialsXarxes socials
Xarxes socials
 
Display suite - Drupal.cat
Display suite - Drupal.catDisplay suite - Drupal.cat
Display suite - Drupal.cat
 
AEPap web en Drupal desenvolupada per Atenea tech
AEPap web en Drupal desenvolupada per Atenea techAEPap web en Drupal desenvolupada per Atenea tech
AEPap web en Drupal desenvolupada per Atenea tech
 
Fundacio Cim Drupal Camp 2010
Fundacio Cim   Drupal Camp 2010Fundacio Cim   Drupal Camp 2010
Fundacio Cim Drupal Camp 2010
 

Entidades en drupal 8

  • 1. Entidades en Drupal 8 Luis Ortiz Ramos @luisortizramos
  • 2.
  • 3. ● 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 hola@ateneatech.com
  • 4. Dos tipos de entidades
  • 5. Configuration entities: ● Forma parte de CMI ● Views, Blocks, Image styles, Menus, Rols… Content entities
  • 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 contrib y añadimos campos con Content Construction Kit ● Drupal 7: entidades limitadas en core ● Drupal 8: ¡entidades completas en core!
  • 8. ¿Qué es una entidad?
  • 9. “Entities, in Drupal, are objects that are used for persistent storage of content and configuration information.” ̶ Entity API
  • 10. “Loadable thingy, that can optionally be fieldable” ̶ Frando http://dgo.to/460320
  • 11. Así que… ¿qué es una entidad?
  • 12. 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
  • 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. … 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. 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
  • 16. Entidades en el núcleo de Drupal 8
  • 17. 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
  • 18. 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
  • 21. $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();
  • 23. 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();
  • 24. if ($node->isPromoted()) { $title = $node->getTitle(); } elseif ($node->isPublished()) { $node->setTitle( $node->getAuthor() ->getUsername() ); }
  • 26. 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();
  • 28. $entity_type = $entity_manager ->getDefinition('node'); $entity_type->id() == 'node' $entity_type ->getClass() $entity_type ->hasKey('label') $entity_type ->isSubclassOf('ContentEntityInterface')
  • 31. Son plugins: ● Deben estar en Drupal/module/Entity ● Deben cumplir la anotación @ContentEntityType ● Deben implementar ContentEntityBase
  • 32. /** * Defines the comment entity class. * * @ContentEntityType( * id = "comment", * label = @Translation("Comment"), * bundle_label = @Translation("Comment type"), * handlers = { * "storage" = "DrupalcommentCommentStorage", * "storage_schema" = "DrupalcommentCommentStorageSchema", * "access" = "DrupalcommentCommentAccessControlHandler", * "list_builder" = "DrupalCoreEntityEntityListBuilder", * "view_builder" = "DrupalcommentCommentViewBuilder", * "views_data" = "DrupalcommentCommentViewsData", * "form" = { * "default" = "DrupalcommentCommentForm", * "delete" = "DrupalcommentFormDeleteForm" * }, * "translation" = “DrupalcommentCommentTranslationHandler" * }, ...
  • 33. ... * 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" = {} * } * ) */
  • 34. Definen sus campos base: ● Implementan la función baseFieldDefinitions ● Usan BaseFieldDefinition::create para añadir campos: ○ Tipo de campo ○ Propiedades ○ Formateadores
  • 35. class Comment extends ContentEntityBase implements CommentInterface { public static function baseFieldDefinitions (EntityTypeInterface $entity_type) { /** @var DrupalCoreFieldBaseFieldDefinition[] $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; } }
  • 36. $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);
  • 37. Los handlers: ● son clases independientes del tipo de entidad ● definen: ○ Storage ○ Access ○ List and view builder ○ Views data ○ Forms
  • 38. ... * handlers = { * "storage" = "DrupalcommentCommentStorage", * "storage_schema" = "DrupalcommentCommentStorageSchema", * "access" = "DrupalcommentCommentAccessControlHandler", * "list_builder" = "DrupalCoreEntityEntityListBuilder", * "view_builder" = "DrupalcommentCommentViewBuilder", * "views_data" = "DrupalcommentCommentViewsData", * "form" = { * "default" = "DrupalcommentCommentForm", * "delete" = "DrupalcommentFormDeleteForm" * }, * "translation" = “DrupalcommentCommentTranslationHandler" * }, ...
  • 39. Storage: ● Se utiliza para gestionar la persistencia de la entidad. ● Implementa EntityStorageInterface ● Implementaciones base: ○ SqlContentEntityStorage ○ ContentEntityNullStorage
  • 40. class CommentStorage extends SqlContentEntityStorage implements CommentStorageInterface { ... public function loadThread(...) { ... } ... }
  • 41. Entity keys: ● Definen las claves que se usarán para cargar las entidades ● ContentEntityBase::baseFieldDefinitions crea campos para ellas automáticamente
  • 42. ... * entity_keys = { * "id" = "cid", * "bundle" = "comment_type", * "label" = "subject", * "langcode" = "langcode", * "uuid" = "uuid" * }, ...
  • 43. Links ● Define la forma de los enlaces: ○ canonical ○ add-form ○ edit-form ○ delete-form ○ ...
  • 44. ... * links = { * "canonical" = "/comment/{comment}", * "delete-form" = "/comment/{comment}/delete", * "edit-form" = "/comment/{comment}/edit", * }, ...
  • 45. Routing ● Es posible definir las rutas en el archivo *. routing.yml ● Es mejor usar un handler route_provider como DefaultHtmlRouteProvider
  • 47. ● 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