field_attach_form ()을 사용하여 콘텐츠 유형의 특정 필드를 사용자 정의 양식에 추가하고 있습니다. 양식이 제출되면 #validate 및 #submit 콜백에서 field_attach_form_validate () 및 field_attach_submit ()을 호출하여 해당 필드를 처리합니다.
이 시점에서 제출 후 준비된 노드 객체를 원래 노드와 비교하고 필드가 변경된 경우 node_save () 만 신경 쓰려고합니다. 따라서을 사용하여 원래 노드를로드하는 것으로 시작합니다 entity_load_unchanged()
.
불행히도, 원래 노드 오브젝트의 필드 배열은 필드를 변경하지 않아도 저장 대기중인 준비된 노드 오브젝트의 필드 배열과 일치하지 않으므로 간단한 "$ old_field == $ new_field "비교는 불가능합니다. 예를 들어, 간단한 텍스트 필드는 원본에서 다음과 같이 나타납니다.
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
준비된 노드에서는 다음과 같이 나타납니다.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
'값'키를 비교하는 것으로 생각할 수 있지만 '값'키가없는 다른 요소로 구성된 필드가 나타납니다. 예를 들어, 어떤 '가치'키가없는 주소 필드에서의 살펴 보자 및 대응을하지 않아도 모두 이전 및 준비 노드에 키가 있습니다.
이전 노드
$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->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',
);
빈 필드의 경우 또 다른 불일치가 있습니다.
이전 노드
$old_node->field_text = array();
준비된 노드
$node->field_text = array(
'und' => array(),
);
필드의 이전 값과 새 값을 일반적으로 비교하여 변경 여부를 감지 할 수 있습니까?
이것은 단지 불가능한가?
_field_invoke()
"준비된"노드에서 전체 필드 구조를 준비하고 두 필드를 렌더링하고 이러한 HTML 문자열을 간단히 비교하는 것과 관련 이 있거나 관련이 있다고 생각합니다 . 그냥 생각이야