Ich füge mit field_attach_form () bestimmte Felder aus einem Inhaltstyp in ein benutzerdefiniertes Formular ein. Wenn das Formular gesendet wird, verarbeite ich diese Felder, indem ich field_attach_form_validate () und field_attach_submit () von #validate- und #submit-Rückrufen aufrufe.
Zu diesem Zeitpunkt möchte ich das vorbereitete Node-Objekt nach dem Senden mit dem ursprünglichen Node vergleichen und mich nur mit node_save () befassen, wenn sich eines der Felder geändert hat. Daher beginne ich mit dem Laden des ursprünglichen Knotens mit entity_load_unchanged()
.
Leider stimmen die Feldarrays im ursprünglichen Knotenobjekt nicht mit den Feldarrays im vorbereiteten Knotenobjekt überein, das darauf wartet, gespeichert zu werden, auch wenn keine Änderungen an den Feldern vorgenommen wurden, also ein einfaches "$ old_field == $ new_field" "vergleich ist unmöglich. Zum Beispiel erscheint ein einfaches Textfeld im Original so:
$old_node->field_text['und'][0] = array(
'value' => 'Test',
'format' => NULL,
'safe_value' => 'Test',
);
Während es im vorbereiteten Knoten so aussieht.
$node->field_text['und'][0] = array(
'value' => 'Test',
);
Sie könnten denken, nur den 'Wert'-Schlüssel zu vergleichen, aber dann stoßen Sie auf Felder, die aus anderen Elementen bestehen, die keine' Wert'-Schlüssel haben. Schauen wir uns zum Beispiel ein Adressfeld an, in dem es keinen "Wert" -Schlüssel gibt und Schlüssel sowohl im alten als auch im vorbereiteten Knoten vorhanden sind, die keine Gegenstücke haben.
Alter Knoten
$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,
);
Vorbereiteter Knoten
$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',
);
Bei leeren Feldern gibt es noch eine Diskrepanz.
Alter Knoten
$old_node->field_text = array();
Vorbereiteter Knoten
$node->field_text = array(
'und' => array(),
);
Kann ich den alten und den neuen Wert eines Feldes generisch vergleichen, um festzustellen, ob es sich geändert hat oder nicht?
Ist das nur eine Unmöglichkeit?
_field_invoke()
oder etwas im Zusammenhang mit der Vorbereitung der vollständigen Feldstruktur vom "vorbereiteten" Knoten, dem Rendern beider Felder und dem einfachen Vergleichen dieser HTML-Zeichenfolgen. Nur eine Idee.