Tôi đang thêm các trường nhất định từ một loại nội dung vào một biểu mẫu tùy chỉnh bằng cách sử dụng field_attach_form (). Khi biểu mẫu được gửi, tôi đang xử lý các trường đó bằng cách gọi trường_attach_form_validate () và field_attach_submit () từ #validate và #submit gọi lại.
Tại thời điểm đó, tôi muốn so sánh đối tượng nút được gửi, đã chuẩn bị với nút ban đầu và chỉ bận tâm đến nút_save () nếu bất kỳ trường nào đã thay đổi. Do đó, tôi bắt đầu bằng cách tải nút gốc bằng cách sử dụng entity_load_unchanged()
.
Thật không may, các mảng trường trong đối tượng nút ban đầu không khớp với các mảng trường trong đối tượng nút đã chuẩn bị đang chờ lưu, ngay cả khi không có thay đổi nào được thực hiện cho các trường, do đó, đơn giản là "$ old_field == $ new_field "So sánh là không thể. Ví dụ: một trường văn bản đơn giản xuất hiện như thế này trong bản gốc:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
Trong khi đó trong nút chuẩn bị nó xuất hiện như thế này.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
Bạn có thể nghĩ chỉ so sánh khóa 'giá trị', nhưng sau đó bạn chạy vào các trường được tạo thành từ các yếu tố khác không có khóa 'giá trị'. Ví dụ: chúng ta hãy xem trường địa chỉ không có khóa 'giá trị' và có các khóa trong cả các nút cũ và các nút được chuẩn bị không có đối tác.
Nút cũ
$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,
);
Nút chuẩn bị
$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',
);
Đối với các trường trống, vẫn có một sự khác biệt khác.
Nút cũ
$old_node->field_text = array();
Nút chuẩn bị
$node->field_text = array(
'und' => array(),
);
Tôi có thể so sánh tổng quát giá trị cũ và mới của bất kỳ trường nào để phát hiện xem nó có thay đổi hay không?
Đây chỉ là một điều không thể?
_field_invoke()
hoặc một cái gì đó liên quan để chuẩn bị cấu trúc trường đầy đủ từ nút "đã chuẩn bị", kết xuất cả hai trường và chỉ cần so sánh các chuỗi HTML này. Chỉ là một ý tưởng.