it-swarm.it

Aggiornamento collettivo del campo?

Ho aggiunto un nuovo campo (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?

34
daphshez

Puoi usare EntityFieldQuery per 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 Devel del modulo Esegui PHP per eseguire quanto sopra: altrimenti, puoi creare un semplice modulo personalizzato.

37
user7

Vorrei usare Views Bulk Operations e usare "Execute Arbitrary PHP Script" per fare essenzialmente gli elementi sopra, ma non devi fare tutto il codice extra , solo il piccolo frammento che fa quello che vuoi (come $object->field_foo['und'][0]['value'] = 'some_value')

17
rfay

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_presave e field_attach_update funzioni, 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 ().

9
Mirsoft

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.

4
xaa

Installa e abilita il modulo Views Bulk Operations e crea una vista con una visualizzazione di pagina.

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

Fare riferimento

enter image description here

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.

2
DRUPWAY