防止节点保存在hook_node_presave中 -- nodes 领域 和 8 领域 drupal 相关 的问题

Prevent node from being saved in hook_node_presave


9
vote

问题

中文

当保存/更新节点时,我需要验证某些字段组合是否是唯一的。 唯一字段模块应该允许这个,但该功能不起作用(仅验证单个字段) 。所以我创建了自己的钩子:

  function mymodule_node_presave(DrupalCoreEntityEntityInterface $node) {    if ($node->bundle() == 'mycontent') {      $term = Drupal axonomyEntityTerm::load($node->get('field_mytaxonomy')->target_id);      $query = Drupal::entityQuery('node');     $query->condition('type', 'mycontent');     $query->condition('field_mydate', $node->get('field_mydate')->value, '=');     $query->condition('field_mytaxonomy', $term->id(), '=');      $nids = $query->execute();      if ($nids) {       drupal_set_message('Fields are not unique!', 'error');       // I need to prevent saving of node here           }     } }   

具有编号的节点的检测是创建的。 如何防止保存节点?

英文原文

When saving / updating node, i need to validate if certain fields combination is unique. Unique field module is supposed to allow this, but that feature is not working (validating only single field). So i created my own hook:

function mymodule_node_presave(\Drupal\Core\Entity\EntityInterface $node) {    if ($node->bundle() == 'mycontent') {      $term = \Drupal\taxonomy\Entity\Term::load($node->get('field_mytaxonomy')->target_id);      $query = \Drupal::entityQuery('node');     $query->condition('type', 'mycontent');     $query->condition('field_mydate', $node->get('field_mydate')->value, '=');     $query->condition('field_mytaxonomy', $term->id(), '=');      $nids = $query->execute();      if ($nids) {       drupal_set_message('Fields are not unique!', 'error');       // I need to prevent saving of node here           }     } } 

Detection of node with duplicite values being created works. How do i prevent saving that node?

     

回答列表

10
 
vote
vote
最佳答案
 

如何防止保存节点?

如果要防止节点以保存方法或挂钩保存,则必须抛出异常:

  throw new Exception(t('Fields are not unique!'));   

更多用户友好将首先在表单中检查此功能,并使用户在抛出异常之前纠正输入的机会。

Double Checking这在psualave中仍然是一个好主意,以确保,没有保存不正确的节点内容,无论使用哪种形式,REST API或代码都没有保存。如果有人在表单中达到了第一级检查,则您没有其他选项比抛出异常。

编辑:

如果提出异常,您可以使用异常订阅者中的自定义错误处理替换默认500次响应,请参阅通过自定义处理程序句柄数据库连接异常

 

How do i prevent saving that node?

If you want to prevent that the node is saved in a presave method or hook you have to throw an exception:

throw new \Exception(t('Fields are not unique!')); 

More user friendly would be to check this in the form first and give the user a chance to correct the input before you throw an exception.

Double checking this in presave is still a good idea to make sure, that no incorrect node content gets saved, no matter which form, Rest API or code is used. If someone gets past the first level of checks in the form you have no other option than to throw an exception.

Edit:

In case an exception is raised, you can replace the default 500 response with a custom error handling in an exception subscriber, see Handle database connection exception via custom handler

 
 
     
     
3
 
vote

这不是右钩子要做验证。 使用hook_form_form_id_alter()添加验证功能。

  $form['#validate'][] = 'my_custom_validate';   

然后在您的自定义验证函数中:

  $term = $form_state->getValue('field_mytaxonomy'); // Your logic here. $form_state->setErrorByName('field_mytaxonomy', t('Fields are not unique!'));   
 

That is not the right hook to do validations. Use hook_form_FORM_ID_alter() to add a validation function.

$form['#validate'][] = 'my_custom_validate'; 

Then in your custom validation function:

$term = $form_state->getValue('field_mytaxonomy'); // Your logic here. $form_state->setErrorByName('field_mytaxonomy', t('Fields are not unique!')); 
 
 
2
 
vote

我有类似的要求,并希望更好的解决方案而不是简单地抛出异常。以下对我来说似乎很好,在我的 hook_node_presave()

  $response = new RedirectResponse(Drupal::request()->getRequestUri()); $response->send(); drupal_set_message(t('This is my error message'), 'error', TRUE); exit;   
 

I had a similar requirement, and wanted a nicer solution than simply throwing an exception. The following seemed to work well for me, in my hook_node_presave():

$response = new RedirectResponse(\Drupal::request()->getRequestUri()); $response->send(); drupal_set_message(t('This is my error message'), 'error', TRUE); exit; 
 
 
     
     
0
 
vote

我在SafeDelete模块中使用了User34185解决方案,对于一个工作示例,对于Drupal 8/9 https://drupal.org/project/safedelete

 

I've used the user34185 solution in the safedelete module, for a working example download the safedelete module for Drupal 8/9 https://drupal.org/project/safedelete

 
 
   
   

相关问题

0  如何使用Devel Path获取节点的内容?  ( How to get the content of a node with devel path ) 
我很新的是drupal a想要获取节点的数据。使用 devel 模块,我读出了我喜欢的信息的路径。 $var->location['postal_code'] 如何访问此路径?我想将此信息传递给JavaScript。所以我想我必须使用PHP访问此路径,然后使用 drupal_add_js 将其传递给js。但...

2  有没有办法仅为一个特定类型的节点启用基本验证?  ( Is there a way to enable basic auth for only one specific type of node ) 
无法真正发现在谷歌的方式。 我在我的网站上有一个特殊的内容案例,我创建了一个页面模板,它在我的 99887662 代码中显示一系列块。要将此模板应用于此特定页面,我为其进行了自定义节点类型。但是,此内容仅限于(并且应该)仅限于具有特定权限的用户,我通过插件。 我想使用 wkhtmltopdf 输出该页面的PDF以进行...

4  如何迁移修订  ( How to migrate revisions ) 
我迁移到d7到d8的内容。我正在使用services_views导出节点并使用迁移导入。 我想进口修订。我应该怎么做? D8的修订似乎没有实体,那么我应该用什么样的"目标" 来导入它们? ...

2  如何出口评论?  ( How to export comments ) 
我有两个drupal网站设置。一个是发展,另一个是活着的。在我的现场设置中,有很多评论。我想导出所有注释和导入到开发设置。 我该怎么办? ...

2  如何为匿名用户提供仅访问某些节点?  ( How to give anonymous users access to only certain nodes ) 
我试图实施以下内容: 匿名用户不允许查看所有节点,而是仅查看某些节点。 我正在使用tac lite( https://www.drupal.org/project/tac_lite)使这发生。 但是,我目前能够控制要查看节点的权限的唯一方法如下: 不是给匿名的用户角色'查看已发布的内容'和 配置TAC_LITE...

1  如何钩住“访问网站”?  ( How to hook into visiting the website ) 
我的主要问题非常类似于如何将UserPoints授予用户连续5天执行登录的用户?。作为迈克在他的答案在这个问题上,他的解决方案不会为将浏览器登录的用户工作。因此,我不想挂钩登录,但进入"访问网站" (即访问任何页面)。 我对规则和自定义代码很好。在第一种情况下,我可以使用哪个规则事件?出于性能原因,它在这两种情况下都...

2  更新PreprocessNode中的作者名称  ( Updating author name in preprocessnode ) 
kpr函数中的行工作 - 它输出节点的全名的作者。但是设置 author_name 变量不。为什么在我的模板中替换 author_name 变量不是吗? (它只是空白。) 如果我删除它,它将显示用户名。 function my_plugin_form_alter(&$form, DrupalCoreFormF...

8  如何通过自定义模块安装将自定义字段添加到内置内容类型中?  ( How to add custom fields and display settings to built in content types via cust ) 
我很新的是drupal,我来自Wordpress开发,我正在尝试将一些插件翻译成Drupal 8中的模块。 我遵循尝试添加新字段的文档,向节点表示"price" 。 我发现的所有文档都与将字段添加到自定义节点,但在我的情况下,我想将这些字段添加到正常预定义节点。 介绍的问题是,我可以使用yml配置文件或代码创建自定义...

0  如何通过编辑器在基本页面中添加视图块?  ( How to add a views block in a basic page via editor ) 
我通过Drupal 7的编辑器创建了一个基本页面,我已经开始使用PHP代码文本格式编码正文。到目前为止如此善良,除了我想从视图中嵌入块(显示三个节点)和下面的代码,似乎在我将它直接放入PHP文件时似乎工作,不会在正文中激活。我顺便使用bootstrap。 <div class="third-box"> <di...

0  以形式或阻止插件以编程方式为自定义内容类型加载'添加内容'表单  ( Programmatically load add content form for custom content type in form or bloc ) 
我了解用户可以使用"管理" 菜单中的"添加内容" ,但我正在构建自定义块插件或表单,以便添加内容表单可以在页面上的块中显示,而不是要求用户使用实际的管理页面。我已经完成了这一点,通过手动在表单插件中手动创建表单中的表单,该插件在表单提交时将字段值保存到节点中,但它真的能够抓住实际添加节点表单并渲染它直接地。 在我的...

0  自定义节点编辑页面  ( Customized node edit page ) 
如何自定义节点编辑页面? 我创建了一个用于在线教育的购物车网站。 这里我需要一个按钮,同时编辑节点一个内容类型? 如何在节点编辑页面中创建一个按钮? 如何为该按钮添加特定功能的函数。 ...

3  设置具有多个值的节点列表字段的值  ( Set value of list field of a node with multiple values ) 
我试图从表单插件编程地生成自定义内容类型的节点。对于大多数领域,我根本没有任何麻烦。例如,对于标题字段,我可以设置这样的值。 $node->title->value = t('My title'); $node->save(); 但是,还有一个列表(文本)字段,允许多个值。而且我不确定如何使用多个值保存字段...

1  如何在一个以上地区显示一个字段?  ( How to show one field in more than one regions ) 
我正在使用drupal 7.我已经使用了两个列堆叠布局来显示节点字段。我创建了一个评级字段,我将其显示在顶部区域。我也想在底部地区显示相同的字段。如何在底部区域显示相同的字段? ...

0  无法保存内容标题  ( Unable to save content title ) 
我正在使用Feed将内容导入我的自定义内容类型,客户端。 导入后,映射出现很好,内容标题在页面视图节点中显示,但是,当我转到编辑内容时,标题为空&amp;也不保存更新的标题。 几天后工作很好。我没有对任何模块进行任何更改或更新。 请建议。 感谢 ...

4  如何以编程方式重复节点?  ( How to duplicate nodes programmatically ) 
我想以编程方式创建复制节点。 有没有办法来做这个? 注意:我不想使用任何模块来执行此操作。 ...

0  禁用节点正文的缓存  ( Disable cache for node body ) 
我想禁用节点内容的该特定部分的缓存。 是否有可能? 我知道我可以使用:禁用节点本身的缓存 $build['#cache']['max-age'] = 0; // users Drupal::service('page_cache_kill_switch')->trigger(); // anon users ...

0  以编程方式加载节点编辑表单  ( Programmatically load node edit form ) 
我能加载节点创建表单如此 $node = Drupal odeEntityNode::create(['type' => 'avenue']); $content = Drupal::service('entity.form_builder')->getForm($node); return $conte...

9  如何以编程方式创建多语种节点?  ( How to create a multilingual node programmatically ) 
在最后几天我试图将多语言csv文件迁移到Drupal 8 没有成功,所以最后我决定使用批处理完成任务。 此时我有批处理工作,但此时我需要创建我的节点并创建翻译。因此,如何以编程方式创建多语言节点? ...

1  根据具有常见词汇表计算的分数,对块视图中的相关节点进行排序  ( Sort related nodes in block views based on a score calculated with common vocabu ) 
是在Drupal8中有可能的视图,以基于使用公共词汇量计算的分数来显示块中的相关节点(每个常用标签根据词汇类型增加一些亲和力点)。 在视图中排序是排序的: 1-编辑器手册选择。 使用与当前节点的最大关联排序的最佳相关节点 按日期排序的3-节点 问候, 谢谢你的帮助 ...

0  为视图创建自定义操作批量操作  ( Create custom action for views bulk operations ) 
我正在尝试向我的视图批量操作添加一些自定义操作,但出于某种原因,它们不会出现在列表中。 我想向用户添加自定义按钮可以将其应用于它和节点日期更新到今天... 这是我的代码(所以我猜这是一个工作代码......) /** * Implements hook_action_info(). */ funct...




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


Licensed under cc by-sa 3.0 with attribution required.