drupal 8 ——自定义权限

在项目开发里面,我遇到了这么一个需求,就是对于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 Permission
description: 'Add permission for the title of node.'
type: module
core: 8.x
package: 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字段编辑。

 

posted on 2017-11-13 09:39  水波粼粼  阅读(937)  评论(0编辑  收藏  举报

导航