Как использовать hook_node_presave для изменения значения поля

9

По сути, я хочу объединить имя и фамилию в $ node-> field_par_contact_name

Но это дает мне предупреждение. (См. ниже)

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

    // https://drupal.org/project/field_hidden
    // Скрытая переменная
    $ node-> field_par_contact_name ['und'] [0] ['value'] = $ first_name. ''. $ Фамилия;

    // Предупреждение после сохранения: array_flip (): Может переворачивать только значения STRING и INTEGER! в DrupalDefaultEntityController-> load () (строка 173 из ... / drupal-7.23 / includes / entity.inc
  }
}

Обновлено , пожалуйста, смотрите изображение: введите описание изображения здесь

kenpeter
источник
Вы отправляете форму программно? Я имею в виду вы используете hook_form_alter? а затем drupal_form_submit где-нибудь в вашем коде?
Harshal

Ответы:

6

Для начала вы, вероятно, используете неправильный ключ массива для значения поля, которое вы сохраняете; «имя» должно быть «значение» там.

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

Во-вторых, вы на самом деле используете поля справочника таксономических терминов для своих полей «имя» и «фамилия». Важным моментом в отношении полей ссылки является то, что вы не всегда можете предположить, что ссылочные объекты полностью загружены и доступны в вашем объекте. По умолчанию, когда загружается объект узла, это поле выглядит только так:

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

Определенно есть только клавиша «Tid». 'name' является свойством указанного термина и обычно не доступно автоматически. (Последующий код может фактически загрузить указанный термин и сделать его доступным в объекте $ node, но это просто случайность, если так.)

Это было бы намного проще, если бы поля «Имя» и «Фамилия» были текстовыми, а не ссылками. Тогда эти значения будут принадлежать непосредственно самому узлу, а не отдельному термину таксономии, на который делается ссылка.

Однако, если вы застряли, используя ссылки на термины таксономии, вы должны указать в своем коде точку для загрузки ссылочного термина, а затем получить нужные значения из самого свойства $ term-> name.

Les Lim
источник
Смотрите изображение выше. Там нет «значение»
kenpeter
Ах, вы используете поля справочника таксономических терминов для имени и фамилии, а не текстовые поля, как я предполагал. Это своеобразно. :) Обновил ответ.
Les Lim
ты прав.
Кенпетер