Comment utiliser hook_node_presave pour modifier la valeur du champ

9

Fondamentalement, je veux mettre le prénom et le nom de famille ensemble dans $ node-> field_par_contact_name

Mais cela me donne un avertissement. (Voir ci-dessous)

function partnership_node_presave ($ node) {
  if ($ node-> type == 'partenariat') {
    $ first_name = $ node-> field_par_contact_first_name ['und'] [0] ['name'];
    $ patronyme = $ node-> field_par_contact_surname ['und'] [0] ['name'];

    // https://drupal.org/project/field_hidden
    // Variable cachée
    $ node-> field_par_contact_name ['und'] [0] ['value'] = $ first_name. ''. $ nom de famille;

    // Avertissement après sauvegarde: array_flip (): ne peut inverser que les valeurs STRING et INTEGER! dans DrupalDefaultEntityController-> load () (ligne 173 de ... / drupal-7.23 / includes / entity.inc
  }
}

Mis à jour , veuillez voir l'image: entrez la description de l'image ici

kenpeter
la source
soumettez-vous le formulaire par programme? Je veux dire, utilisez-vous hook_form_alter? puis drupal_form_submit quelque part dans votre code?
harshal

Réponses:

6

Pour commencer, vous utilisez probablement la mauvaise clé de tableau pour la valeur de champ que vous enregistrez; «nom» devrait y être «valeur».

$node->field_par_contact_name['und'][0]['value'];

Deuxièmement, vous utilisez en fait des champs de référence de terme de taxonomie pour vos champs "prénom" et "nom". Un point important à propos des champs de référence est que vous ne pouvez pas toujours supposer que les entités référencées ont été entièrement chargées et sont disponibles dans votre objet. Par défaut, lorsque l'objet nœud est chargé, ce champ ne ressemble qu'à ceci:

$node->field_par_contact_first_name (Array)
  'und' (Array)
    0 (Array)
      'tid' => 284

Seule la touche «tid» est définitivement là. 'nom' est une propriété du terme référencé et n'est généralement pas automatiquement disponible. (Le code suivant peut en fait charger le terme référencé et le rendre disponible dans l'objet $ node, mais c'est juste le cas si c'est le cas.)

Vous auriez beaucoup plus de facilité si vos champs "Prénom" et "Nom" étaient des champs de texte au lieu de références. Ensuite, ces valeurs appartiendraient directement au nœud lui-même, plutôt qu'à un terme de taxonomie distinct référencé.

Si vous êtes bloqué en utilisant des références de termes de taxonomie, alors vous devriez faire un point dans votre code pour charger le terme référencé, puis obtenir les valeurs dont vous avez besoin à partir de la propriété $ term-> name elle-même.

Les Lim
la source
Voir l'image ci-dessus. Il n'y a pas de «valeur»
Kenpeter
Ah, vous utilisez des champs de référence de terme de taxonomie pour le prénom et le nom de famille, pas des champs de texte comme je l'ai supposé. C'est particulier. :) Mise à jour de la réponse.
Les Lim
vous avez raison.
Kenpeter