logo

Extra Block Types (EBT) - Nueva experiencia con Layout Builder❗

Extra Block Types (EBT): tipos de bloques con estilo y personalizables: Presentaciones de diapositivas, Pestañas, Tarjetas, Acordeones y muchos más. Configuraciones integradas para fondo, DOM Box y plugins de JavaScript. Experimenta hoy el futuro de la construcción de diseños.

Módulos de demostración EBT Descargar módulos EBT

❗Extra Paragraph Types (EPT) - Nueva experiencia con Paragraphs

Extra Paragraph Types (EPT): conjunto de módulos basado en párrafos de forma análoga.

Módulos de demostración EPT Descargar módulos EPT

Scroll

Creación de contenido personalizado

18/06/2025, by Ivan

Público objetivo

Esta documentación está dirigida principalmente a desarrolladores con experiencia en programación orientada a objetos en PHP, Drupal 6 o Drupal 7, así como a quienes desean aprender los principios de Drupal 8.

La documentación para crear un tipo de entidad de contenido en Drupal 8 incluye una lista completa de opciones disponibles.

Construcción de un tipo de contenido sin bundles en Drupal 8.

En este caso, creamos un objeto de contenido Drupal 8 que no tiene bundles.

La entidad no implementa la API de campos, por lo que permanece en el código. Sin embargo, puede ser un buen esqueleto para construir Content Entities, ya que luego importaremos datos más complejos.

Finalmente, cuando hay conceptos de OOP, referiré a la documentación correspondiente.

Antecedentes.

Nuestro módulo se llama advertiser.
Nuestro tipo de entidad de contenido se llama advertiser.

Nuestro nuevo contenido de entidad advertiser en Drupal 8 tendrá los campos:
- UUID
- ID

Definición del objeto de contenido en Drupal 8.

Primero, todos los objetos personalizados ahora viven en modules/custom en lugar de sites/all/modules/custom.

Dentro de nuestra entidad personalizada, la estructura de archivos final será:

modules/custom/advertiser$
├── advertiser.info.yml
└── src
    └── Entity
         └── Advertiser.php

Como referencia, puede revisar la entidad Advertiser terminada junto con extensiones adicionales, como pruebas y plugins de restricciones, pero por ahora todo será más simple.

Archivo info

Comenzamos definiendo nuestro módulo personalizado en module_name.info.yml. Es autoexplicativo:

name: Advertiser
type: module
description: 'Entidad advertiser básica'
package: custom
core: 8.x

Esqueleto de la entidad

Mientras tanto, la clase base de la entidad Advertiser y el esquema relacionado se definen en src/Entity/Advertiser.php.

Lo primero que hacemos es definir el namespace para nuestra clase de entidad Advertiser. Esto será útil cuando queramos usar nuestras clases.

namespace Drupal\advertiser\Entity;

Ahora es momento de definir nuestra entidad, lo hacemos en la anotación.

Esta es la definición real del tipo de objeto que se lee y almacena en caché, así que asegúrese de limpiar la caché tras cualquier cambio.
<?php
/**
 * Define la entidad advertiser.
 *
 * @ingroup advertiser
 *
 * @ContentEntityType(
 *   id = "advertiser",
 *   label = @Translation("Advertiser"),
 *   base_table = "advertiser",
 *   entity_keys = {
 *     "id" = "id",
 *     "uuid" = "uuid",
 *   },
 * )
 */
?>

Dado que esta es una entidad básica, usamos solo algunas propiedades, no handlers como el módulo Access.

Tenemos un módulo funcional que define nuestra entidad personalizada de contenido, pero veremos que la tabla "advertiser" no se ha creado en la base de datos.

$ drush sql-cli
mysql> SHOW TABLES;

Esto sucede porque nuestra clase no tiene métodos que interactúen explícitamente con la base de datos. Además, necesitamos describir los métodos mínimos necesarios para que la entidad interactúe adecuadamente con la base de datos.

ContentEntityBase

Normalmente, podemos añadir clases agregando algo como use Drupal\Core\Entity\ContentEntityBase; después de definir el namespace en la parte superior de nuestro archivo. Esto hace que esos métodos estén disponibles para nuestra propia clase, que puede extenderlos o, en el caso de interfaces, implementarlos.

Hacemos dos cosas: extendemos la clase existente ContentEntityBase, que ya tiene los métodos necesarios para interactuar con la base de datos, y implementamos ContentEntityInterface para describir...

los métodos que necesitamos para acceder a nuestra base de datos. Esto NO describe cómo lo hacemos. Eso es lo que hace la clase IMPLEMENTADORA. Podemos IMPLEMENTAR esta interfaz tantas veces como queramos, de muchas formas diferentes según lo necesitemos. Luego podemos cambiar entre implementaciones de la interfaz sin afectar nuestro código, porque la interfaz define cómo la usaremos sin importar cómo funcione realmente. - https://secure.php.net/manual/en/language.oop5.interfaces.php

Todo esto significa que tenemos lo siguiente: Consejo: No olvide añadir nuevas clases con la declaración use en la parte superior de su archivo:

class Advertiser extends ContentEntityBase implements ContentEntityInterface {

Pero aún necesitamos usar esos nuevos métodos útiles para guardar datos en la base de datos, empezaremos con los campos básicos para nuestra entidad.

baseFieldDefinitions

El método baseFieldDefinitions proviene de la clase ContentEntityBase, que extendemos.
Requiere un parámetro:

Definición del tipo de objeto. Útil cuando una clase es usada para varios tipos de objetos posiblemente dinámicos.

Y devuelve:

Un arreglo de definiciones base de campos para el tipo de objeto, indexado por nombre del campo.

Así que lo implementamos así:

<?php
public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {

    // Campo estándar, usado como único si es índice primario.
    $fields['id'] = BaseFieldDefinition::create('integer')
      ->setLabel(t('ID'))
      ->setDescription(t('El ID de la entidad Advertiser.'))
      ->setReadOnly(TRUE);

    // Campo estándar, único fuera del alcance del proyecto actual.
    $fields['uuid'] = BaseFieldDefinition::create('uuid')
      ->setLabel(t('UUID'))
      ->setDescription(t('El UUID de la entidad Advertiser.'))
      ->setReadOnly(TRUE);
      
    return $fields;
  }
?>

Vale la pena señalar que:

BaseFieldDefinitions

“Proporciona definiciones base de campo para un tipo de objeto”.

- Es un método estático público de FieldableEntityInterface.

BaseFieldDefinition

“Clase para definir campos de entidades”.

- Todos los métodos que necesitamos para crear campos, añadir restricciones, etc.

Entidad completa

Entonces, en resumen, tenemos esto:

<?php

namespace Drupal\advertiser\Entity;

use Drupal\Core\Entity\ContentEntityBase;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\ContentEntityInterface;

/**
 * Define la entidad advertiser.
 *
 * @ingroup advertiser
 *
 * @ContentEntityType(
 *   id = "advertiser",
 *   label = @Translation("Advertiser"),
 *   base_table = "advertiser",
 *   entity_keys = {
 *     "id" = "id",
 *     "uuid" = "uuid",
 *   },
 * )
 */

class Advertiser extends ContentEntityBase implements ContentEntityInterface {

  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {

    // Campo estándar, usado como único si es índice primario.
    $fields['id'] = BaseFieldDefinition::create('integer')
      ->setLabel(t('ID'))
      ->setDescription(t('El ID de la entidad Advertiser.'))
      ->setReadOnly(TRUE);

    // Campo estándar, único fuera del alcance del proyecto actual.
    $fields['uuid'] = BaseFieldDefinition::create('uuid')
      ->setLabel(t('UUID'))
      ->setDescription(t('El UUID de la entidad Advertiser.'))
      ->setReadOnly(TRUE);

    return $fields;
  }
}
?>

Después de habilitar su módulo, debería ver que la tabla "advertiser" se ha agregado a la base de datos.

$ drush sql-cli
mysql> SHOW TABLES;

o

drush sqlq "show tables like 'advertiser'"
drush sqlq "describe advertiser"

Si su módulo ya está habilitado, deberá ejecutar una actualización de entidades.

En el issue #2976035: Las operaciones CRUD con tipos de entidad deben usar la última definición de entidad y almacenamiento de campos instalada, se eliminó la posibilidad de ejecución remota bajo demanda, consulte más detalles en la nota de cambios correspondiente.

Por favor, consulte el módulo Devel Entity Updates.

Drupal’s online documentation is © 2000-2020 by the individual contributors and can be used in accordance with the Creative Commons License, Attribution-ShareAlike 2.0. PHP code is distributed under the GNU General Public License.