drupal 8 ——自定义权限

在项目开发里面,我遇到了这么一个需求,就是对于node的title字段,编辑内容的角色不容许对title进行编辑。title字段是建立内容类型时自动生成的字段,不能在drupal8后台直接配置权限,因此我须要用代码自定义一个权限。php

1.在/modules/custom下自定义一个模块,个人模块名为one_node_title_permissionnode

 

2.新建三个文件,分别为one_node_title_permission.info.yml,one_node_title_permission.module,one_node_title_permission.permissions.yml函数

   注意:文件名必须与模块名相对应spa

 

3.在one_node_title_permission.info.yml文件中,配置模块信息以下rest

name: One Node Title Permission
description: 'Add permission for the title of node.'
type: module
core: 8.x
package: one

 

4.在one_node_title_permission.permissions.yml文件中,配置的是我要添加的权限信息,以下所示code

one_node_title_permission permission:
    title: 'Edit own value for field field_title'
    restrict access: false

 

5.这样,基本的权限已经配置好了。在本地drupal8中的/admin/modules目录下,找到刚刚新加的module并勾选,以下图所示orm

而后installblog

 

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

 

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

相关文章
相关标签/搜索