如何在自定义实体的多个字段上以编程方式配置唯一的约束? -- 8 领域 和 entities 领域 和 drupal-console 领域 drupal 相关 的问题

How to configure programmatically a unique constraint on several fields of a custom entity?


3
vote

问题

中文

如何在我已创建的自定义实体的几个字段上配置唯一的约束,我已经创建了drupalconsole。

目的不是允许同一实体的两个记录的插入具有例如相同的姓氏和fisrtname。

英文原文

How could I configure a unique constraint on several fields of a custom entity I have already created with drupalconsole.

The purpose is not allowing insert of two record of the same entity having for example same lastname and fisrtname.

        

回答列表

3
 
vote
vote
最佳答案
 

如elstevenson所示,我使用了验证API。

这里的步骤。

  1. 在Modum Repo中创建存储库。 / src / plugin /验证/约束
  2. 创建约束(name =唯一)

      namespace Drupalmodule_namePluginValidationConstraint; use SymfonyComponentValidatorConstraint;  /** * @Constraint( *   id = "Unique", *   label = @Translation("Unique ", context = "Validation"), *   type = "entity:entity_name"` * ) */   class UniqueConstraint extends Constraint {    public $message= 'Unique entity!';    }   
  3. 创建一个contramevalidator,我们使用实体查询填充验证方法,以确保没有具有相同的字段1和字段2的记录:

       namespace Drupalmodule_namePluginValidationConstraint;  use SymfonyComponentValidatorConstraint;  use SymfonyComponentValidatorConstraintValidator;  class UniqueConstraintValidator extends ConstraintValidator {  /**  * {@inheritdoc}  */ public function validate($entity, Constraint $constraint) {  $field1 = $entity->field1->value;  $field2 = $entity->field2->value;  $entity_type_id = $entity->getEntityTypeId();  $value_taken = (bool) Drupal::entityQuery($entity_type_id)   ->condition('field1',  $field1)   ->condition('field2',  $field2)   ->range(0, 1)   ->count()   ->execute(); if ($value_taken) { $this->context->addViolation($constraint->message);  }   

    }

  4. 然后在我们的实体(注释部分)中配置我们的约束:

/ **

  * Defines the entity_name entity.  *      * @ingroup entity_name     *     * @ContentEntityType(     *   id = "entity_name",     *   label = @Translation("entity_name"),     *   handlers = {     *     ...     *     "form" = {     *     ..     *     },     *  ....     *       *   constraints = {     *     "Unique" = {}     *   }     * )     */   
    然后,您应该卸载模块,然后重新安装它。 (如果您的实体被数据填充,则必须删除所有日期)。
  1. 在您的代码中(例如在您的表单中),您必须确保验证:

      $violations = $entity->validate(); if ($violations->count() > 0)  {  $violation = $violations[0];   drupal_set_message($violation->getMessage(),'warning'); }   

希望它会有所帮助。

 

As suggested by elstevenson, I used the validation API.

Here the steps.

  1. Create a repository in your module repo. /src/Plugin/Validation/Constraint
  2. Create a constraint (name = Unique)

    namespace Drupal\module_name\Plugin\Validation\Constraint; use Symfony\Component\Validator\Constraint;  /** * @Constraint( *   id = "Unique", *   label = @Translation("Unique ", context = "Validation"), *   type = "entity:entity_name"` * ) */   class UniqueConstraint extends Constraint {    public $message= 'Unique entity!';    } 
  3. Create a constraintValidator, and we populate the validate method with an entity query to make sure that there is no record having the same value of field1 and field 2:

     namespace Drupal\module_name\Plugin\Validation\Constraint;  use Symfony\Component\Validator\Constraint;  use Symfony\Component\Validator\ConstraintValidator;  class UniqueConstraintValidator extends ConstraintValidator {  /**  * {@inheritdoc}  */ public function validate($entity, Constraint $constraint) {  $field1 = $entity->field1->value;  $field2 = $entity->field2->value;  $entity_type_id = $entity->getEntityTypeId();  $value_taken = (bool) \Drupal::entityQuery($entity_type_id)   ->condition('field1',  $field1)   ->condition('field2',  $field2)   ->range(0, 1)   ->count()   ->execute(); if ($value_taken) { $this->context->addViolation($constraint->message);  } 

    } }

  4. Then configure our constraint in our entity (annotations part):

/**

* Defines the entity_name entity.  *      * @ingroup entity_name     *     * @ContentEntityType(     *   id = "entity_name",     *   label = @Translation("entity_name"),     *   handlers = {     *     ...     *     "form" = {     *     ..     *     },     *  ....     *       *   constraints = {     *     "Unique" = {}     *   }     * )     */ 
  1. Then you should uninstall your module and then reinstall it . (if your entity is populated with data, you have to delete all the date).
  2. In your code (for example in your form) , you have to ensure the validation :

    $violations = $entity->validate(); if ($violations->count() > 0)  {  $violation = $violations[0];   drupal_set_message($violation->getMessage(),'warning'); } 

Hope it will help.

 
 
   
   
1
 
vote

我稍前地问了类似的东西:使用实体验证API使用实体验证API(如果其他字段= X),则如何执行" 所需的"所需的" 。

基本上,您要使用实体验证API为表单创建验证插件。

 

I asked something similar a little while ago: How do I do a 'required if other field = x' using the entity validation api?

Basically, you want to use the Entity Validation API to create a Validation Plugin for your form.

 
 
   
   

相关问题

9  如何以编程方式忘记通过电子邮件?  ( How to send forget pass email programatically ) 
我在我的一个项目中实现了解耦的drupal,我需要实现的一个功能之一是 forget password 功能。因此,我创建了一个自定义路由来收听请求重置密码。 我知道我可以使用 user_pass_reset_url() ;我可以生成此链接并以编程方式将电子邮件设置为该用户,但我正在寻找一个服务或Drupal核心...

4  如何跳过匿名用户上传文件上传的推荐释录约束?  ( How to skip the referenceaccess constraint on a file upload by an anonymous user ) 
我有一个有关作业应用程序的联系表单,其中包含文件字段,因此用户可以上传其CV。由于隐私/安全性,必须将上传的CV存储在私有文件系统中。 不幸的是,当匿名用户尝试添加CV并提交表单时,会出现问题。由于匿名用户无法访问上载文件,因此文件字段的引用仪式约束( DrupalCoreEntityPluginValidation...

11  如何设置cookie寿命?  ( How do i set the cookie lifetime ) 
我无法在D8实例中设置cookie生命周期。我想将它设置为零,以便关闭浏览器注销用户。 我已添加 ini_set('session.cookie_lifetime', 0); 到站点/默认/设置.php文件。在文件中没有以前的cookie_lifeTime引用。我加了行。我还清除了Drupal缓存并清除了Chrome...

6  从用户名或电子邮件中获取用户ID而不登录  ( Get user id from username or email without logging in ) 
我想在用户登录之前获取用户ID和角色。如果我有电子邮件或用户名,我可以与D8一起使用什么功能以获取用户ID? ...

1  展示顶级书籍,在书籍导航块  ( Display top level of book in book navigation block ) 
在我的主题中.Theme文件我有书导航块存储在枝条变量中如此。 function mytheme_preprocess_page(&$variables){ $book = DrupallockEntityBlock::load('booknavigation'); $variables['bo...

4  如何使用Ajax验证的表格?  ( How can i get the form validated with ajax ) 
我正在构建加载Ajax的非常简单的表单,并与基础显示。我可以获得表单提交要使用AJAX,并更新显示内部的标记,但使用Ajax供电的提交按钮,未执行验证方法。 为什么?如何使用Ajax验证的表格? 我只想要正常的形式验证过程,在那里我可以将自己的验证添加到 ::validateForm ,然后将控制传递给我的ajax...

5  当前登录用户  ( Get currently logged in user ) 
我面临几乎类似的问题,如果我这样做: $userCurrent = Drupal::currentUser(); $name = $userCurrent->getUsername(); 我获取网站帐户名称而不是登录用户。这是获取此事项的已登录用户名或角色的正确方法。我甚至尝试过: $user = D...

0  为什么要在hook_form_alter()中触发的自定义验证处理程序?  ( Why isnt the custom validation handler fired in hook form alter ) 
我正在使用以下代码向节点编辑表单添加自定义验证处理程序。 function my_module_form_alter(&$form, DrupalCoreFormFormStateInterface $form_state, $form_id) { if ($form_id != 'node_article_...

1  从搜索中删除某些内容类型  ( Remove certain content types from search ) 
存在某些内容类型,例如我不想出现在搜索结果页面上的书籍页面。 我找到了在此处在Drupal 7上实现此操作的示例代码 /** * Implements hook_query_alter(). * removes content types defined in the excluded_content_typ...

4  在Ajax回调中使用form_state-> set(),但无法在回调之外返回值  ( Using form state set inside ajax callback but cannot get the value back outsi ) 
我想添加一些任意变量来将其存储在form_state中并在我的一个Ajax回调函数中再次使用它我设置了名为var:的属性 public function MyFunctionCallback(array &$form, FormStateInterface &$form_state) { .... $terms ...

1  在视图中的日期字段上过滤“从现在到现在到现在+ 1年”的条件  ( Filter condition like from now to now1 year on a date field in views ) 
我有一个自定义实体与(等)这样的字段定义: $fields['datedistribution'] = BaseFieldDefinition::create('datetime') ->setLabel(t('Date distribution')) ->setSetting('datetime_typ...

6  改变块内容  ( Alter block content ) 
我正在尝试改变自定义模块块,而不会成功。我的块类是下面的。 class BreadcrumbBlock extends BlockBase { public function build() { return [ '#theme' => 'breadcrumb_block', ...

3  如何将HTML标记添加到菜单标题中?  ( How can i add html tags into menu title ) 
如何将HTML标记添加到菜单标题中? 我还尝试了以下代码。 function adminimal_theme_preprocess_menu(&$vars) { if ($vars['menu_name'] === 'main') { $vars['items']['standard.front_p...

3  如何定制形式?  ( How do i theme a custom form ) 
我使用简单的类别"myformtestform" 生成一个简单的模块"myformtest" 。我想为表格使用不同的主题。 我遵循这个伟大的教程。我在"myformtest.module" 中添加了一个"_theme_suggestions_alter" 钩子,我激活了Twig调试,我加载了表单页面。 我的...

2  如何动态删除实体约束?  ( How can i dynamically remove an entity constraint ) 
我正在研究D8的单一登录模块,并希望禁用用户编辑表单上的密码字段,因为密码应该由外部身份提供程序管理而不是通过Drupal管理。 drupal将"当前密码" 字段添加到编辑页面,如果用户想要更改其电子邮件地址,则需要。我可以在hook_form_alter中轻松删除字段,但是如果未填写密码字段,则运行和失败验证的表...

2  为什么未命名的<div>被添加到特定区域?  ( Why a unnamed div is added to a specific region ) 
我有2个街区坐在一个名为"标题" 的区域。 drupal 8似乎将这2个块添加到一个未命名的div中,因此取消了它们的 display:flex CSS布局(如果这些,则不能捕获2个容器项)。< / p> 请参阅附图以确保您了解我。 我不知道这个被检查的div来自哪里。我不记得自己添加它。只有因为它似乎是由D...

9  如何在节点编辑表单上禁用标题字段?  ( How to disable the title field on the node edit form ) 
如何隐藏或禁用节点编辑表单上的标题字段? 如果我从内容类型管理表单显示选项卡( 99887663 ),那么我会在日志中获得一些完整性约束错误。 所以我不想在节点编辑表单中显示默认标题字段。如果我常常像其他字段一样隐藏标题字段。在创建节点后得到了白色屏幕。并且日志说标题字段不能为null ....等等... ...

6  如何以编程方式获取文件描述?  ( How to get the file description programmatically ) 
在drupal 8,如drupal 7,您可以在文件字段设置中启用文件说明。 但是一旦我的文件实体加载到我的预处理中,我不知道如何获得为我的文件输入的描述值。 我已经尝试过(没有成功): $myfileentity->toArray(); $myfileentity->get('description'); $m...

0  如果表单字段提交相同图像两次,则可能不会引用文件可能未引用文件  ( File used may not be referenced if form field submits same image twice ) 
我已经建立了一个自定义模块,允许用户定义自定义站点的范围范围,例如要使用的图标。 我能使用 managed_file 元素上传和将图像保存到表单中。但是,如果我重新提交表单而无需更改使用哪些文件,我会收到消息: 首个图标图像中使用的文件可能无法引用。 第一个图标图像是这种情况下我的字段的名称。每次我更改使用的...

4  Twig打印控制器中的段落字段  ( Twig to print paragraph field in controller ) 
d8新的。我有一个结果页面,在那里我需要将段落字段的字段值打印到我的控制器中。段落字段称为 field_classrooms 。 文本值打印精细,例如 {{ teacher.field_last_name.value }} 但是当我需要打印时 {{ teacher.field_classrooms.valu...




© 2021 it.wenda123.org All Rights Reserved. 问答之家 版权所有


Licensed under cc by-sa 3.0 with attribution required.