在項目開發裡面,我遇到了這麼一個需求,就是對於node的title欄位,編輯內容的角色不允許對title進行編輯。title欄位是創建內容類型時自動生成的欄位,不能在drupal8後臺直接配置許可權,所以我需要用代碼自定義一個許可權。 1.在/modules/custom下自定義一個模塊,我的模塊名為o ...
在項目開發裡面,我遇到了這麼一個需求,就是對於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欄位編輯。