在項目開發裏面,我遇到了這麼一個需求,就是對於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字段編輯。