SlideShare una empresa de Scribd logo
1 de 61
Entidades en Drupal 8
DrupalCamp Spain 2017
Luis Ortiz Ramos
CTO de Atenea tech
luis@ateneatech.com
@luisortizramos
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
Dos tipos de entidades
Configuration entities:
Views, Blocks, Image styles, Menus, Rols…
Forman parte de CMI
Se exportan en archivos Yaml
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 contribuidos 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 contenido
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.
Glosario
“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 relevantes en el núcleo de
Drupal 8
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
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
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
Término
Cada entidad de este tipo tiene:
ID y UUID
Idioma
Nombre
Vocabulario
Descripción
Término padre
Peso
Comentario
Cada entidad de este tipo tiene:
ID y UUID
Idioma
Tipo
Asunto
Comentario padre
Entidad que se comenta y campo
Autor
Archivos
Cada entidad de este tipo tiene:
ID y UUID
Idioma
Nombre del archivo
Usuario del archivo
URI
Tipo MIME
Tamaño del archivo
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
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
...
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;
}
...
...
$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);
...
Implementan 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"
* },
...
Handler de ejemplo: 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
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
¿Por qué crear nuevos tipos de
entidades?
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
Modificar tipos de entidades existentes
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
¡Gracias!
¿Preguntas?

Más contenido relacionado

La actualidad más candente

Introducción a JQuery
Introducción a JQueryIntroducción a JQuery
Introducción a JQueryContinuum
 
Primer presentacion
Primer presentacion Primer presentacion
Primer presentacion m3mm0
 
Dom html - java script
Dom   html - java scriptDom   html - java script
Dom html - java scriptDaniel Grippo
 
Procesar estado
Procesar estadoProcesar estado
Procesar estadoLismirabal
 
Introduccion a DOM y AJAX - Javier Oliver Fulguera
Introduccion a DOM y AJAX  -  Javier Oliver FulgueraIntroduccion a DOM y AJAX  -  Javier Oliver Fulguera
Introduccion a DOM y AJAX - Javier Oliver FulgueraJavier Oliver Fulguera
 
Mantenimiento de Usuarios usando MVC ver1
Mantenimiento de Usuarios usando MVC ver1Mantenimiento de Usuarios usando MVC ver1
Mantenimiento de Usuarios usando MVC ver1Jose Luis Orosco Marcos
 
Charla Jquery
Charla JqueryCharla Jquery
Charla Jquerykaolong
 
Creación indices y constraints en bases de datos de sql server
Creación indices y constraints en bases de datos de sql serverCreación indices y constraints en bases de datos de sql server
Creación indices y constraints en bases de datos de sql serverBrandon Ruiz
 
Novedades de aries
Novedades de ariesNovedades de aries
Novedades de arieslmrv
 
Seminario mongo db springdata 10-11-2011
Seminario mongo db springdata 10-11-2011Seminario mongo db springdata 10-11-2011
Seminario mongo db springdata 10-11-2011Paradigma Digital
 
Introducción a XML: Sintaxis y documentos bien formados
Introducción a XML: Sintaxis y documentos bien formadosIntroducción a XML: Sintaxis y documentos bien formados
Introducción a XML: Sintaxis y documentos bien formadosJose Emilio Labra Gayo
 
jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009Irontec
 

La actualidad más candente (20)

Introducción a JQuery
Introducción a JQueryIntroducción a JQuery
Introducción a JQuery
 
Primer presentacion
Primer presentacion Primer presentacion
Primer presentacion
 
Hibernate - Relaciones
Hibernate - RelacionesHibernate - Relaciones
Hibernate - Relaciones
 
Dom html - java script
Dom   html - java scriptDom   html - java script
Dom html - java script
 
Introduccion a j_query
Introduccion a j_queryIntroduccion a j_query
Introduccion a j_query
 
DOM HTML Javascript
DOM HTML JavascriptDOM HTML Javascript
DOM HTML Javascript
 
Procesar estado
Procesar estadoProcesar estado
Procesar estado
 
Introduccion a DOM y AJAX - Javier Oliver Fulguera
Introduccion a DOM y AJAX  -  Javier Oliver FulgueraIntroduccion a DOM y AJAX  -  Javier Oliver Fulguera
Introduccion a DOM y AJAX - Javier Oliver Fulguera
 
Mantenimiento de Usuarios usando MVC ver1
Mantenimiento de Usuarios usando MVC ver1Mantenimiento de Usuarios usando MVC ver1
Mantenimiento de Usuarios usando MVC ver1
 
Charla Jquery
Charla JqueryCharla Jquery
Charla Jquery
 
Creación indices y constraints en bases de datos de sql server
Creación indices y constraints en bases de datos de sql serverCreación indices y constraints en bases de datos de sql server
Creación indices y constraints en bases de datos de sql server
 
Novedades de aries
Novedades de ariesNovedades de aries
Novedades de aries
 
JQuery-Tema 1
JQuery-Tema 1JQuery-Tema 1
JQuery-Tema 1
 
Guiajquery
GuiajqueryGuiajquery
Guiajquery
 
Nota
NotaNota
Nota
 
Seminario mongo db springdata 10-11-2011
Seminario mongo db springdata 10-11-2011Seminario mongo db springdata 10-11-2011
Seminario mongo db springdata 10-11-2011
 
Introduccion a Jquery
Introduccion a JqueryIntroduccion a Jquery
Introduccion a Jquery
 
Introducción a XML: Sintaxis y documentos bien formados
Introducción a XML: Sintaxis y documentos bien formadosIntroducción a XML: Sintaxis y documentos bien formados
Introducción a XML: Sintaxis y documentos bien formados
 
XML y DTDs
XML y DTDsXML y DTDs
XML y DTDs
 
jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009jQuery 1.3 Eghost Julio2009
jQuery 1.3 Eghost Julio2009
 

Similar a 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 D7Pablo López Escobés
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con HibernateMauro Gomez Mejia
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Ronald Cuello
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladoresPedro Cambra
 
Tarea_Investigacion programacion .pdf
Tarea_Investigacion programacion .pdfTarea_Investigacion programacion .pdf
Tarea_Investigacion programacion .pdfBrimmerRamrez
 
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y ValidacionesDesarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y ValidacionesDidier Granados
 
Persistencia de un modelo de objetos
Persistencia de un modelo de objetosPersistencia de un modelo de objetos
Persistencia de un modelo de objetosJorge Ercoli
 
Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Asier Marqués
 
6. Utilización del modelo de objetos del documento (DOM)
6. Utilización del modelo de objetos del documento (DOM)6. Utilización del modelo de objetos del documento (DOM)
6. Utilización del modelo de objetos del documento (DOM)Laura Folgado Galache
 
Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......SaulSalinasNeri
 
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendmenttes
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentacionesmary taipe
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentacionesmary taipe
 

Similar a Entidades en drupal 8 (20)

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
 
Doctrine2 sf2Vigo
Doctrine2 sf2VigoDoctrine2 sf2Vigo
Doctrine2 sf2Vigo
 
Persistencia de objetos con Hibernate
Persistencia de objetos con HibernatePersistencia de objetos con Hibernate
Persistencia de objetos con Hibernate
 
Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)Persistencia De Objetos(Hibernate)
Persistencia De Objetos(Hibernate)
 
Drupal7 para desarrolladores
Drupal7 para desarrolladoresDrupal7 para desarrolladores
Drupal7 para desarrolladores
 
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
 
Introduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORMIntroduccion a Doctrine 2 ORM
Introduccion a Doctrine 2 ORM
 
Tarea_Investigacion programacion .pdf
Tarea_Investigacion programacion .pdfTarea_Investigacion programacion .pdf
Tarea_Investigacion programacion .pdf
 
Novedades de aries
Novedades de ariesNovedades de aries
Novedades de aries
 
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y ValidacionesDesarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
Desarrollo de Aplicaciones Web II - Sesión 03 - Formularios y Validaciones
 
Persistencia de un modelo de objetos
Persistencia de un modelo de objetosPersistencia de un modelo de objetos
Persistencia de un modelo de objetos
 
Apuntes de DTD
Apuntes de DTDApuntes de DTD
Apuntes de DTD
 
Código mantenible, en Wordpress.
Código mantenible, en Wordpress.Código mantenible, en Wordpress.
Código mantenible, en Wordpress.
 
6. Utilización del modelo de objetos del documento (DOM)
6. Utilización del modelo de objetos del documento (DOM)6. Utilización del modelo de objetos del documento (DOM)
6. Utilización del modelo de objetos del documento (DOM)
 
Ead aplicaciones prácticas
Ead aplicaciones prácticasEad aplicaciones prácticas
Ead aplicaciones prácticas
 
Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......Programación_del_lado_del_servidor......
Programación_del_lado_del_servidor......
 
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontendCombinación ganadora: Plone como CMS, tu framework preferido como frontend
Combinación ganadora: Plone como CMS, tu framework preferido como frontend
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentaciones
 
Maria taipe..presentaciones
Maria taipe..presentacionesMaria taipe..presentaciones
Maria taipe..presentaciones
 

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
 

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
 
Cmi en drupal 8
Cmi en drupal 8Cmi en drupal 8
Cmi en drupal 8
 
¿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
 

Último

MODELO CARACTERIZACION DE PROCESOS SENA.
MODELO CARACTERIZACION DE PROCESOS SENA.MODELO CARACTERIZACION DE PROCESOS SENA.
MODELO CARACTERIZACION DE PROCESOS SENA.imejia2411
 
Buscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webBuscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webDecaunlz
 
Historia de la Medicina y bases para desarrollo de ella
Historia de la Medicina y bases para desarrollo de ellaHistoria de la Medicina y bases para desarrollo de ella
Historia de la Medicina y bases para desarrollo de ellajuancamilo3111391
 
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptx
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptxrodriguez_DelAngel_MariaGPE_M1S3AL6.pptx
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptxssuser61dda7
 
actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx
actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsxactividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx
actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx241532171
 
COMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfCOMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfOscarBlas6
 
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptx
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptxPRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptx
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptxRodriguezLucero
 
libro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdflibro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdfFAUSTODANILOCRUZCAST
 
Institucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenaInstitucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenadanielaerazok
 
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAINSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAdanielaerazok
 
institucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenainstitucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenajuniorcuellargomez
 
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfNUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfisrael garcia
 
2º SOY LECTOR PART 2- MD EDUCATIVO (6).pdf
2º SOY LECTOR PART 2- MD  EDUCATIVO (6).pdf2º SOY LECTOR PART 2- MD  EDUCATIVO (6).pdf
2º SOY LECTOR PART 2- MD EDUCATIVO (6).pdfFernandaHernandez312615
 

Último (13)

MODELO CARACTERIZACION DE PROCESOS SENA.
MODELO CARACTERIZACION DE PROCESOS SENA.MODELO CARACTERIZACION DE PROCESOS SENA.
MODELO CARACTERIZACION DE PROCESOS SENA.
 
Buscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webBuscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la web
 
Historia de la Medicina y bases para desarrollo de ella
Historia de la Medicina y bases para desarrollo de ellaHistoria de la Medicina y bases para desarrollo de ella
Historia de la Medicina y bases para desarrollo de ella
 
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptx
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptxrodriguez_DelAngel_MariaGPE_M1S3AL6.pptx
rodriguez_DelAngel_MariaGPE_M1S3AL6.pptx
 
actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx
actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsxactividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx
actividad.06_crea_un_recurso_multimedia_M01_S03_M01.ppsx
 
COMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfCOMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdf
 
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptx
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptxPRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptx
PRIMARIA 1. RESUELVE PROBLEMAS DE FORMA MOVIMIENTO Y LOCALIZACIÓN 2 (2).pptx
 
libro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdflibro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdf
 
Institucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenaInstitucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalena
 
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAINSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
 
institucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenainstitucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalena
 
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfNUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
 
2º SOY LECTOR PART 2- MD EDUCATIVO (6).pdf
2º SOY LECTOR PART 2- MD  EDUCATIVO (6).pdf2º SOY LECTOR PART 2- MD  EDUCATIVO (6).pdf
2º SOY LECTOR PART 2- MD EDUCATIVO (6).pdf
 

Entidades en drupal 8

  • 1. Entidades en Drupal 8 DrupalCamp Spain 2017
  • 2. Luis Ortiz Ramos CTO de Atenea tech luis@ateneatech.com @luisortizramos
  • 3.
  • 4. 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
  • 5.
  • 6. Dos tipos de entidades
  • 7. Configuration entities: Views, Blocks, Image styles, Menus, Rols… Forman parte de CMI Se exportan en archivos Yaml Content entities
  • 9. 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!
  • 10. ¿Qué es una entidad?
  • 11. “Entities, in Drupal, are objects that are used for persistent storage of content and configuration information.” ̶ Entity API
  • 12. “Loadable thingy, that can optionally be fieldable” ̶ Frando http://dgo.to/460320
  • 13. Así que… ¿qué es una entidad?
  • 14. A thingy … Una unidad de información estructurada: Un contenido Un usuario Un término de un vocabulario Otra estructura de datos que creemos
  • 15. … 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
  • 16. … 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.
  • 18. “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
  • 19. Entidades relevantes en el núcleo de Drupal 8
  • 20. 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
  • 21. 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
  • 22. 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
  • 23. Término Cada entidad de este tipo tiene: ID y UUID Idioma Nombre Vocabulario Descripción Término padre Peso
  • 24. Comentario Cada entidad de este tipo tiene: ID y UUID Idioma Tipo Asunto Comentario padre Entidad que se comenta y campo Autor
  • 25. Archivos Cada entidad de este tipo tiene: ID y UUID Idioma Nombre del archivo Usuario del archivo URI Tipo MIME Tamaño del archivo
  • 28. $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();
  • 30. 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();
  • 31. if ($node->isPromoted()) { $title = $node->getTitle(); } elseif ($node->isPublished()) { $node->setTitle( $node->getAuthor() ->getUsername() ); }
  • 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();
  • 35. 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();
  • 37. $entity_type = $entity_manager ->getDefinition('node'); $entity_type->id() == 'node' $entity_type ->getClass() $entity_type ->hasKey('label') $entity_type ->isSubclassOf('ContentEntityInterface')
  • 39. Tipos de entidad personalizados
  • 40. Son plugins Deben estar en Drupal/module/Entity Deben cumplir la anotación @ContentEntityType Deben implementar ContentEntityBase
  • 41. /** * Defines the comment entity class. * * @ContentEntityType( * id = "comment", * label = @Translation("Comment"), * bundle_label = @Translation("Comment type"), ...
  • 42. ... * handlers = { * "storage" = "DrupalcommentCommentStorage", * "storage_schema" = "DrupalcommentCommentStorageSchema", * "access" = "DrupalcommentCommentAccessControlHandler", * "list_builder" = "DrupalCoreEntityEntityListBuilder", * "view_builder" = "DrupalcommentCommentViewBuilder", * "views_data" = "DrupalcommentCommentViewsData", * "form" = { * "default" = "DrupalcommentCommentForm", * "delete" = "DrupalcommentFormDeleteForm" * }, * "translation" = “DrupalcommentCommentTranslationHandler" * }, ...
  • 43. ... * 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" * }, ...
  • 44. ... * 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" = {} * } * ) */
  • 45. Definen sus campos base Implementan la función baseFieldDefinitions Usan BaseFieldDefinition::create para añadir campos: Tipo de campo Propiedades Formateadores
  • 46. ... 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; } ...
  • 47. ... $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); ...
  • 48. Implementan handlers Son clases independientes del tipo de entidad Definen: Storage Access List and view builder Views data Forms
  • 49. ... * handlers = { * "storage" = "DrupalcommentCommentStorage", * "storage_schema" = "DrupalcommentCommentStorageSchema", * "access" = "DrupalcommentCommentAccessControlHandler", * "list_builder" = "DrupalCoreEntityEntityListBuilder", * "view_builder" = "DrupalcommentCommentViewBuilder", * "views_data" = "DrupalcommentCommentViewsData", * "form" = { * "default" = "DrupalcommentCommentForm", * "delete" = "DrupalcommentFormDeleteForm" * }, * "translation" = “DrupalcommentCommentTranslationHandler" * }, ...
  • 50. Handler de ejemplo: Storage Se utiliza para gestionar la persistencia de la entidad. Implementa EntityStorageInterface Implementaciones base: SqlContentEntityStorage ContentEntityNullStorage
  • 51. class CommentStorage extends SqlContentEntityStorage implements CommentStorageInterface { ... public function loadThread(...) { ... } ... }
  • 52. Entity keys Definen las claves que se usarán para cargar las entidades ContentEntityBase::baseFieldDefinitions crea campos para ellas automáticamente
  • 53. ... * entity_keys = { * "id" = "cid", * "bundle" = "comment_type", * "label" = "subject", * "langcode" = "langcode", * "uuid" = "uuid" * }, ...
  • 54. Links Define la forma de los enlaces: canonical add-form edit-form delete-form ...
  • 55. ... * links = { * "canonical" = "/comment/{comment}", * "delete-form" = "/comment/{comment}/delete", * "edit-form" = "/comment/{comment}/edit", * }, ...
  • 56. 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
  • 57. ¿Por qué crear nuevos tipos de entidades?
  • 58. 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
  • 59. Modificar tipos de entidades existentes
  • 60. 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