如何根据Taxonomy Term值(如closed)禁止编辑Drupal节点?
实现Drupal节点按分类术语禁止编辑的方法
方法一:自定义代码实现
通过实现Drupal的hook_node_access钩子,直接在代码层面控制节点编辑权限:
- 新建一个自定义模块(例如命名为
node_restrict_by_term),在模块的.module文件中添加以下代码:
function node_restrict_by_term_node_access(NodeInterface $node, $op, AccountInterface $account) { // 仅处理编辑操作 if ($op !== 'update') { return AccessResult::neutral(); } // 替换为你的分类字段机器名,比如field_node_status $target_field = 'field_node_status'; if (!$node->hasField($target_field)) { return AccessResult::neutral(); } // 获取节点关联的分类术语 $terms = $node->get($target_field)->referencedEntities(); foreach ($terms as $term) { // 检查术语名称或ID是否为closed(推荐用ID更稳定) if ($term->getName() === 'closed' || $term->id() === '123') { // 替换123为closed术语的实际ID return AccessResult::forbidden()->addCacheableDependency($node); } } return AccessResult::neutral(); }
- 替换代码中的字段机器名和术语ID为你站点的实际值,启用模块后,带有
closed术语的节点将被禁止编辑。
方法二:使用Permissions by Term模块
通过现成模块可视化配置权限:
- 安装并启用
Permissions by Term模块 - 进入后台的分类术语编辑页面,找到
closed术语的编辑界面 - 在页面的
Permissions by Term设置区域,针对需要限制的角色,取消勾选「编辑拥有此术语的内容」权限 - 保存设置后,拥有该术语的节点将被对应角色禁止编辑
注:若之前尝试Rule模块未成功,可能是触发条件或动作配置有误,比如需设置「在节点编辑表单加载前」触发,检查术语值后执行「拒绝访问」动作,但上述两种方法的可靠性和易用性更高。
内容的提问来源于stack exchange,提问作者Nadia chaklaj
相关产品推荐
相关产品推荐

