unb-libraries/custom-entity

一组Drupal模块,旨在简化使用自定义实体的工作。

dev-9.x-1.x 2023-07-25 11:01 UTC

This package is auto-updated.

Last update: 2024-09-25 13:18:36 UTC


README

一个改进与自定义实体一起工作的开发者体验的Drupal模块。

安装

该模块是托管在Packagist上的composer包,可以通过运行以下命令进行安装:

composer require unb-libraries/custom-entity

或者通过将其添加到您的项目中的composer.json文件中。

{
  "require": {
    "unb-libraries/custom-entity": "dev-9.x-1.x"
  }
}

通过以下命令启用模块:

drush en custom_entity

或者通过Drupal UI中的/admin/modules启用。

使用方法

该模块通过提供以下实现增强了Drupal:

访问处理器

Drupal\custom_entity\Entity\Access\EntityAccessControlHandler 动态地授予或拒绝实体访问权限,无论用户是否有<OPERATION> <ENTITY_TYPE> 实体的权限。

例如,为了使用户能够编辑node实体,用户需要分配edit node entities权限。

为了激活访问控制处理器,将其设置在实体的类型定义中

<?php

use Drupal\Core\Entity\ContentEntityBase;

/**
 * Defines the "my_entity" entity type.
 *
 * @ContentEntityType(
 *   ...
 *   handlers = {
 *     ...
 *     "access" = "Drupal\custom_entity\Entity\Access\EntityAccessControlHandler"
 *   },
 *   ...
 * ) 
 */
 class MyEntity extends ContentEntityBase {
   // ...
 }

目前处理器不支持包级别的权限检查。

权限处理器

权限处理器创建形式为 <OPERATION> (<BUNDLE>) <ENTITY_TYPE> 实体 的实体权限。按如下方式为实体类型添加权限处理器

<?php

use Drupal\Core\Entity\ContentEntityBase;

/**
 * Defines the "my_entity" entity type.
 *
 * @ContentEntityType(
 *   ...
 *   handlers = {
 *     ...
 *     "permissions" = "Drupal\custom_entity\Entity\Access\EntityPermissionsHandler"
 *   },
 *   ...
 * ) 
 */
 class MyEntity extends ContentEntityBase {
   // ...
 }

扩展 Drupal\custom_entity\Entity\Access\EntityPermissionsHandler 类以创建更多定制权限。

路由处理器

Drupal\custom_entity\Entity\Routing\HtmlRouteProvider 通过为激活它的任何实体类型提供以下附加路由来增强Drupal默认的HtmlRouteProvider

  • entity.my_entity.delete-all:创建一个表单路由来删除my_entity的所有实例,如果定义了相应的delete-all链接和表单处理器。
  • entity.my_entity.<FORM_HANDLER>:如果my_entity定义了相应的链接,则创建一个给定表单处理器的表单路由。

以下定义了一个具有 entity.my_entity.delete-allentity.my_entity.activate 路由的实体

<?php

use Drupal\Core\Entity\ContentEntityBase;

/**
 * Defines the "my_entity" entity type.
 *
 * @ContentEntityType(
 *   ...
 *   handlers = {
 *     ...
 *     "form" = {
 *       "activate" = ...
 *     "routing" = "Drupal\custom_entity\Entity\Routing\HtmlRouteProvider"
 *   },
 *   ...
 *   links = {
  *    "activate": "/my-entities/{my_entity}/activate",
 *     "delete-all-form": "/my-entities/delete-all",
 *   }
 * ) 
 */
class MyEntity extends ContentEntityBase {
  // ...
}

字段类型

以下提供了新的实体字段类型

创建者

此字段类型将初始创建者的引用添加到实体中。按如下方式将此字段添加到实体中

<?php

use Drupal\Core\Entity\ContentEntityBase;
use Drupal\custom_entity\Entity\UserCreatedInterface;
use Drupal\custom_entity\Entity\EntityCreatedTrait;

/**
 * Defines the "my_entity" entity type.
 *
 * @ContentEntityType(
 *   ...
 * )
 */
class MyEntity extends ContentEntityBase implements UserCreatedInterface {
 
  use EntityCreatedTrait;
   
  /**
   * {@inheritdoc}
   */
  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
    $fields = parent::baseFieldDefinitions($entity_type);
    
    $fields[static::FIELD_CREATOR] = static::getCreatorBaseFieldDefinition($entity_type);
    
    return $fields;
  }
}

编辑者

此字段类型将最近编辑实体的用户的引用添加到实体中。按如下方式将此字段添加到实体中

<?php

use Drupal\Core\Entity\ContentEntityBase;
use Drupal\custom_entity\Entity\UserEditedInterface;
use Drupal\custom_entity\Entity\EntityChangedTrait;

/**
 * Defines the "my_entity" entity type.
 *
 * @ContentEntityType(
 *   ...
 * )
 */
class MyEntity extends ContentEntityBase implements UserEditedInterface {
 
   use EntityChangedTrait;
   
   /**
   * {@inheritdoc}
   */
  public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
    $fields = parent::baseFieldDefinitions($entity_type);
    
    $fields[static::FIELD_CREATOR] = static::getEditorBaseFieldDefinition($entity_type);
    
    return $fields;
  }
 }

表单

以下提供了基本表单

ConfigEntityForm

带有预配置的必需的idlabel字段的配置实体基表单。如下使用:

<?php

use Drupal\custom_entity\Form\ConfigEntityForm;

/**
 * Form for "my_config_entity" entities. 
 */
class MyConfigEntityForm extends ConfigEntityForm {
   
   /**
   * {@inheritDoc}
   */
  public function buildForm(array $form, FormStateInterface $form_state) {
    $form = parent::buildForm($form, $form_state);
    
    // add additional form fields here.
    
    return $form;
  }
 }

ConfigEntityBundleForm

配置实体的基表单,这些实体是内容实体的包。在ConfigEntityForm的基础上构建,它允许对包类进行额外配置。

服务

子模块

通过激活以下任何子模块,可以添加更多功能