drupal 8 ——自定义权限

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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字段编辑。

 

以上是关于drupal 8 ——自定义权限的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段8——声明函数

Drupal 8 自定义模块未显示在块布局中

Drupal 8 更新自定义模块的 language.po 文件

如何 - 构建自定义 drupal 8 模块表单

在 drupal 8 的另一个自定义内容类型字段中使用自定义内容类型作为字段

Drupal 8 自定义模块“找不到主题挂钩”