在项目开发里面,我遇到了这么一个需求,就是对于node的title字段,编辑内容的角色不允许对title进行编辑。title字段是创建内容类型时自动生成的字段,不能在drupal8后台直接配置权限,所以我需要用代码自定义一个权限。
1.在/modules/custom下自定义一个模块,我的模块名为one_node_title_permission
2.新建三个文件,分别为one_node_title_permission.info.yml,one_node_title_permission.module,one_node_title_permission.permissions.yml
注意:文件名必须与模块名相对应
3.在one_node_title_permission.info.yml文件中,配置模块信息如下
name: One Node Title Permissiondescription: 'Add permission for the title of node.'type: modulecore: 8.xpackage: one
4.在one_node_title_permission.permissions.yml文件中,配置的是我要添加的权限信息,如下所示
one_node_title_permission permission: title: 'Edit own value for field field_title' restrict access: false
5.这样,基本的权限已经配置好了。在本地drupal8中的/admin/modules目录下,找到刚刚新加的module并勾选,如下图所示
然后install
6.在/admin/people/permissions页面中,选中一个角色进行权限的配置,勾选刚刚自定义的权限并保存
7.上面我们仅仅只是添了一条权限,权限所对应的功能还没有加,所以我要在one_node_title_permission.module添加
one_node_title_permission_form_alter函数,在该函数里面添加我需要的代码。注意,该函数名是模块名+_form_alter
<?php/** * @file * One Contact US Module. */use Drupal\Core\Form\FormStateInterface;/** * Implements hook_form_alter(). */function one_node_title_permission_form_alter(&$form, FormStateInterface $form_state, $form_id) { $route_match = \Drupal::routeMatch();//获取当前路径 $user = \Drupal::currentUser();//获取当前用户角色 $access = !$user->hasPermission('one_node_title_permission permission');//判断是否有此权限,没有返回false if ($route_match->getRouteName() == 'entity.node.edit_form' && $access) { $form['title']['#disabled'] = 'disabled';//对‘title’字段不可编辑 }}
在上面的代码里,我具体要实现的功能是在node的编辑页面里面,对不具有该权限的用户,不允许对title字段编辑。
下载仅供下载体验和测试学习,不得商用和正当使用。
下载体验