Mise à jour sur le terrain en vrac?


35

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

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

Réponses:


37

Vous pouvez utiliser EntityFieldQuerypour 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 unique, vous pouvez utiliser la fonction Exécuter PHP du module Devel pour exécuter ce qui précède: sinon, vous pouvez créer un module personnalisé simple.


2
Outre l’utilisation de devel ou vbo, vous pouvez également utiliser "drush scr myscript.php" pour exécuter le code ci-dessus dans un environnement totalement amarré.
Fietserwin

Comment ce code change-t-il pour permettre d'effectuer la même opération dans un champ de référence de terme?
Screenack

17

Je voudrais utiliser Views Bulk Operations et utiliser le "script PHP arbitraire d'exécution" 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')


9

Si vous souhaitez uniquement mettre à jour un champ avec une 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 field_attach_presaveet les field_attach_updatefonctions, qui mettent à jour correctement uniquement le champ du nœud et ignorent le reste du processus de sauvegarde du nœud. Cela a pour conséquence qu'aucun noeud de préenregistrement / enregistrement de noeuds ne sera appelé, la date "modifiée" ne sera pas mise à jour à la date du jour, etc. Selon votre cas d'utilisation, il peut être préférable d'utiliser un processus node_save () complet.


4

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 offre un moyen très simple de mettre à jour la langue des nœuds en une seule opération.


2

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

entrez la description de l'image ici

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

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

Enregistrez la vue et accédez à la page 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, de tous les éléments de toutes les pages ou vous pouvez cocher manuellement les cases correspondant à des nœuds individuels. Au moins une case à cocher doit être cochée pour continuer.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.