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 un tipo de objeto de configuración en Drupal 8

19/06/2025, by Ivan

En esta página se presenta un ejemplo de cómo crear un tipo de objeto de configuración con páginas de administración para Drupal 8. Para familiarizarse con los conceptos de configuración simple y objetos de configuración, consulte https://drupal.org/node/2120523.

Después de habilitar el módulo de ejemplo que contiene el código a continuación, el formulario de configuración de ejemplo debería estar disponible en «admin/config/system/example», como se muestra en la captura de pantalla:

2016-12-18-002716

Configuración del módulo e ingreso al menú de administración

example/example.info.yml

name: Example
description: 'Gestiona la configuración de ejemplo.'
package: Example

type: module
core: 8.x

Enrutamiento

(Consulte algunas clases auxiliares añadidas para trabajar con rutas de entidades para aprender cómo simplificar esto.)

example/example.routing.yml

El archivo routing.yml define las rutas para las páginas de administración: listado, añadir, editar, eliminar.

entity.example.collection:
  path: '/admin/config/system/example'
  defaults:
    _entity_list: 'example'
    _title: 'Configuración de ejemplo'
  requirements:
    _permission: 'administer site configuration'

entity.example.add_form:
  path: '/admin/config/system/example/add'
  defaults:
    _entity_form: 'example.add'
    _title: 'Agregar ejemplo'
  requirements:
    _permission: 'administer site configuration'

entity.example.edit_form:
  path: '/admin/config/system/example/{example}'
  defaults:
    _entity_form: 'example.edit'
    _title: 'Editar ejemplo'
  requirements:
    _permission: 'administer site configuration'

entity.example.delete_form:
  path: '/admin/config/system/example/{example}/delete'
  defaults:
    _entity_form: 'example.delete'
    _title: 'Eliminar ejemplo'
  requirements:
    _permission: 'administer site configuration'

example/example.links.menu.yml

Esto agrega un enlace a la página de configuración → Sistema

entity.example.collection:
  title: 'Ejemplo'
  parent: system.admin_config_system
  description: 'Configurar ejemplo'
  route_name: entity.example.collection

example/example.links.action.yml

Con esto, el enlace «Agregar» aparece en la página de listado.

entity.example.add_form:
  route_name: 'entity.example.add_form'
  title: 'Agregar ejemplo'
  appears_on:
    - entity.example.collection

Clases de tipos de objeto

example/src/ExampleInterface.php

Suponiendo que su entidad de configuración tenga propiedades, necesitará definir algunos métodos set/get en la interfaz.
 

namespace Drupal\example;

use Drupal\Core\Config\Entity\ConfigEntityInterface;

/**
 * Proporciona una interfaz que define una entidad Example.
 */
interface ExampleInterface extends ConfigEntityInterface {
  // Añada métodos get/set para sus propiedades de configuración aquí.
}

example/src/Entity/Example.php

Este archivo define la clase de la entidad de configuración.
 

namespace Drupal\example\Entity;

use Drupal\Core\Config\Entity\ConfigEntityBase;
use Drupal\example\ExampleInterface;

/**
 * Define la entidad Example.
 *
 * @ConfigEntityType(
 *   id = "example",
 *   label = @Translation("Example"),
 *   handlers = {
 *     "list_builder" = "Drupal\example\Controller\ExampleListBuilder",
 *     "form" = {
 *       "add" = "Drupal\example\Form\ExampleForm",
 *       "edit" = "Drupal\example\Form\ExampleForm",
 *       "delete" = "Drupal\example\Form\ExampleDeleteForm",
 *     }
 *   },
 *   config_prefix = "example",
 *   admin_permission = "administer site configuration",
 *   entity_keys = {
 *     "id" = "id",
 *     "label" = "label",
 *   },
 *   config_export = {
 *     "id",
 *     "label"
 *   },
 *   links = {
 *     "edit-form" = "/admin/config/system/example/{example}",
 *     "delete-form" = "/admin/config/system/example/{example}/delete",
 *   }
 * )
 */
class Example extends ConfigEntityBase implements ExampleInterface {

  /**
   * El ID del Example.
   *
   * @var string
   */
  public $id;

  /**
   * La etiqueta del Example.
   *
   * @var string
   */
  public $label;

  // Aquí irán sus métodos específicos get/set de propiedades de configuración,
  // implementando la interfaz.
}

La clave admin_permission automáticamente otorga acceso a todos los usuarios con ese permiso. Si se requiere más lógica, se puede especificar un controlador de acceso personalizado.

A partir de Drupal 8.6.x se recomienda que todos los tipos de objetos de configuración tengan la propiedad config_export en sus anotaciones (véase: https://www.drupal.org/node/2949023).

Archivo de esquema de configuración

example/config/schema/example.schema.yml

example.example.*:
  type: config_entity
  label: 'Configuración de ejemplo'
  mapping:
    id:
      type: string
      label: 'ID'
    label:
      type: label
      label: 'Etiqueta'

En example.schema.yml agregue las propiedades/atributos definidos en \Drupal\example\Entity\Example

example.example.* es la variable de configuración que referencia las propiedades/atributos de nuestra clase, y puede indicar otro nombre de variable para su entidad añadiendo «config_prefix», por ejemplo:

@ConfigEntityType(
..
... config_prefix = "variable_name" ...

entonces puede referirse a esto así:

example.variable_name.*: ....

Para más información sobre esquemas de configuración consulte Esquema de configuración/Metadatos

Clases de entidades

example/src/Form/ExampleForm.php

namespace Drupal\example\Form;

use Drupal\Core\Entity\EntityForm;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Form\FormStateInterface;
use Drupal\Core\Messenger\MessengerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;

/**
 * Controlador de formulario para los formularios de añadir y editar Example.
 */
class ExampleForm extends EntityForm {

  /**
   * Construye un objeto ExampleForm.
   *
   * @param \Drupal\Core\Entity\EntityTypeManagerInterface $entityTypeManager
   *   El entityTypeManager.
   */
  public function __construct(EntityTypeManagerInterface $entityTypeManager) {
    $this->entityTypeManager = $entityTypeManager;
  }

  /**
   * {@inheritdoc}
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('entity_type.manager')
    );
  }

  /**
   * {@inheritdoc}
   */
  public function form(array $form, FormStateInterface $form_state) {
    $form = parent::form($form, $form_state);

    $example = $this->entity;

    $form['label'] = [
      '#type' => 'textfield',
      '#title' => $this->t('Etiqueta'),
      '#maxlength' => 255,
      '#default_value' => $example->label(),
      '#description' => $this->t("Etiqueta para el Example."),
      '#required' => TRUE,
    ];
    $form['id'] = [
      '#type' => 'machine_name',
      '#default_value' => $example->id(),
      '#machine_name' => [
        'exists' => [$this, 'exist'],
      ],
      '#disabled' => !$example->isNew(),
    ];

    // Necesitará elementos de formulario adicionales para sus propiedades personalizadas.
    return $form;
  }

  /**
   * {@inheritdoc}
   */
  public function save(array $form, FormStateInterface $form_state) {
    $example = $this->entity;
    $status = $example->save();

    if ($status === SAVED_NEW) {
      $this->messenger()->addMessage($this->t('El Example %label ha sido creado.', [
        '%label' => $example->label(),
      ]));
    }
    else {
      $this->messenger()->addMessage($this->t('El Example %label ha sido actualizado.', [
        '%label' => $example->label(),
      ]));
    }

    $form_state->setRedirect('entity.example.collection');
  }

  /**
   * Función auxiliar para comprobar si una entidad de configuración Example existe.
   */
  public function exist($id) {
    $entity = $this->entityTypeManager->getStorage('example')->getQuery()
      ->condition('id', $id)
      ->execute();
    return (bool) $entity;
  }

}

example/src/Controller/ExampleListBuilder.php

namespace Drupal\example\Controller;

use Drupal\Core\Config\Entity\ConfigEntityListBuilder;
use Drupal\Core\Entity\EntityInterface;

/**
 * Proporciona una lista de Example.
 */
class ExampleListBuilder extends ConfigEntityListBuilder {

  /**
   * {@inheritdoc}
   */
  public function buildHeader() {
    $header['label'] = $this->t('Example');
    $header['id'] = $this->t('Nombre de máquina');
    return $header + parent::buildHeader();
  }

  /**
   * {@inheritdoc}
   */
  public function buildRow(EntityInterface $entity) {
    $row['label'] = $entity->label();
    $row['id'] = $entity->id();

    // Probablemente quiera añadir algunas propiedades más aquí...

    return $row + parent::buildRow($entity);
  }

}

example/src/Form/ExampleDeleteForm.php
 

namespace Drupal\example\Form;

use Drupal\Core\Entity\EntityConfirmFormBase;
use Drupal\Core\Url;
use Drupal\Core\Form\FormStateInterface;

/**
 * Construye el formulario para eliminar un Example.
 */
class ExampleDeleteForm extends EntityConfirmFormBase {

  /**
   * {@inheritdoc}
   */
  public function getQuestion() {
    return $this->t('¿Está seguro que desea eliminar %name?', array('%name' => $this->entity->label()));
  }

  /**
   * {@inheritdoc}
   */
  public function getCancelUrl() {
    return new Url('entity.example.collection');
  }

  /**
   * {@inheritdoc}
   */
  public function getConfirmText() {
    return $this->t('Eliminar');
  }

  /**
   * {@inheritdoc}
   */
  public function submitForm(array &$form, FormStateInterface $form_state) {
    $this->entity->delete();
    $this->messenger()->addMessage($this->t('La entidad %label ha sido eliminada.', array('%label' => $this->entity->label())));

    $form_state->setRedirectUrl($this->getCancelUrl());
  }
}

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.