web-dev-qa-db-fra.com

Mettre à jour tous les nœuds avec un champ par défaut après avoir ajouté un nouveau champ au type de contenu

J'ai un type de contenu existant avec un certain nombre de nœuds. Je viens d'ajouter un nouveau champ booléen avec une valeur par défaut "off".

Cependant, jusqu'à ce que je réenregistre chaque nœud, la valeur par défaut n'est pas définie, donc une vue qui ne devrait montrer que les nœuds où le nouveau champ utilise la valeur par défaut est actuellement vide.

Comment puis-je mettre à jour les nœuds existants, créés avant l'ajout du champ, pour définir ce champ à sa valeur par défaut?

15
DanH

Malheureusement, il n'y a pas de moyen très simple de le faire (à part VBO/règles), mais voici le code que j'utilise dans les fonctions de mise à jour dans mes fichiers d'installation de module personnalisé lorsque j'ai besoin de préremplir des valeurs de champ pour un certain type de nœud après avoir ajouté un nouveau champ ( dans ce cas, nœuds 'page'):

<?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();
}
?>

Une autre méthode manuelle mentionnée dans cette réponse utilise EntityFieldQuery et charge/enregistre chaque nœud. Plus Drupal-y, mais beaucoup moins performant ... (nécessite une charge de nœud complète et une opération de sauvegarde pour chaque nœud!).

10
geerlingguy

Le meilleur pari est directement dans le MySQl. Les tableaux ressembleraient à:

field_data_field_newbooleanfieldname
field_revision_field_newbooleanfieldname

Si vous les regardez, c'est assez simple - avez-vous besoin de moi pour commencer à quoi ressemblerait la requête ou êtes-vous d'accord à partir d'ici?

2
Mike

Essayez simplement la logique ci-dessous. son beaucoup plus rapide et son bypass toutes les implémentations de crochet aussi. plus de détails . vous pouvez écrire une simple requête directe db_select pour obtenir tous les nid et la boucler avec cet exemple de code.

$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

en utilisant sql, sachant que les nœuds dont la valeur de champ n'est pas définie sont

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 étant la table correspondant à mon champ et contenant une entrée par valeur définie avec l'identifiant d'entité référençant le nœud

j'ai fait en utilisant l'insertion SQL ... sélectionnez la syntaxe

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

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.

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.

0
DRUPWAY

J'ai trouvé un moyen facile de mettre à jour les champs dans le type de contenu avec ce module: Valeurs par défaut des champs

Voir capture d'écran. Vous pouvez mettre à jour le contenu existant avec la ou les valeurs par défaut ou conserver les valeurs existantes.

Je l'ai testé sur D7 et ça marche.

enter image description here

0
Sébastien Gicquel