Bir alan türü belirli alanları field_attach_form () kullanarak özel bir forma ekliyorum. Form gönderildiğinde, #validate ve #submit geri çağrılarından field_attach_form_validate () ve field_attach_submit () yöntemlerini çağırarak bu alanları işliyorum.
Bu noktada, post-post, hazırlanmış düğüm nesnesini orijinal düğüme karşılaştırmak ve yalnızca alanlardan herhangi biri değiştiğinde node_save () ile uğraşmak istiyorum. Bu nedenle, orijinal düğümü kullanarak yükleyerek başlıyorum entity_load_unchanged()
.
Ne yazık ki, orijinal düğüm nesnesindeki alan dizileri, alanlarda değişiklik yapılmasa bile, kaydedilmeyi bekleyen hazırlanmış düğüm nesnesindeki alan dizileriyle eşleşmiyor, bu nedenle basit bir "$ old_field == $ new_field "karşılaştırma imkansız. Örneğin, orijinalde şöyle basit bir metin alanı görünür:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
Oysa hazırlanan düğümde böyle görünür.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
Sadece 'değer' anahtarını karşılaştırmayı düşünebilirsiniz, ancak daha sonra 'değer' anahtarları olmayan diğer öğelerden oluşan alanlarla karşılaşırsınız. Örneğin, hiçbir 'değer' anahtar olduğu bir adres alanına Bakalım ve karşılık bulmaz hem eski hem de hazırlanan nodlarında tuşları vardır.
Eski düğüm
$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,
);
Hazırlanan düğüm
$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',
);
Boş alanlar için başka bir tutarsızlık daha vardır.
Eski düğüm
$old_node->field_text = array();
Hazırlanan düğüm
$node->field_text = array(
'und' => array(),
);
Değişip değişmediğini tespit etmek için herhangi bir alanın eski ve yeni değerini genel olarak karşılaştırabilir miyim?
Bu sadece bir imkansızlık mı?
_field_invoke()
ya da "hazırlanan" düğümden tam alan yapısı hazırlamak, her iki alanı render ve sadece bu HTML dizeleri karşılaştırın ilgili bir şey düşünüyorum . Sadece bir fikir.