"Diubah oleh" pada node


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

Saya ingin memiliki kolom "diubah oleh" di atas nodemeja, persis seperti yang kita miliki dengan "dibuat oleh" (bidang uid). Ini akan melacak siapa yang membuat perubahan terakhir pada simpul itu. Saya tahu ini bisa diturunkan dari node_revisiontabel tetapi ini tergantung pada revisi yang diaktifkan untuk tipe konten yang saya minati.

Jadi, apa cara terbaik untuk melakukan ini? Dan mengapa inti Drupal tidak menawarkan ini secara default? Saya pikir "diubah oleh" adalah informasi yang cukup standar yang harus dilampirkan oleh CMS ke konten.


2
Apakah ada alasan Anda tidak dapat mengaktifkan revisi? Sepertinya cara termudah untuk mendapatkan apa yang Anda butuhkan. Mungkin itu yang akan saya lakukan. Jika orang akan sering mengedit node, itu juga berarti Anda memiliki cadangan dari versi sebelumnya.
Chapabu

Ya saya bisa. Saya ingin tahu apakah mungkin untuk memilikinya di nodemeja utama . Terlihat lebih mudah.
cherouvim

Jawaban:


18

Saya pikir ini akan cukup sulit untuk dilakukan, tetapi ternyata cukup mudah.

Anda hanya perlu membuat modul khusus yang menambahkan kolom ke tabel simpul saat instalasi, mengimplementasikan hook_schema_alter()sehingga Drupal tahu tentang kolom baru, dan menambahkan beberapa logika untuk memberikan nilai sebelum simpul disimpan.

Berikut adalah modul kecil yang akan melakukan trik:

File: node_table_alter.info

name = Node Table Alter
core = 7.x

File: 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);
}

File: 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;
}

Anda mungkin ingin menambahkan logika untuk menghapus bidang lagi saat mencopot pemasangan, dan menambahkan indeks ke tabel untuk changed_bykolom (lihat db_add_index()), tetapi ini akan memberi Anda tempat yang baik untuk memulai.

Keindahan metode ini adalah Anda telah secara efektif menambahkan properti baru ke node. Anda dapat menggunakan node_load(), EntityFieldQuerys, dll. Dengan itu seolah-olah itu adalah salah satu properti standar lainnya untuk sebuah node.

Tuhan memberkati Drupal karena bisa diperpanjang!


BTW Anda dapat menggunakan logika yang persis sama untuk menjawab pertanyaan Anda yang lain .
Clive

2
Untuk integrasi entitas lengkap, dan jika Anda menggunakan modul Entity API, Anda juga perlu mengimplementasikan hook_entity_property_info () untuk menjalankan informasi tentang properti baru ini.
Pierre Buyle

@PierreBuyle Poin bagus, tidak memikirkan hal itu
Clive

1
Inilah yang dilakukan oleh modul UUID. Lihat untuk implementasi yang lebih lengkap dari sesuatu yang serupa. drupal.org/project/uuid
paul-m

Terima kasih banyak untuk penjelasan terperinci dan solusi bersih!
cherouvim

1

Saya kira Anda bisa menambahkan bidang referensi entitas (sebut saja field_changed_by_user) ke jenis konten yang harus Anda lacak. Maka Anda bisa menggunakan hook_node_presaveuntuk menyimpan id pengguna ke simpul seperti ini:

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;
  }
}

Saya pikir juga memungkinkan untuk memperbarui bidang dengan id pengguna hanya dengan membuat aturan. Anda dapat membaca lebih lanjut di sini .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.