节点上的“更改”


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

我想在node表上有一个“更改为”列,就像我们有一个“创建者”(uid字段)一样。这将跟踪谁对该节点进行了最后更改。我知道这可以从node_revision表派生,但这取决于为我感兴趣的内容类型启用的修订。

那么,什么是最好的方法呢?为什么Drupal核心默认不提供此功能?我认为“更改”是CMS应该附加到内容的非常标准的信息。


2
您是否有无法启用修订的原因?似乎是获得所需东西的最简单方法。这可能就是我要做的。如果人们要经常编辑节点,这也意味着您拥有以前版本的备份。
Chapabu 2012年

我可以。我想知道是否可以在主node表上使用它。看起来更简单。
cherouvim 2012年

Answers:


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等,就好像它是节点的其他任何标准属性一样。

上帝保佑Drupal如此可扩展!


顺便说一句,您可以使用完全相同的逻辑来回答您的其他问题
克莱夫(Clive)

2
为了实现完整的实体集成,并且如果您使用的是Entity API模块,则还需要实现hook_entity_property_info()来提供有关此新属性的信息。
皮埃尔·布伊

@PierreBuyle好点,没想到这一点
Clive

1
这正是UUID模块所做的。检查一下是否可以更完整地实现类似的功能。drupal.org/project/uuid
paul-m

非常感谢您的详细解释和干净的解决方案!
cherouvim 2012年

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

我认为也可以仅通过创建规则来使用用户的ID更新字段。您可以在这里阅读更多内容。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.