Thay đổi bởi những người khác


9
mysql> select nid, uid, created, changed from node;
+-----+-----+------------+------------+
| nid | uid | created    | changed    |
+-----+-----+------------+------------+
|   1 |   8 | 1336040166 | 1336046390 |
+-----+-----+------------+------------+

Tôi muốn có một cột "thay đổi bởi" trên nodebảng, chính xác như chúng ta có một "được tạo bởi" (trường uid). Điều này sẽ theo dõi ai đã thực hiện thay đổi cuối cùng trên nút đó. Tôi biết rằng điều này có thể được bắt nguồn từ node_revisionbảng nhưng điều này phụ thuộc vào các phiên bản được kích hoạt cho các loại nội dung mà tôi quan tâm.

Vì vậy, cách tốt nhất để làm điều này là gì? Và tại sao lõi Drupal không cung cấp điều này theo mặc định? Tôi nghĩ rằng "thay đổi bởi" là một thông tin khá chuẩn mà một CMS nên đính kèm vào nội dung.


2
Có một lý do bạn không thể kích hoạt sửa đổi? Có vẻ như cách dễ nhất để có được những gì bạn cần. Có lẽ đó là những gì tôi sẽ làm. Nếu mọi người sẽ chỉnh sửa các nút thường xuyên, điều đó cũng có nghĩa là bạn có bản sao lưu của các phiên bản trước.
Chapabu

Vâng tôi có thể. Tôi muốn biết nếu có thể có nó trên nodebàn chính mặc dù. Có vẻ đơn giản hơn.
cherouvim

Câu trả lời:


18

Tôi nghĩ rằng điều này sẽ khá khó khăn để làm, nhưng hóa ra nó khá dễ dàng.

Bạn chỉ cần tạo một mô-đun tùy chỉnh thêm một cột vào bảng nút khi cài đặt, triển khai hook_schema_alter()để Drupal biết về cột mới và thêm một số logic để cung cấp giá trị trước khi nút được lưu.

Đây là một mô-đun nhỏ sẽ thực hiện thủ thuật:

Tệp: node_table_alter.info

name = Node Table Alter
core = 7.x

Tệp: node_table_alter.install

function node_table_alter_install() {
  // Add the new field to the node table
  $field = array(
    'description' => 'Stores the user id of the last user to alter the node',
    'type' => 'int',
    'unsigned' => TRUE
  );

  db_add_field('node', 'changed_by', $field);
}

Tệp: node_table_alter.module

function node_table_alter_schema_alter(&$schema) {
  // Add the new field to the schema cache
  $schema['node']['fields']['changed_by'] = array(
    'description' => 'Stores the user id of the last user to alter the node',
    'type' => 'int',
    'unsigned' => TRUE
  );
}

function node_table_alter_node_presave($node) {
  // Populate the changed_by column with current user's id
  $node->changed_by = $GLOBALS['user']->uid;
}

Bạn có thể muốn thêm logic để xóa trường một lần nữa khi gỡ cài đặt và thêm chỉ mục vào bảng cho changed_bycột (xem db_add_index()), nhưng điều này sẽ cung cấp cho bạn một nơi tốt để bắt đầu.

Cái hay của phương pháp này là bạn đã thêm một thuộc tính mới vào nút một cách hiệu quả. Bạn sẽ có thể sử dụng node_load(), EntityFieldQuerys, v.v. với nó như thể đó là bất kỳ thuộc tính tiêu chuẩn nào khác cho một nút.

Chúa phù hộ cho Drupal vì có thể mở rộng!


BTW bạn có thể sử dụng chính xác cùng một logic để trả lời câu hỏi khác của bạn .
Clive

2
Để tích hợp thực thể hoàn chỉnh và nếu bạn đang sử dụng mô-đun Entity API, bạn cũng sẽ cần triển khai hook_entity_property_info () để cung cấp thông tin về thuộc tính mới này.
Pierre Buyle

@PierreBuyle Điểm tốt, không nghĩ về điều đó
Clive

1
Đây chính xác là những gì mô-đun UUID làm. Kiểm tra nó để thực hiện đầy đủ hơn của một cái gì đó tương tự. drupal.org/project/uuid
paul-m

Cảm ơn rất nhiều cho lời giải thích chi tiết và giải pháp sạch sẽ!
cherouvim

1

Tôi đoán bạn có thể thêm trường tham chiếu thực thể (hãy gọi nó field_changed_by_user) vào loại nội dung bạn cần theo dõi. Sau đó, bạn có thể sử dụng hook_node_presaveđể lưu id người dùng vào nút như thế này:

function hook_node_presave($node) {
  if ($node->nid && $node->type == 'content_type_to_track_changes_for') {
    global $user;
    $node->field_changed_by_user['und'][0]['target_id'] = $user->uid;
  }
}

Tôi nghĩ rằng cũng có thể cập nhật trường với id của người dùng chỉ bằng cách tạo quy tắc. Bạn có thể đọc thêm ở đây .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.