Cara menggunakan hook_node_presave untuk mengubah nilai bidang

9

Pada dasarnya, saya ingin memasukkan nama depan & nama keluarga menjadi $ node-> field_par_contact_name

Tapi itu memberi saya peringatan. (Lihat di bawah)

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

    // https://drupal.org/project/field_hidden
    // Variabel tersembunyi
    $ node-> field_par_contact_name ['und'] [0] ['value'] = $ first_name. '' $ nama keluarga;

    // Peringatan setelah simpan: array_flip (): Hanya dapat membalik nilai STRING dan INTEGER! di DrupalDefaultEntityController-> load () (baris 173 dari ... / drupal-7.23 / include / entity.inc
  }
}

Diperbarui , silakan lihat gambar: masukkan deskripsi gambar di sini

kenpeter
sumber
Apakah Anda mengirimkan formulir secara terprogram? Maksud saya apakah Anda menggunakan hook_form_alter? dan kemudian drupal_form_submit suatu tempat di kode Anda?
harshal

Jawaban:

6

Sebagai permulaan, Anda mungkin menggunakan kunci array yang salah untuk nilai bidang yang Anda simpan; 'nama' harus menjadi 'nilai' di sana.

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

Kedua, Anda benar-benar menggunakan bidang Referensi Istilah Taksonomi untuk bidang "nama depan" dan "nama keluarga" Anda. Satu poin penting tentang bidang Referensi adalah bahwa Anda tidak selalu dapat berasumsi bahwa entitas yang direferensikan telah dimuat penuh dan tersedia di objek Anda. Secara default, ketika objek node dimuat, bidang itu hanya terlihat seperti ini:

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

Hanya kunci 'tid' yang pasti ada di sana. 'nama' adalah properti dari istilah yang dirujuk, dan biasanya tidak tersedia secara otomatis. (Kode berikutnya sebenarnya dapat memuat istilah yang direferensikan dan membuatnya tersedia dalam objek $ node, tapi itu hanya kebetulan jika demikian.)

Anda akan memiliki waktu yang jauh lebih mudah jika bidang "Nama Depan" dan "Nama Keluarga" Anda adalah bidang teks dan bukan referensi. Kemudian, nilai-nilai itu akan menjadi milik langsung dari node itu sendiri, bukan ke istilah taksonomi terpisah yang dirujuk.

Jika Anda terjebak menggunakan referensi istilah taksonomi, maka Anda harus membuat titik dalam kode Anda untuk memuat istilah yang direferensikan, kemudian dapatkan nilai yang Anda butuhkan dari properti $ term-> name itu sendiri.

Les Lim
sumber
Lihat gambar di atas. Tidak ada 'nilai'
kenpeter
Ah, Anda menggunakan bidang Referensi Istilah Taksonomi untuk nama depan dan nama keluarga, bukan bidang teks seperti yang saya asumsikan. Itu aneh. :) Memperbarui jawabannya.
Les Lim
Anda benar.
kenpeter