Aggiornamento collettivo del campo?


35

Ho aggiunto un nuovo campo (di testo) a un tipo di contenuto Drupal 7 che ha già molti nodi.

Come posso riempire il campo con un valore predefinito per tutti questi nodi?

Risposte:


37

È possibile utilizzare EntityFieldQueryper recuperare un elenco di nodi, quindi aggiornare i campi del nodo con node_save():

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific value within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    node_save($node);
  }
}

Se si tratta di un'operazione una tantum, è possibile utilizzare la funzione Execute PHP del modulo Devel per eseguire quanto sopra: in caso contrario, è possibile creare un semplice modulo personalizzato.


2
Oltre a usare devel o vbo, puoi anche usare "drush scr myscript.php" per eseguire il codice sopra in un ambiente completamente avviato.
fietserwin,

Come cambia questo codice per adattarsi all'esecuzione della stessa operazione in un campo di riferimento termine?
Screenack

17

Vorrei usare Visualizzazioni Bulk Operations e utilizzare il "Esegui arbitraria PHP script" a che fare essenzialmente le voci di cui sopra, ma non hanno a che fare tutto il codice in più, solo il piccolo frammento che fa quello che si vuole (come $object->field_foo['und'][0]['value'] = 'some_value')


9

Se desideri solo aggiornare il campo con un certo valore, l'alternativa più performante alla risposta accettata è questa:

$lang = LANGUAGE_NONE; // Replace with ISO639-2 code if localizing
$node_type = 'page'; // Machine name of the content type

$query = new EntityFieldQuery;
$result = $query
  ->entityCondition('entity_type', 'node')
  ->propertyCondition('type', $node_type)
  ->execute();

if (!empty($result['node'])) {
  $nodes = entity_load('node', array_keys($result['node']));

  foreach($nodes as $node) {
    // Replace field_foo with the machine name of the field to update.
    // - 0 refers to specific within the field array, for when the field contains
    //    multiple values. If the field only has one value, it should be 0.
    $node->field_foo[$lang][0]['value'] = 'New Value';
    field_attach_presave('node', $node);
    field_attach_update('node', $node);
  }
}

La differenza sta nell'utilizzare direttamente field_attach_presavee le field_attach_updatefunzioni, che aggiornano correttamente solo il campo del nodo e saltano il resto del processo di salvataggio del nodo. Ciò ha un impatto sul fatto che nessun hook di salvataggio / salvataggio nodo verrà chiamato, la data "modificata" non verrà aggiornata alla data corrente, ecc. Secondo il vostro caso d'uso potrebbe essere meglio usare l'intero processo node_save ().


4

In effetti VBO (Views Bulk Operations) è una buona soluzione. Inoltre, con le ultime versioni, troverai un'opzione "Modifica valori entità" che fornisce un modo molto semplice per aggiornare la lingua dei nodi in una sola operazione.


2

Installa e abilita il modulo Operazioni collettive viste e crea una vista con una visualizzazione di pagina.

Aggiungi => Operazioni in blocco: campo Contenuto (Contenuto) in vista.

Fare riferimento

inserisci qui la descrizione dell'immagine

Seleziona i campi in cui desideri impostare il valore predefinito.

Nel tuo caso il suo titolo. Nell'immagine sono i tag.

Salva la vista e vai alla pagina che ha creato. Se si dispone di più di una pagina di risultati, è possibile scegliere di selezionare tutti gli elementi nella pagina corrente, tutti gli elementi in tutte le pagine oppure è possibile selezionare manualmente le caselle corrispondenti ai singoli nodi. Almeno una casella deve essere selezionata per procedere.

Ora imposti il ​​valore predefinito e lo salvi.

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.