Modifica del modulo di amministrazione / contenuto


8

Dopo aver aggiunto un "modificato da" sui nodi, ora devo visualizzare l'utente che ha modificato ciascun nodo nel node_admin_contentmodulo (at admin/content) proprio accanto alla colonna "Autore".

Sono riuscito a risolverlo facilmente alterando node.admin.inc e aggiungendo solo 2 righe di codice:

...
'changed_by' => t('Changed By'),
...

...
'changed_by' => theme('username', array('account' => user_load($node->changed_by))),
...

Questa, ovviamente, non è una soluzione adeguata poiché altera il nucleo.

Quindi ho provato a modificare il modulo tramite:

function hook_form_node_admin_content_alter(&$form, &$form_state, $form_id) { 
  $form['admin']['nodes']['#header']['changed_by'] = t('Changed By');
  // ... ?
}

Usando dpmposso vedere che il modulo ha i nodi nelle opzioni. Il problema è che questo è il risultato del rendering dei nodi come opzioni di tabella. Non ho accesso ai nodi originali, né voglio rieseguire la query di recupero del nodo per ottenere le informazioni "modificate da". Immagino che farlo nel modo hook non risolverebbe il problema nel livello corretto. O è?

Quindi, qual è un buon modo per modificare il node_admin_contentmodulo per aggiungere più dati esistenti sui nodi?

Risposte:


18

La cattiva notizia è che dopo aver ispezionato il codice, il modulo alter layer è l'unico posto dove farlo davvero; il tuo approccio è praticamente perfetto.

La buona notizia è che Drupal implementa tutti i tipi di cache statica durante il caricamento della pagina, il che riduce al minimo la necessità di tornare nel database. Quindi, mentre alterare la tabella dei contenuti può sembrare ingombrante, in realtà non stai ottenendo un notevole successo di prestazioni.

Il seguente codice (o simile) dovrebbe funzionare; vedere i commenti per ulteriori informazioni sul problema di memorizzazione nella cache:

function MYMODULE_form_node_admin_content_alter(&$form, &$form_state, $form_id) {
  // Load the nodes. This incurrs very little overhead as 
  // "$nodes = node_load_multiple($nids);" has already been run on these
  // nids in node_admin_nodes(). The static cache will be used instead of
  // another db query being invoked
  $nodes = node_load_multiple(array_keys($form['admin']['nodes']['#options']));

  // Grab a list of all user ids that have been responsible for changing the node
  $uids = array();
  foreach ($nodes as $node) {
    $uids[] = $node->changed_by;
  }

  // Filter out duplicates (one user may have been the last to change more than one node)
  $uids = array_unique($uids);

  // Load a list of all involved users in one go. This is about as performant
  // as this is going to get, as you're going to need the user objects one
  // way or the other for the call to theme_username
  $users = user_load_multiple($uids);

  // Add another column to the table header
  $form['admin']['nodes']['#header']['changed_by'] = array('data' => t('Changed by'));

  // Loop through the rows in the table and add the changed by column
  foreach ($form['admin']['nodes']['#options'] as $nid => $row) {
    // Grab the user related to this node.
    $this_user = $users[$nodes[$nid]->changed_by];

    // Add data for the new column
    $form['admin']['nodes']['#options'][$nid]['changed_by'] = theme('username', array('account' => $this_user));
  }
}

Il codice sopra produce una bella nuova colonna brillante come questa nella pagina di amministrazione del contenuto:

inserisci qui la descrizione dell'immagine


4
Stupendo! Grazie mille per aver fornito documentazione di qualità con la tua risposta.
Cherouvim,

@cherouvim Nessun problema :)
Clive

Grazie anche a me ha funzionato, ma voglio modificare le colonne esistenti come se volessi visualizzare il nome utente dell'autore o il nome reale invece dell'email dell'autore nella colonna dell'autore.
Pranav Gandhi,

3

Sostituisci semplicemente admin / contenuto con una vista, quindi aggiungi i campi che desideri. Admin Views lo farà anche per te.


Anche quello era il mio primo pensiero, ma Views avrebbe automaticamente saputo della nuova colonna che era stata aggiunta alla tabella dei nodi? Ottiene informazioni sulle proprietà dell'entità da hook_schema()/ hook_schema_alter()implementazioni?
Clive

Presumo che tu abbia appena aggiunto un campo CCK. Vedo ora che sei andato con hook_schema_alter (), che è molto schifoso. Tuttavia, puoi implementare hook_views_data_alter () per esporre la nuova colonna.
Bojan Zivanovic,

Sì, non mi è sembrato "giusto" farlo, ma non riesco a capire perché. Riesci a pensare a uno scenario in cui l'aggiunta della colonna in quel modo causerebbe effettivamente un problema?
Clive

Non causa alcun problema, ti dà solo un po 'di lavoro extra (come aver bisogno di hook_views_data_alter () per Views, lo stesso per le proprietà se sei su D7) mentre sei "ideologicamente" sbagliato, è un modo di pensare molto Drupal 5 . Oh bene, non è un grosso problema.
Bojan Zivanovic,

Grazie, buono a sapersi. Personalmente avrei sempre usato i campi per questo tipo di cose, ma era interessante scoprire che poteva essere fatto senza grandi effetti collaterali. Tuttavia, la tua risposta ne parla a lungo; se lo fai nel modo corretto / raccomandato (cioè con i campi) ti risparmierai molto lavoro in seguito
Clive

0

Un po 'fuori tema, ma questa risposta mostra come è possibile farlo a livello di codice (ad esempio aggiungendolo come aggiornamento del modulo nel file MY_MODULE.install.)

Avrai bisogno di un po 'più di lavoro se vuoi aggiungere il tuo nuovo campo prima dell'ultimo campo esistente. Uniscilo prima della fine dell'array $ view-> display ['default'] -> display_options ['fields'].

    function MY_MODULE_update_7101(){
        // update the admin/content view, need to do it manually because it's
        // set by admin_views module
        $view_name = 'admin_views_node';
        $view = views_get_view($view_name, TRUE);

        //  add the relationship
        $view->display['default']->display_options['relationships']['uid_1']['id'] = 'uid_1';
        $view->display['default']->display_options['relationships']['uid_1']['table'] = 'node_revision';
        $view->display['default']->display_options['relationships']['uid_1']['field'] = 'uid';
        $view->display['default']->display_options['relationships']['uid_1']['label'] = 'Revision User';
        // new column settings
        $new_column = array(
            'name_1' => array(
                'id' => 'name_1',
                'table' => 'users',
                'field' => 'name',
                'relationship' => 'uid_1',
                'label' => 'Updated By',
            )
        );
        // need to use this because array_splice by itself resets 'name_1' key to '0'
        // see http://php.net/manual/en/function.array-splice.php#56794
        $temp_array = array_splice( $view->display['default']->display_options['fields'] , 0, 7);
        $view->display['default']->display_options['fields'] = array_merge($temp_array , $new_column, $view->display['default']->display_options['fields']);

        views_save_view($view);
    }
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.