Encapsuleurs de métadonnées d'entité
L'API d'entité fournit certaines classes d'encapsuleur que vous pouvez utiliser pour traiter facilement les entités et tirer parti des modules d'informations sur les propriétés d'entité fournis. Avec l'aide des wrappers, vous pouvez accéder aux informations de propriété, parcourir les propriétés connues, ou simplement obtenir / définir les valeurs de données décrites, etc.
Voici quelques exemples d'utilisation simples que l'on trouve dans le fichier README:
Pour utiliser ces informations (métadonnées), le module fournit des classes wrapper qui facilitent l'obtention et la définition de valeurs. L'encapsuleur prend en charge l'utilisation enchaînée pour récupérer les encapsuleurs des propriétés d'entité, par exemple pour obtenir l'adresse e-mail d'un auteur de nœud que l'on pourrait utiliser:
$wrapper = entity_metadata_wrapper('node', $node);
$wrapper->author->mail->value();
Pour mettre à jour l'adresse e-mail de l'utilisateur, on pourrait utiliser
$wrapper->author->mail->set('[email protected]');
ou
$wrapper->author->mail = '[email protected]';
Les wrappers retournent toujours les données comme décrit dans les informations de propriété, qui peuvent être récupérées directement via entity_get_property_info () ou à partir du wrapper:
$mail_info = $wrapper->author->mail->info();
Afin de forcer l'obtention d'une valeur textuelle purifiée pour la sortie, on peut utiliser, par exemple
$wrapper->title->value(array('sanitize' => TRUE));
pour obtenir le titre du nœud aseptisé. Lorsqu'une propriété est déjà retournée nettoyée par défaut, comme le corps du nœud, on peut éventuellement obtenir les données non filtrées telles qu'elles apparaîtront dans un navigateur pour d'autres cas d'utilisation. Pour ce faire, on peut activer l'option «décoder», qui garantit que pour toutes les données filtrées, les balises sont supprimées et les entités HTML sont décodées avant le retour de la propriété:
$wrapper->body->value->value(array('decode' => TRUE));
De cette façon, on obtient toujours les données comme indiqué à l'utilisateur. Cependant, si vous voulez vraiment obtenir la valeur brute et non traitée, même pour les données textuelles filtrées, vous pouvez le faire via:
$wrapper->body->value->raw();
Plus d'exemples:
$wrapper->body->set(array('value' => "content"));
$wrapper->field_text[0] = 'the text';
$wrapper->field_text[0]->set(array('value' => "content"));
$wrapper->field_text2->summary = 'the summary';
$wrapper->field_text2->value = 'the text';
$wrapper->save();
$wrapper->delete();
Plus de documents : http://drupal.org/node/1021556
Appeler
field_attach_update('node', $node)
à la fin dehook_node_update
travaillé pour moi. Je suppose qu'àfield_attach_insert('node', $node)
la fin de çahook_node_insert
marcherait aussi. Ainsi, un exemple de fonction ressemblerait à ceci:Il n'est pas nécessaire d'appeler
node_load
node_save
ou de retourner quoi que ce soit.Je pense que la raison en est que
node_save
, à partir de laquellehook_node_update
ethook_node_insert
sont appelés, encapsule toutes les requêtes de base de données dans une transaction. (Notez la première lignenode_save
:$transaction = db_transaction()
.) Ces requêtes ne sont pas appelées jusqu'ànode_save
finitions. La dernière requête quinode_save
s'ajoute à la transaction est appelée à partir defield_attach_update
, qui utilise l'objet $ node tel qu'il est avanthook_node_update
est appelé. Vous devez donc mettre en file d'attente une autre requête en appelant àfield_attach_update
nouveau. C'est du moins ce que je comprends de ce qui se passe.Si vous rencontrez des problèmes pour modifier les attributs non liés au champ du nœud (par exemple,
$node->log
), essayez_node_save_revision($node, $user->uid, 'vid');
également d' appeler . Cela ne créera pas de nouvelle révision.la source
Voici comment vous modifiez les valeurs sur un nœud:
la source
und
n'est pas vraiment approprié ici, OP a déjà déclaré dans le code qu'ils utilisent$node->language
pour le code de langueUne amélioration de la solution de Lance ci-dessus, évitant la sauvegarde d'un nœud entier lorsque seules quelques valeurs de champ sont modifiées:
Cela pourrait également être utile pour éviter les effets secondaires de
node_save()
.Source: enregistrement des champs du nœud sans enregistrer le nœud lui-même
https://www.urbaninsight.com/2011/10/24/saving-nodes-fields-without-saving-node-itself
la source