web-dev-qa-db-fra.com

Mise à jour de champ en masse?

J'ai ajouté un nouveau champ (texte) à un type de contenu Drupal 7 qui a déjà de nombreux nœuds.

Comment puis-je remplir le champ avec une valeur par défaut pour tous ces nœuds?

34
daphshez

Vous pouvez utiliser EntityFieldQuery pour récupérer une liste de nœuds, puis mettre à jour les champs du nœud avec 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);
  }
}

S'il s'agit d'une opération ponctuelle, vous pouvez utiliser la fonction Devel du module Exécuter PHP pour exécuter ce qui précède: sinon, vous pouvez créer un module personnalisé simple.

37
user7

J'utiliserais Views Bulk Operations et utiliser le "Execute Arbitrary PHP Script" pour faire essentiellement les éléments ci-dessus, mais vous n'avez pas à faire tout le code supplémentaire , juste le petit extrait qui fait ce que vous voulez (comme $object->field_foo['und'][0]['value'] = 'some_value')

17
rfay

Si vous souhaitez uniquement mettre à jour le champ avec une certaine valeur, l'alternative la plus performante à la réponse acceptée est la suivante:

$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 différence réside dans l'utilisation directe de field_attach_presave et field_attach_update fonctions, qui mettent à jour correctement uniquement le champ de nœud et ignorent le reste du processus d'enregistrement de nœud. Cela a pour conséquence qu'aucun crochet de pré-enregistrement/sauvegarde de nœud ne sera appelé, la date "modifiée" ne sera pas mise à jour à la date actuelle, etc. Selon votre cas d'utilisation, il peut être préférable d'utiliser le processus node_save () entier.

9
Mirsoft

En effet, VBO (Views Bulk Operations) est une bonne solution. De plus, avec les dernières versions, vous trouverez une option "Modifier les valeurs d'entité" qui fournit un moyen très simple de mettre à jour la langue des nœuds en une seule opération.

4
xaa

Installez et activez le module Views Bulk Operations et créez une vue avec un affichage de page.

Ajouter => Opérations en bloc: champ Contenu (Contenu) en vue.

Référer

enter image description here

Sélectionnez les champs dont vous souhaitez définir la valeur par défaut.

Dans votre cas, son titre. Dans l'image, ce sont des balises.

Enregistrez la vue et accédez à la page qu'elle a créée. Si vous avez plusieurs pages de résultats, vous pouvez choisir de sélectionner tous les éléments de la page en cours, tous les éléments de toutes les pages, ou vous pouvez cocher manuellement les cases correspondant aux nœuds individuels. Au moins une case à cocher doit être cochée pour continuer.

Maintenant, vous définissez la valeur par défaut et l'enregistrez.

2
DRUPWAY