Aggiorna tutti i nodi con un campo predefinito dopo aver aggiunto un nuovo campo al tipo di contenuto


15

Ho un tipo di contenuto esistente con un numero di nodi. Ho appena aggiunto un nuovo campo booleano con un valore predefinito "off".

Tuttavia, fino a quando non riesco a salvare nuovamente ciascun nodo, il valore predefinito non è impostato, quindi una vista che dovrebbe mostrare solo quei nodi in cui il nuovo campo utilizza il valore predefinito è attualmente vuota.

Come posso aggiornare i nodi esistenti, creati prima dell'aggiunta del campo, per impostare quel campo sul suo valore predefinito?


Ho risolto questo problema usando Views Bulk Operations and Rules come indicato in questo fantastico video: commerceguys.com/resources/articles/217
DanH

Il modulo di salvataggio dei nodi potrebbe aiutarti a forzare l'aggiornamento dei nodi.
Supriya Rajgopal,

Risposte:


9

Purtroppo, non esiste un modo molto semplice per farlo (oltre a VBO / regole), ma ecco il codice che utilizzo nelle funzioni di aggiornamento nei file di installazione del mio modulo personalizzato quando devo prepopolare i valori di campo per un determinato tipo di nodo dopo aver aggiunto un nuovo campo ( in questo caso, nodi 'pagina'):

<?php
// Get all nodes of 'page' type, populate the field with a value of '1'.
$pages = db_query("SELECT nid, vid FROM {node} WHERE type = 'page'")->fetchAllAssoc('nid');
foreach ($pages as $nid => $values) {
  $fields = array(
    'entity_type' => 'node',
    'bundle' => 'page',
    'deleted' => 0,
    'entity_id' => $values->nid,
    'revision_id' => $values->vid,
    'language' => LANGUAGE_NONE,
    'delta' => 0,
    'field_page_new_field_value' => 1,
  );
  db_insert('field_data_field_page_new_field')
    ->fields($fields)
    ->execute();
  db_insert('field_revision_field_page_new_field')
    ->fields($fields)
    ->execute();
}
?>

Un altro metodo manuale menzionato in questa risposta utilizza EntityFieldQuery e carica / salva ciascun nodo. Più Drupal-y, ma molto meno performante ... (richiede un caricamento completo del nodo e salva l'operazione per ciascun nodo!).


È molto triste
AlxVallejo il

Hai visto il modulo Field Defaults? dgo.to/field_defaults
forest

È un bug eseguire codice in questo modo senza svuotare anche tutti i nodi interessati dalla cache di caricamento dell'entità: entity_get_controller('node')->resetCache($nids);- in caso contrario un successivo node_load()potrebbe caricare dati non aggiornati dalla cache e uno qualsiasi node_save()di tali oggetti riscriverebbe tali dati non aggiornati nel database.
phils,

2

La scommessa migliore è direttamente nel MySQl. I tavoli sarebbero simili:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

Se li guardi è piuttosto semplice: hai bisogno di me per iniziare su come sarebbe la query o stai bene da qui?


Grazie Mike, no non è un problema, posso davvero gestire l'SQL. Sento solo che dovrebbe esserci un'opzione di "ri-salvataggio" o qualcosa fornito come operazione in blocco, penso che potrei davvero considerare VBO e l'integrazione delle regole per questo.
Dan

Inteso. Sono in una posizione simile, sto migrando circa 30.000 articoli da un altro CMS a Drupal. Non ho visto il punto di aggiungere un altro modulo quando l'SQL era veloce e sporco. Forse puoi anche scrivere una funzione rapida che chiamerebbe node_load () per tutti i tuoi nodi, che potrebbe funzionare anche.
Mike

0

Prova la logica qui sotto. è molto più veloce e passa anche tutte le implementazioni hook. maggiori dettagli . puoi scrivere una semplice query diretta db_select per ottenere tutti i nid e eseguirne il ciclo con questo codice di esempio.

$node = new stdClass();
$node->nid = $val;
$node->type = 'NODETYPE';
$node-field_whatever[LANGUAGE_NONE][0]['value'] = 'VALUE';
field_attach_presave('node', $node);
field_attach_update('node', $node);

0

usando sql, considerando che lo sono i nodi con il valore del campo non impostato

SELECT nid,vid
 from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

field_data_field_pr_choix_du_document essendo la tabella corrispondente al mio campo e contenente un valore nominale di voce impostato con ID entità che fa riferimento al nodo

ho fatto usando SQL insert ... selezionare la sintassi

https://dev.mysql.com/doc/refman/5.5/en/insert-select.html

INSERT INTO `field_data_field_pr_choix_du_document` (`entity_type`, `bundle`, `deleted`, `entity_id`, `revision_id`, `language`, `delta`, `field_pr_choix_du_document_value`)
SELECT 'node','procedure',0,nid,vid,'und',0,'Importer un document'
from node where type='procedure' and nid not in (select entity_id from field_data_field_pr_choix_du_document)

0

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.

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.


0

Ho trovato un modo semplice per aggiornare i campi nel tipo di contenuto con questo modulo: Field Defaults

Vedi la schermata. Puoi aggiornare il contenuto esistente con i valori predefiniti o conservare i valori esistenti.

L'ho provato su D7 e funziona.

inserisci qui la descrizione dell'immagine

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.