J'irais certainement pour field_attach_update
.
L'idée est simple. Chargez simplement le nœud et enregistrez-le à l'aide de field_attach_update.
Ex:
$node = node_load($nid);
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Cela ne changera aucun horodatage ni aucun autre hook que node_save invoque habituellement. Le chargement du nœud invoquera également certains crochets, donc ce n'est probablement pas si efficace.
Si vous avez le nid et si la structure du nœud est simple, vous pouvez également le faire comme ceci:
$node = new stdClass();
$node->nid = $nid; // Enter the nid taken. Make sure it exists.
$node->type = 'article';
$node->field_name[LANGUAGE_NONE][0]['value'] = 'New value';
field_attach_presave('node', $node);
field_attach_update('node', $node);
// Clear the static loading cache.
entity_get_controller('node')->resetCache(array($node->nid));
Quoi qu'il en soit, si vous essayez de mettre à jour autre chose que des champs, cela ne fonctionnera pas (statut des commentaires, statut publié, etc.). De plus, si vous utilisez node_save, le cache pour le noeud particulier sera effacé automatiquement pour différentes méthodes, nous devons l'effacer avec 'entity_get_controller'.
Mise à jour:
Il semble que vous devriez également appeler field_attach_presave()
pour permettre aux autres modules de traiter correctement l'entrée de champ. Le module de fichiers, par exemple, l'utilise pour définir l'état du fichier sur permanent à l'aide de ce hook. J'ai mis à jour mes 2 exemples ci-dessus.
field_attach_update
?node_save
lafield_attach_update
et deEntityFieldQuery
ladb_query_range
a été très enrichissante. De 3h de mise à jour à 40 minutes.Si vous ne souhaitez pas enregistrer les données de champ sans provoquer les événements et actions standard, vous pouvez utiliser drupal_write_record .
Voici un exemple pour insérer Hello World dans le champ de corps d'un noeud de type article avec un id de 1.
Si votre site est multilingue, vous voudrez utiliser 'en' ou la langue de votre contenu au lieu de 'und'.
Si vous effectuez une révision, vous devrez faire attention à insérer le bon ID de révision, sinon vous pouvez simplement insérer la même valeur que entity_id.
Notez comment ces données sont insérées dans deux tables field_data_ * et field_revision_ *. Vous devez insérer dans les deux pour vous assurer que le site fonctionne comme vous le souhaitez.
Après avoir exécuté cela, vous devrez ensuite vider les caches pour que les champs s'affichent en fonction de la configuration de votre mise en cache.
la source
Pour une simple mise à jour comme celle-ci où de nombreux nœuds doivent être mis à jour, j'utilise toujours une instruction de mise à jour MySQL. Oui, la mise en cache doit être prise en considération, mais vous pouvez simplement vider le cache après avoir terminé et tout va bien. Bien sûr, vous devez être familier avec la structure des données, mais elle est relativement simple dans Drupal 6. (bien qu'horrible dans Drupal 7)
la source
Je suggère
field_attach_update
aussi, et pas une requête SQL directe, car sql ne met pas à jour l'objet de cache de noeud, et dans votre prochainnode_load
vous ne chargerez pas la valeur de champ mise à jour, vous chargerez l'ancienne valeurfield_attach_update
est bien meilleur qu'une requête SQL directe.la source
stdClass
qu'objet sans chargement. Savez-vous ce qui pourrait arriver si j'essaie de mettre à jour le nœud de cette manière sans définir tous les champs? Seront-ils remplacés par des valeurs nulles ou par défaut? Peut-on ignorer ceux-ci en mettant à jour le processus?Après avoir essayé toutes les approches mentionnées dans les autres réponses, j'ai eu des temps de mise à jour très lents (environ 7 jours pour 700 000 nœuds d'un type de nœud avec plus de 20 champs) jusqu'à ce que je trouve cet article: http://www.drupalonwindows.com/en/ blog / uniquement-mise à jour-champs-modifiés-ou-propriétés-entité-drupal .
Après avoir implémenté quelque chose comme le code ci-dessous dans un hook_update, j'ai réduit le temps de mise à jour à 2 heures, ce qui, je pense, est gérable.
la source
J'avais même la même exigence de mettre à jour un champ pour tous les nœuds d'un type de contenu particulier. J'ai utilisé node_load_multiple et field_attach_update .
Je l'ai couru par drush et c'était assez rapide.
la source
Avez-vous envisagé de faire ces mises à jour directement dans la base de données à l'aide de mySQL? C'est probablement le moyen le plus simple et le plus rapide pour réaliser ce que vous voulez.
Voici un exemple simple. Vous pouvez exécuter une telle commande à partir de l'onglet 'SQL' de phpMyAdmin. Imaginez que vous ayez un type de contenu appelé Profil de membre. Vous y trouverez un champ nommé «Type de membre» (par exemple, entreprise, particulier, organisation). Supposons que vous souhaitiez mettre à jour toutes les occurrences de «COMPANY» vers «company». La commande suivante fera exactement cela.
UPDATE content_type_member_profile SET
field_type_of_member_value
= 'company' WHEREfield_type_of_member_value
= 'COMPANY';En outre, passez à la section Prise en main de MySQL
la source