Cómo usar hook_node_presave para cambiar el valor del campo


9

Básicamente, quiero poner el nombre y el apellido juntos en $ node-> field_par_contact_name

Pero me da una advertencia. (Vea abajo)

function partnership_node_presave ($ nodo) {
  if ($ node-> type == 'asociación') {
    $ first_name = $ node-> field_par_contact_first_name ['und'] [0] ['name'];
    $ apellido = $ nodo-> field_par_contact_surname ['und'] [0] ['name'];

    // https://drupal.org/project/field_hidden
    // variable oculta
    $ nodo-> field_par_contact_name ['und'] [0] ['value'] = $ first_name. ''. $ apellido;

    // Advertencia después de guardar: array_flip (): ¡Solo puede voltear los valores STRING e INTEGER! en DrupalDefaultEntityController-> load () (línea 173 de ... / drupal-7.23 / includes / entity.inc
  }
}

Actualizado , ver imagen: ingrese la descripción de la imagen aquí


¿Está enviando el formulario mediante programación? Quiero decir, ¿estás usando hook_form_alter? y luego drupal_form_submit en algún lugar de su código?
harshal

Respuestas:


6

Para empezar, probablemente esté utilizando la clave de matriz incorrecta para el valor de campo que está guardando; 'nombre' debe ser 'valor' allí.

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

En segundo lugar, en realidad está utilizando campos de referencia de término de taxonomía para sus campos de "nombre" y "apellido". Un punto importante sobre los campos de referencia es que no siempre se puede suponer que las entidades referenciadas se han cargado completamente y están disponibles en su objeto. De manera predeterminada, cuando se carga el objeto de nodo, ese campo solo se ve así:

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

Solo la tecla 'tid' definitivamente está ahí. 'nombre' es una propiedad del término referenciado y, por lo general, no está disponible automáticamente. (El código posterior puede cargar el término referenciado y hacerlo disponible dentro del objeto $ node, pero eso es casualidad si es así).

Sería mucho más fácil si sus campos "Nombre" y "Apellido" fueran campos de texto en lugar de referencias. Entonces, esos valores pertenecerían directamente al nodo en sí, en lugar de a un término de taxonomía separado al que se hace referencia.

Sin embargo, si está atascado usando referencias de términos de taxonomía, entonces debe hacer un punto en su código para cargar el término referenciado, luego obtener los valores que necesita de la propiedad $ term-> name en sí.


Ver imagen arriba. No hay 'valor'
kenpeter

Ah, está utilizando campos de referencia de término de taxonomía para el nombre y apellido, no campos de texto como supuse. Eso es peculiar :) Se actualizó la respuesta.
Les Lim

estás en lo correcto.
Kenpeter
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.