Sử dụng PHP code để thiết lập node access

We encourage users to post events happening in the community to the community events group on https://www.drupal.org.
Alpha5's picture

Hiện tôi vẫn dùng các module để giới hạn quyền truy cập vào một node, dùng content access và acl.

Giờ tôi muốn dùng code để tự phân quyền cho một node thì làm thế nào? Ví dụ, viết một đoạn code để grant view, update, delete của node id = 2 cho role id 80.

Hoặc mọi người có thể cho link xem một ví dụ tương tự được không?

Comments

Sử dụng hook_nodeapi

thehong's picture
  1. Sử dụng hook_nodeapi để cập nhật record trong bảng node_access khi các sự kiện RUD. Giả sử bạn tạo ra dòng dữ liệu sau đây:

* nid: 2
* gid: 80 (giả sử role ID này là nhóm người dùng đã đóng phí thành viên trong tháng)
* realm: đã đóng phí thành viên
* grant_view: 1
* grant_update: 0
* grant_delete: 0

  1. Sử dụng http://api.drupal.org/api/function/hook_node_grants/6,hook_node_grants để định nghĩa các tập điều kiện gid/realm. Thí dụ:

function custom_node_grants ($account, $op) {
$grants['đã đóng phí thành viên'] = array (80); // xử lý kiểu gì để ra số 80 này là việc của bạn

return $grants;
}

Khi drupal kiểm tra quyền hạn người dùng truy cập vào node 2 với các thao tác RUD nó sẽ thực hiện một câu truy vấn có dạng:

"SELECT COUNT(*) FROM {node_access} WHERE (nid = 0 OR nid = %d) AND (gid = 80 AND realm = 'đã đóng phí thành viên') AND grant_$op >= 1"

Nếu con số trả về là 0 thì người dùng không có quyền, >=1 thì có quyền (Xem hàm node_access).

--
Only local images are allowed.

Tôi không nắm rõ các

Alpha5's picture

Tôi không nắm rõ các hàm trong drupal và php nên cũng chưa hiểu được cách làm ntn với chỉ dẫn trên. Thehong nên cho ví dụ cụ thể với module content_access thì mới hiểu được.

Tôi thấy việc gán quyền cho node là do table node_access đảm nhiệm nên cứ chọc thẳng vào sql bằng câu lệnh

INSERT INTO node_access (nid, gid, realm, grant_view, grant_update, grant_delete) VALUES (2, 80, 'content_access_rid', 1, 1, 0);

Vì tôi sử dụng module content access để có giao diện dễ nhìn nên vấn đề gặp phải là khi đó trong bảng Access Control của node 2 sẽ không hiện nút tích ở role 80. Vậy có 2 cách để đạt được nút tích cho role 80:
  1. Ngoài dòng code trên thì thêm dòng nữa để thiết lập nid,settings cho table content_access để nó hiện cả nút chọn của role 80. Cái này cũng chưa biết làm thế nào.
  2. Sử dụng hàm của module content_access để đạt được việc gán quyền cho role 80. Cái này cũng chưa biết làm.

Vậy thehong có thể viết 2 ví dụ cụ thể cho 2 cách làm trên được không?