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

Destacado

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

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
 

Último

Evaluación del riesgo tecnologías informáticas.pdf
Evaluación del riesgo tecnologías informáticas.pdfEvaluación del riesgo tecnologías informáticas.pdf
Evaluación del riesgo tecnologías informáticas.pdfGuillermoBarquero7
 
2da. Clase Mecanografía e introducción a Excel (2).pptx
2da. Clase Mecanografía e introducción a Excel (2).pptx2da. Clase Mecanografía e introducción a Excel (2).pptx
2da. Clase Mecanografía e introducción a Excel (2).pptxEncomiendasElSherpa
 
Caso de Exito LPL Projects Logistics Spain y Business Central
Caso de Exito LPL Projects Logistics Spain y Business CentralCaso de Exito LPL Projects Logistics Spain y Business Central
Caso de Exito LPL Projects Logistics Spain y Business CentralAitana
 
ESCRITORIO DE WINDOWS 11 Y SUS ELEMENTOS
ESCRITORIO DE WINDOWS 11 Y SUS ELEMENTOSESCRITORIO DE WINDOWS 11 Y SUS ELEMENTOS
ESCRITORIO DE WINDOWS 11 Y SUS ELEMENTOSBeatrizGonzales19
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Opentix
 
Trabajo de Powerpoint - Unsaac - Ofimática
Trabajo de Powerpoint - Unsaac - OfimáticaTrabajo de Powerpoint - Unsaac - Ofimática
Trabajo de Powerpoint - Unsaac - OfimáticaKANTUPAULAPORCELYUCR
 

Último (6)

Evaluación del riesgo tecnologías informáticas.pdf
Evaluación del riesgo tecnologías informáticas.pdfEvaluación del riesgo tecnologías informáticas.pdf
Evaluación del riesgo tecnologías informáticas.pdf
 
2da. Clase Mecanografía e introducción a Excel (2).pptx
2da. Clase Mecanografía e introducción a Excel (2).pptx2da. Clase Mecanografía e introducción a Excel (2).pptx
2da. Clase Mecanografía e introducción a Excel (2).pptx
 
Caso de Exito LPL Projects Logistics Spain y Business Central
Caso de Exito LPL Projects Logistics Spain y Business CentralCaso de Exito LPL Projects Logistics Spain y Business Central
Caso de Exito LPL Projects Logistics Spain y Business Central
 
ESCRITORIO DE WINDOWS 11 Y SUS ELEMENTOS
ESCRITORIO DE WINDOWS 11 Y SUS ELEMENTOSESCRITORIO DE WINDOWS 11 Y SUS ELEMENTOS
ESCRITORIO DE WINDOWS 11 Y SUS ELEMENTOS
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200
 
Trabajo de Powerpoint - Unsaac - Ofimática
Trabajo de Powerpoint - Unsaac - OfimáticaTrabajo de Powerpoint - Unsaac - Ofimática
Trabajo de Powerpoint - Unsaac - Ofimática
 

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