欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

如何防止 阻止用户在先删除引用(子)节点之前删除实体引用节点? 有大用 有大大用

问过 
修改于 3 年 2 个月前    
已浏览 219 次    
1
               

我有一个名为 的内容类型ItemRequest,还有一个名为 的内容类型ItemOrder中的字段之一ItemOrder是“相关项目请求”,它是对 的实体引用ItemRequest每个ItemOrder都有至少一个相关项目请求。                    

如何确保父ItemRequest节点只有在没有任何ItemOrder相关节点时才能被删除?我可以使用什么钩子来测试这些子节点的存在并调用 form_set_error 放弃节点删除?                    

                                    
改进这个问题                                    
        

1 个回答 正确答案                    

        
1
                   

您可以使用hook_node_access                        

如果模块想要决定给定用户是否有权在节点上执行给定操作,则模块可以实现此挂钩。                            

这个钩子的第二个参数是 $op:                        

$op:要执行的操作。可能的值:                            

“创建” “删除” “更新” “查看”                            

返回值是:                        

  • NODE_ACCESS_ALLOW:是否允许该操作。

  • NODE_ACCESS_DENY:如果操作被拒绝。

  • NODE_ACCESS_IGNORE:完全不影响这个操作。

因此,您应该实现该挂钩,检查被删除的节点是否属于类型ItemRequest,如果是,则收集所有指向它的 ItemOrder。如果没有收集到你可以返回NODE_ACCESS_IGNORE,如果有ItemOrder指向ItemRequest返回NODE_ACCESS_DENY                        

虽然您可以连接到节点表单并添加自定义验证器,但它不会阻止用户使用其他方式(例如管理内容视图)删除节点。此方法可以防止任何试图删除节点的操作。                        


                       

来自  https://drupal.stackexchange.com/questions/288953/how-to-prevent-a-user-from-deleting-an-entity-referenced-node-before-deleting-th                        


                       


问过 
修改于 1 年 4 个月前    
已浏览 270 次    
4
               

我想防止在对节点执行删除操作时删除节点。例如在管理面板中,如果用户在节点上单击“删除”,如果他不是管理员,则不应删除该节点。权限和用户角色对我来说不是问题,问题是“停止”删除操作。                    

我发现hook_entity_predelete(),这很完美,它正好在删除节点之前运行,但我不知道如何停止删除操作。我想在该挂钩内做一些事情并防止删除节点。                    

我还看到了这个问题:How do I prevent a Node from being deleted? hook_node_access(),但它没有按我的需要工作。                    

hook_entity_delete()也不行,因为This hook runs once the entity has been deleted from the storage我需要阻止它。                    

感谢您的帮助。                    

                                    
改进这个问题                                    
  • 4                                
    最简单的答案是从每个内容类型的“删除任何”或“删除自己”的给定角色中删除权限。这应该删除用户界面中的按钮。钩子在这种情况下无济于事,因为它们是为了在操作之前运行,而不是停止它——无论如何它都会继续。这主要包含在 EntityBase::delete 中。否则,Clive 和 Berdirs 在链接问题中的回答就足够了。 
    – 凯文                                   
     2021 年 10 月 15 日 20:26                                 
  • 感谢您的评论,我找到了另一个解决方案(我在下面添加它作为答案)。 
    – 美少女战士                                   
     2021 年 10 月 19 日 6:57                                
        

1 个回答         正确答案 

           

        
1
                   

我找到了一个让我满意的解决方案:我使用hook_form_alter()当您总是尝试删除节点时,会出现一个带有“删除”和“取消”按钮的确认表单。我正在更改该表单 - 在某些情况下(取决于用户权限)我正在取消设置“删除”按钮(使用unset($form['actions']['submit'],因此无法删除)并添加我自己的按钮而不是它,并带有回调函数。我也在更改该表格和描述的标题。                        

                                        
改进这个答案                                        
  • 可能会对未来的读者看到一些代码有所帮助
    – 莱曼克斯                                       
     2021 年 10 月 19 日 11:02                                    
        

您的答案            来自  https://drupal.stackexchange.com/questions/307661/how-to-prevent-a-node-from-being-deleted-while-performing-a-delete-operation



普通分类: