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

15

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?

DanH
la source
J'ai résolu ce problème en utilisant Views Bulk Operations and Rules comme indiqué dans cette fantastique vidéo: commerceguys.com/resources/articles/217
DanH
Le module Réenregistrer les nœuds peut vous aider à forcer la mise à jour des nœuds.
Supriya Rajgopal

Réponses:

9

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!).

geerlingguy
la source
C'est très triste
AlxVallejo
Avez-vous vu le module Field Defaults? dgo.to/field_defaults
forest
Il est un bug d'exécuter du code comme ceci sans rinçage aussi tous les nœuds concernés à partir du cache de la charge de l' entité: entity_get_controller('node')->resetCache($nids);- sinon une suite node_load()peut charger des données périmées du cache, et tout node_save()de cet objet serait d' écrire que de retour de données périmées à la base de données.
phils
2

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 d'ici?

Mike
la source
Merci Mike, non ce n'est pas un problème, je peux vraiment gérer le SQL. J'ai juste l'impression qu'il devrait y avoir une option de `` ré-sauvegarde '' ou quelque chose comme une opération en bloc, je pense que je pourrais regarder l'intégration VBO et les règles pour cela en fait.
DanH
Compris. Je suis dans une position similaire, je migre environ 30 000 articles d'un autre CMS vers Drupal. Je n'ai pas vu l'intérêt d'ajouter un autre module lorsque le SQL était rapide et sale. Peut-être que vous pouvez également écrire une fonction rapide qui appellera node_load () pour tous vos nœuds, qui peut également fonctionner.
Mike
0

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);
nadeesha meththananda
la source
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)
Matoeil
la source
0

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 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.

DRUPWAY
la source
0

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 cela fonctionne.

entrez la description de l'image ici

Sébastien Gicquel
la source