"Змінено на" на вузлах


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

Я хотів би, щоб у nodeтаблиці стовпчик "Змінено на" точно так, як у нас "створено" (поле uid). Це дозволило б відстежувати, хто в останньому зміні в цьому вузлі вніс. Я знаю, що це може бути отримано з node_revisionтаблиці, але це залежить від ввімкнення змін для типів вмісту, які мене цікавлять.

Отже, який найкращий спосіб зробити це? І чому Drupal core не пропонує це за замовчуванням? Я подумав, що "змінено на" - це досить стандартна інформація, яку CMS повинна додавати до вмісту.


2
Чи є причина, що ви не можете ввімкнути перегляд? Здається, найпростіший спосіб отримати те, що вам потрібно. Це, мабуть, те, що я зробив би. Якщо люди будуть часто редагувати вузли, це також означає, що у вас є резервна копія попередніх версій.
Чапабу

Так, я можу. Мені хотілося б знати, чи можливо це мати на головному nodeстолі. Це виглядає більш прямолінійно.
cherouvim

Відповіді:


18

Я думав, що це буде досить важко зробити, але, як виявляється, це досить просто.

Вам просто потрібно створити спеціальний модуль, який додає стовпчик до таблиці вузлів під час встановлення, реалізуйте hook_schema_alter()так, щоб Drupal знав про новий стовпець, і додати певну логіку, щоб надати значення до збереження вузла.

Ось невеликий модуль, який зробить трюк:

Файл: node_table_alter.info

name = Node Table Alter
core = 7.x

Файл: 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);
}

Файл: 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;
}

Ви можете додати логіку, щоб знову видалити поле під час видалення та додати індекс до таблиці для changed_byстовпця (див. db_add_index()), Але це має дати вам гарне місце для початку.

Краса цього методу полягає в тому, що ви ефективно додали у вузол нову властивість. Ви зможете використовувати node_load(), EntityFieldQuerys та ін., Так, як якщо б це було будь-яке з інших стандартних властивостей для вузла.

Бог благословить Друпала за те, що він такий розширюваний!


До речі, ви можете скористатися точно такою ж логікою, щоб відповісти на ваше інше питання .
Клайв

2
Для повної інтеграції сутності, і якщо ви використовуєте модуль API Entity, вам також потрібно буде впровадити гак_entity_property_info (), щоб позбавити інформації про цю нову властивість.
П’єр Буйле

@PierreBuyle Добре, я не думав про це
Клайв

1
Саме цим займається модуль UUID. Перевірте це для більш повної реалізації чогось подібного. drupal.org/project/uuid
paul-m

Дякую велике за детальне пояснення та чисте рішення!
черувим

1

Напевно, ви можете додати посилання, що стосується сутності (назвемо його field_changed_by_user) до типу вмісту, який потрібно відстежувати. Тоді ви можете використовувати hook_node_presaveдля збереження ідентифікатора користувача у вузол так:

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

Я думаю, що також можна оновити поле з ідентифікатором користувача, просто створивши правило. Більше ви можете прочитати тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.