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.