Düğümlerde "değiştirildi"


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

nodeTam olarak bir "tarafından oluşturuldu" (uid alanı) gibi , tablonun bir "tarafından değiştirildi" sütunu istiyorum. Bu, o düğümde son değişikliği kimin yaptığını izler. Bunun node_revisiontablodan türetilebileceğini biliyorum, ancak bu, ilgilendiğim içerik türleri için etkinleştirilen düzeltmelere bağlı.

Peki, bunu yapmanın en iyi yolu nedir? Ve neden Drupal core bunu varsayılan olarak sunmuyor? "Değiştirildi" nin bir CMS'nin içeriğe eklemesi gereken oldukça standart bir bilgi parçası olduğunu düşündüm.


2
Düzeltmeyi etkinleştirememenizin bir nedeni var mı? İhtiyacınız olanı almanın en kolay yolu gibi görünüyor. Muhtemelen bunu yapardım. İnsanlar düğümleri sık sık düzenleyecekse, önceki sürümlerin yedeğine sahip olduğunuz anlamına da gelir.
Chapabu

Evet yapabilirim. nodeYine de ana masada olması mümkün olup olmadığını bilmek istiyorum . Daha açık görünüyor.
cherouvim

Yanıtlar:


18

Bunun oldukça zor olacağını düşündüm, ancak ortaya çıktığı için oldukça kolay.

Sadece yükleme sırasında düğüm tablosuna bir sütun ekleyen özel bir modül oluşturmanız, hook_schema_alter()Drupal'ın yeni sütun hakkında bilgi sahibi olmasını sağlamanız ve düğüm kaydedilmeden önce bir değer sağlamak için bir mantık eklemeniz gerekir.

İşte hile yapacak küçük bir modül:

Dosya: node_table_alter.info

name = Node Table Alter
core = 7.x

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

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

Kaldırma sırasında alanı tekrar kaldırmak için mantık eklemek ve changed_bysütun için tabloya bir dizin eklemek isteyebilirsiniz (bkz. db_add_index()), Ancak bu size başlamak için iyi bir yer vermelidir.

Bu yöntemin güzelliği, düğüme etkili bir şekilde yeni bir özellik eklemiş olmanızdır. Kullanılacak mümkün olacak node_load(), EntityFieldQuerybu bir düğüm için diğer standart özelliklerden herhangi birini sanki onunla s, vb.

Tanrı Drupal'ı bu kadar uzatılabildiği için korusun!


BTW Diğer sorunuza cevap vermek için aynı mantığı kullanabilirsiniz .
Clive

2
Tam varlık entegrasyonu için ve Entity API modülünü kullanıyorsanız, bu yeni özellik hakkında bilgi edinmek için hook_entity_property_info () yöntemini de uygulamanız gerekir.
Pierre Buyle

@PierreBuyle İyi bir nokta, bunu düşünmedim
Clive

1
UUID modülünün yaptığı da tam olarak budur. Benzer bir şeyin daha eksiksiz uygulanması için göz atın. drupal.org/project/uuid
paul-m

Ayrıntılı açıklama ve temiz çözüm için çok teşekkürler!
cherouvim

1

Bir varlık referans alanı ekleyebilirsin (diyelim ki field_changed_by_user içerik türüne ) ekleyebilirsiniz. Ardından hook_node_presave, kullanıcı kimliğini şu şekilde düğüme kaydetmek için kullanabilirsiniz :

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

Sadece bir kural oluşturarak alanı kullanıcının kimliğiyle güncellemek de mümkün. Daha fazlasını buradan okuyabilirsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.