淘小兔

在项目开发里面,我遇到了这么一个需求,就是对于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并勾选,如下图所示

drupal 8 ——自定义权限

然后install

drupal 8 ——自定义权限

 

6.在/admin/people/permissions页面中,选中一个角色进行权限的配置,勾选刚刚自定义的权限并保存

drupal 8 ——自定义权限

 

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字段编辑。

下载仅供下载体验和测试学习,不得商用和正当使用。

下载体验

请输入密码查看内容!

如何获取密码?

 

点击下载