Custom entities in D8
Custom entities in D8
DrupalDay Santiago de compostela 2016
Samuel Solís (@estoyausente)
@estoyausenteSamuel Solís
Drupalday Santiago 2017 @estoyausente
Drupalday Santiago 2017 @estoyausente
¿Qué vamos a ver? ¿Qué es un tipo de entidad? De contenido vs de configuración Algo de terminología Definición del tipo de entidad en bd Formularios Validaciones Renderizar entidades
Drupalday Santiago 2017 @estoyausente
¿Qué es un tipo de entidad?
Un tipo de entidad es una clase que tiene métodos y manejadores definidos para almacenar, listar, cargar y mostrar una estructura de datos de forma unificada.
“
Drupalday Santiago 2017 @estoyausente
¿Qué es un tipo de entidad?
Un tipo de entidad es una clase que tiene métodos y manejadores definidos para almacenar, listar, cargar y mostrar una estructura de datos de forma unificada.
“WTF????
Drupalday Santiago 2017 @estoyausente
Config Content
EntitiesContent types
Views
Contact forms
Image styles
Nodes
Comments
Profiles
Terms
.yml files
CMI
Drupalday Santiago 2017 @estoyausente
Config Content
EntitiesContent types
Views
Contact forms
Image styles
Nodes
Comments
Profiles
Terms
.yml files
CMI
Drupalday Santiago 2017 @estoyausente
Algo de terminología
Bundle Field
PropertyEntity typenode author
Page Imagen
Drupalday Santiago 2017 @estoyausente
Drupalday Santiago 2017 @estoyausente
Definición del Tipo de Entidad
Anotación Definición de la clase método baseFieldDefinitions
MiDrupal$
/** * @ContentEntityType( * id = "galician", * label = @Translation(“Galician"), * handlers = { * }, * }, * base_table = “galicians", * admin_permission = "administer galician people", * fieldable = FALSE, * entity_keys = { * "id" = "id", * }, * admin_permission = “administer galicians” * ) */
vim src/Entity/Galician.php
MiDrupal$ vim src/Entity/MyEntity.php
namespace Drupal\galician\Entity; use Drupal\Core\Field\BaseFieldDefinition; use Drupal\Core\Entity\ContentEntityBase; . . .
class Galician extends ContentEntityBase { use StringTranslationTrait;
}
vim src/Entity/Galician.php
MiDrupal$ vim src/Entity/MyEntity.php
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
$fields['id'] = BaseFieldDefinition::create('integer') ->setLabel(t('ID')) ->setDescription(t('The ID of the galician person.')) ->setReadOnly(TRUE);
$fields['clothing'] = BaseFieldDefinition::create('string') ->setLabel(t('From')) ->setDescription(t(‘Galician clothing.’)
->setSettings(array( 'default_value' => 'Raincoat',
)) ->setRequired(true);
$fields['created'] = BaseFieldDefinition::create('created') ->setLabel(t('Created')) ->setDescription(t('The time that the entity was created.'));
}
vim src/Entity/Galician.php
MiDrupal$
$fields['province'] = BaseFieldDefinition::create('entity_reference') ->setLabel(t('Province id.')) ->setDescription(t('The Pid of the associated province.')) ->setSetting('target_type', 'province') ->setSetting('handler', 'default');
vim src/Entity/Galician.php
MiDrupal$
public function getClothing() {} public function setClothing() {} public function getOwner() {} public function preSave() {} public function postSave() {} public function preCreate() {} . . .
vim src/Entity/Galician.php
MiDrupal$
public function eatPrawns($num) {
//eat a boat of prawns.
return true; }
vim src/Entity/Galician.php
drush en miModulo
drush entity-updates
MiDrupal$ vim any/other/Place.php
$galicianIds = \Drupal::entityQuery('galician') ->condition(‘clothing’,’raincoat' , '<>') ->sort('date', 'DESC') ->execute(); }
//Dirty and easy way $galicians = \Drupal::entityTypeManager() ->getStorage(‘galician')->loadMultiple($galicianIds);
//Dependency Injection way $galicians = $this->GalicianStorageController —>loadMultiple($orderIds);
foreach($galicians as $galician) { $galician->eatPrawns(100000); }
$galician->save();
Drupalday Santiago 2017 @estoyausente
Formularios
Drupalday Santiago 2017 @estoyausente
Formularios
MiDrupal$
/** * @ContentEntityType( * id = "galician", * … some stuff * handlers = { * "form" = { * "add" = "Drupal\galicia\Form\GalicianForm", * "edit" = "Drupal\galicia\Form\GalicianForm", * "delete" = “Drupal\Core\Entity\ContentEntityDeleteForm", * }, * }, * }, * some stuff … * ) */
vim src/Entity/Galician.php
MiDrupal$ vim src/Entity/MyEntity.php
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
$fields['clothing'] = BaseFieldDefinition::create('string') ->setLabel(t('From')) ->setDescription(t(‘Galician clothing.’)
->setSettings([( 'default_value' => 'Raincoat',
]) ->setDisplayConfigurable('Form', true) ->setDisplayOptions('Form', [ 'weigth' => 2, ])
->setRequired(true);
}
vim src/Entity/Galician.php
MiDrupal$
namespace Drupal\galician\Form; use Drupal\Core\Entity\ContentEntityForm; use Drupal\Core\Form\FormStateInterface;
class GalicianForm extends ContentEntityForm {
public function buildForm(array $form, FormStateInterface $form_state) { $form = parent::buildForm($form, $form_state); if(isSunny()) { // <— if(false) $form[‘clothing']['widget'][0]['default_value'] = ‘heat'; } return $form; }
public function submitForm(array &$form, FormStateInterface $form_state) { parent::submitForm($form, $form_state);
} }
vim src/Form/GalicianForm.php
MiDrupal$
entity.galician.galician_add: path: '/galician/add' defaults: _entity_form: galician.add _title: ‘Create a new Galician person' requirements: _entity_create_access: 'galician'entity.galician.galician_add: path: '/galician/{galician}/edit' defaults: _entity_form: galician.edit _title: 'Edit Galician' requirements: _permission: 'administer galician entity'
vim galician.routing.yml
Tia na naaaaa …
Algunos gallegos creados …
Algunos gallegos creados …
Mario Casas
Rouco Varela
Algunos gallegos creados …
Mario Casas
Rouco Varela
Algunos gallegos creados …
Mario Casas
Mariano Rajoy
Rouco Varela
Mario Conde
Algunos gallegos creados …
Mario Casas
Mariano Rajoy
Drupalday Santiago 2017 @estoyausente
Validaciones
Campos Entidad
MiDrupal$ vim src/Entity/MyEntity.php
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
$fields['clothing'] = BaseFieldDefinition::create('string') ->setLabel(t('From')) ->setDescription($this->t('Galician clothing.')
->setSettings(array( 'default_value' => 'Raincoat',
)) ->addConstrain('Length', ['mas' => 20]) ->setRequired(true);
}
vim src/Entity/Galician.php
Campos
MiDrupal$
* @ContentEntityType( * id = "galician", * constraints = { * "Galician" = {} * } * )
vim src/Entity/Galician.php
Entidad
MiDrupal$
namespace Drupal\galician\Plugin\Validation\Constraint; use Symfony\Component\Validator\Constraint;
/** * Supports validating comment author names. * * @Constraint( * id = "Galician", * label = @Translation("Galician validation", context = "Validation"), * type = "entity:galician" * ) */ class GalicianConstraint extends Constraint { public $messageDate = ‘Date must be 12-11-2016’; public $messageClothing = ‘You aren\’t a real Galician!!’; }
vim src/Plugin/Validation/Contraint/GalicianConstraint.php
MiDrupal$ vim src/Plugin/Validation/Contraint/GalicianConstraintValidator.php
namespace Drupal\galician\Plugin\Validation\Constraint; use Symfony\Component\Validator\Constraint; use Symfony\Component\Validator\ConstraintValidator;
class GalicianConstraintValidator extends ConstraintValidator {
public function validate($entity, Constraint $constraint) {
if($entity->date != ’12-11-2016’) { $this->context->buildViolation($constraint->messageDate) ->addViolation(); }
if($entity->clothing != ‘raincoat’) { $this->context->buildViolation($constraint->messageClothing) ->addViolation(); } } }
Drupalday Santiago 2017 @estoyausente
Renderizar entidades
Completas Listados
MiDrupal$
$fields['clothing'] = BaseFieldDefinition::create('string') ->setLabel(t('From')) ->setDescription($this->t('Galician clothing.')
->addConstrain('Length', ['mas' => 20]) ->setRequired(true);
->setDisplayConfigurable('view', TRUE) ->setDisplayOptions('view', [ 'label' => 'above', 'type' => 'string', 'weight' => 1, ]);
vim src/Entity/Galician.php
Completas
MiDrupal$
/** * @ContentEntityType( * id = "galician", * … some stuff * handlers = { * "list_builder” = “Drupal\galician\Controller\GalicianListBuilder”, * “view_builder” = “Drupal\Core\Entity\EntityViewBuilder” * }, * }, * some stuff … * ) */
vim src/Entity/Galician.php
Listados
MiDrupal$ vim src/GalicianListBuilder.php
namespace Drupal\galician\Entity\Controller;
use Drupal\Core\Entity\EntityInterface; use Drupal\Core\Entity\EntityListBuilder;
class GalicianListBuilder extends EntityListBuilder { public function render() {
$build['description'] = array( '#markup' => $this->t('Galician list.'), ); $build['table'] = parent::render(); return $build; }
public function buildHeader() { $header['id'] = $this->t('Order id'); $header['clothing'] = $this->t('Clothing'); return $header + parent::buildHeader(); }
public function buildRow(EntityInterface $entity) { $row['id'] = $entity->id(); $row['clothing'] = $entity->clothing->value; return $row + parent::buildRow($entity); } } Listados
drush entity-updates
drush cr
Tia na naaaaa …
Algunos gallegos creados …
Michel Salgado
Algunos gallegos creados …
Rosalía de Castro
Michel Salgado
Algunos gallegos creados …
Rosalía de Castro
Michel Salgado
Camilo José Cela
Algunos gallegos creados …
Rosalía de Castro
Michel Salgado
Camilo José Cela
Agustín Jimenez
Algunos gallegos creados …
Rosalía de Castro
Michel Salgado
Camilo José Cela
Algunos gallegos creados …
Rosalía de Castro
Michel Salgado
Camilo José Cela Adolfo Dominguez
Algunos gallegos creados …
Drupalday Santiago 2017 @estoyausente
Para otro día
Otros maneadores disponibles (storage, access, …) Bundles y fields Traducciones Revisiones Extensión de entidades existentes …
Drupalday Santiago 2017 @estoyausente
Referencias
Core La documentación de
drupal.org Módulo Examples Drupal console (Aunque suele generar
bastante más de lo que necesitamos)Utilidad
Drupalday Santiago 2017 @estoyausente
Coffee break!
@estoyausenteSamuel Solís
Nos vemos en IRC #drupal-es
Top Related