"Modificato da" sui nodi


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

Mi piacerebbe avere una colonna "modificata da" sulla nodetabella, esattamente come abbiamo una "creata da" (il campo uid). Ciò terrebbe traccia di chi ha apportato l'ultima modifica su quel nodo. So che questo potrebbe derivare dalla node_revisiontabella, ma dipende dalle revisioni abilitate per i tipi di contenuto che mi interessano.

Quindi, qual è il modo migliore per farlo? E perché Drupal core non offre questo per impostazione predefinita? Ho pensato che "cambiato da" è un'informazione piuttosto standard che un CMS dovrebbe allegare al contenuto.


2
C'è un motivo per cui non è possibile abilitare la revisione? Sembra il modo più semplice per ottenere ciò di cui hai bisogno. Probabilmente è quello che farei. Se le persone modificheranno i nodi frequentemente, significa anche che hai un backup delle versioni precedenti.
Chapabu,

Sì posso. Vorrei sapere se è possibile averlo sul nodetavolo principale però. Sembra più semplice.
cherouvim,

Risposte:


18

Ho pensato che sarebbe stato abbastanza difficile da fare, ma a quanto pare è abbastanza facile.

Devi solo creare un modulo personalizzato che aggiunge una colonna alla tabella dei nodi durante l'installazione, implementare in hook_schema_alter()modo che Drupal sia a conoscenza della nuova colonna e aggiungere un po 'di logica per fornire un valore prima che il nodo venga salvato.

Ecco un piccolo modulo che farà il trucco:

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

Potresti voler aggiungere la logica per rimuovere di nuovo il campo durante la disinstallazione e aggiungere un indice alla tabella per la changed_bycolonna (vedi db_add_index()), ma questo dovrebbe darti un buon punto di partenza.

Il bello di questo metodo è che hai effettivamente aggiunto una nuova proprietà al nodo. Sarai in grado di utilizzare node_load(), EntityFieldQuerys, ecc. Con esso come se fosse una delle altre proprietà standard per un nodo.

Dio benedica Drupal per essere così estendibile!


A proposito, puoi usare esattamente la stessa logica per rispondere alla tua altra domanda .
Clive

2
Per una completa integrazione dell'entità e se stai utilizzando il modulo API Entity, dovrai anche implementare hook_entity_property_info () per fornire informazioni su questa nuova proprietà.
Pierre Buyle,

@PierreBuyle Un buon punto, non ci ho pensato
Clive

1
Questo è esattamente ciò che fa il modulo UUID. Dai un'occhiata per un'implementazione più completa di qualcosa di simile. drupal.org/project/uuid
paul-m

Grazie mille per la spiegazione dettagliata e la soluzione pulita!
Cherouvim,

1

Suppongo che potresti aggiungere un campo di riferimento dell'entità (chiamiamolo field_changed_by_user) al tipo di contenuto che devi monitorare. Quindi è possibile utilizzare hook_node_presaveper salvare l'id utente sul nodo in questo modo:

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

Penso che sia anche possibile aggiornare il campo con l'id dell'utente semplicemente creando una regola. Puoi leggere di più qui .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.