Saya menambahkan bidang tertentu dari jenis konten ke formulir kustom menggunakan field_attach_form (). Ketika formulir dikirimkan saya sedang memproses bidang-bidang tersebut dengan memanggil field_attach_form_validate () dan field_attach_submit () dari #validate dan #submit callbacks.
Pada titik itu, saya ingin membandingkan post-submit, objek node yang disiapkan dengan node asli dan hanya repot-repot untuk node_save () jika ada bidang yang berubah. Oleh karena itu, saya mulai dengan memuat simpul asli menggunakan entity_load_unchanged()
.
Sayangnya, array bidang dalam objek simpul asli tidak cocok dengan array bidang dalam objek simpul yang disiapkan yang sedang menunggu untuk disimpan, bahkan jika tidak ada perubahan yang dilakukan pada bidang, jadi sederhana "$ old_field == $ new_field "perbandingan itu tidak mungkin. Misalnya, bidang teks sederhana muncul seperti ini di aslinya:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
Sedangkan pada node yang disiapkan tampak seperti ini.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
Anda mungkin berpikir untuk hanya membandingkan kunci 'nilai', tetapi kemudian Anda lari ke bidang yang terdiri dari elemen lain yang tidak memiliki kunci 'nilai'. Sebagai contoh, mari kita lihat bidang alamat di mana tidak ada kunci 'nilai' dan ada kunci di kedua node lama dan siap yang tidak memiliki rekan.
Node lama
$old_node->field_address['und'][0] = array(
'country' => 'GB',
'administrative_area' => 'Test',
'sub_administrative_area' => NULL,
'locality' => 'Test',
'dependent_locality' => NULL,
'postal_code' => 'Test',
'thoroughfare' => 'Test',
'premise' => 'Test',
'sub_premise' => NULL,
'organisation_name' => 'Test',
'name_line' => 'Test',
'first_name' => NULL,
'last_name' => NULL,
'data' => NULL,
);
Node yang disiapkan
$node->field_address['und'][0] = array(
'element_key' => 'node|page|field_address|und|0',
'thoroughfare' => 'Test',
'premise' => 'Test',
'locality' => 'Test',
'administrative_area' => 'Test',
'postal_code' => 'Test',
'country' => 'GB',
'organisation_name' => 'Test',
'name_line' => 'Test',
);
Untuk bidang kosong, masih ada perbedaan.
Node lama
$old_node->field_text = array();
Node yang disiapkan
$node->field_text = array(
'und' => array(),
);
Dapatkah saya secara umum membandingkan nilai lama dan baru bidang apa saja untuk mendeteksi apakah sudah berubah atau tidak?
Apakah ini hanya ketidakmungkinan?
_field_invoke()
atau sesuatu yang terkait untuk menyiapkan struktur bidang penuh dari "disiapkan" simpul, membuat kedua bidang dan hanya membandingkan string HTML ini. Hanya sebuah ide.