it-swarm.it

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

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?

15
DanH

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 usa EntityFieldQuery e carica/salva ciascun nodo. Più Drupal-y, ma molto meno performante ... (richiede un carico completo del nodo e salva l'operazione per ogni nodo!).

10
geerlingguy

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 che io ti dia inizio su come sarebbe la query o stai bene da qui?

2
Mike

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);

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
Matoeil

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.

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
DRUPWAY

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.

enter image description here

0