Jak używać hook_node_presave do zmiany wartości pola

9

Zasadniczo chcę połączyć imię i nazwisko w $ node-> field_par_cont__nazwa

Ale daje mi ostrzeżenie. (Patrz poniżej)

funkcja Partnership_node_presave ($ node) {
  if ($ node-> type == 'partnerstwo') {
    $ first_name = $ node-> field_par_contact_first_name ['und'] [0] ['name'];
    $ nazwisko = $ node-> field_par_contact_sename ['und'] [0] ['name'];

    // https://drupal.org/project/field_hidden
    // Ukryta zmienna
    $ node-> field_par_contact_name ['und'] [0] ['value'] = $ first_name. ''. nazwisko;

    // Ostrzeżenie po save: array_flip (): Może odwracać tylko wartości STRING i INTEGER! w DrupalDefaultEntityController-> load () (wiersz 173 ... / drupal-7.23 / obejmuje / entity.inc
  }
}

Zaktualizowany , zobacz obraz: wprowadź opis zdjęcia tutaj

kenpeter
źródło
przesyłasz formularz programowo? To znaczy, czy używasz hook_form_alter? a następnie drupal_form_submit gdzieś w kodzie?
harshal

Odpowiedzi:

6

Na początek prawdopodobnie używasz niewłaściwego klucza tablicy dla zapisanej wartości pola; „nazwa” powinna tam być „wartością”.

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

Po drugie, tak naprawdę używasz pól Taksonomia Term w polach „imię” i „nazwisko”. Ważną kwestią dotyczącą pól Odniesienia jest to, że nie zawsze można założyć, że obiekty, do których istnieją odniesienia, zostały w pełni załadowane i są dostępne w obiekcie. Domyślnie po załadowaniu obiektu węzła to pole wygląda tylko tak:

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

Na pewno jest tylko klucz „Tid”. „nazwa” jest właściwością przywoływanego terminu i zwykle nie jest automatycznie dostępna. (Kolejny kod może w rzeczywistości załadować odwołanie do terminu i udostępnić go w obiekcie $ node, ale tak się dzieje, jeśli tak.)

Byłbyś o wiele łatwiejszy, gdyby twoje pola „Imię” i „Nazwisko” były polami tekstowymi zamiast odniesień. Wówczas wartości te należałyby bezpośrednio do samego węzła, a nie do odrębnego terminu taksonomii.

Jeśli jednak utknąłeś przy użyciu odwołań do terminów taksonomicznych, powinieneś zrobić punkt w kodzie, aby załadować odwołanie do terminu, a następnie uzyskać potrzebne wartości z samej właściwości $ term-> name.

Les Lim
źródło
Zobacz zdjęcie powyżej. Nie ma „wartości”
kenpeter,
Ach, używasz pól Taksonomia Termin dla imienia i nazwiska, a nie pól tekstowych, jak zakładałem. To dziwne. :) Zaktualizowałem odpowiedź.
Les Lim
masz rację.
kenpeter,