Проблема в том, что вы должны установить пустое значение, которое совместимо с типом данных вашего поля. Если вы этого не сделаете, вы получите исключение. Поэтому передача NULLили array()ожидание строки вызовет ошибку.
Следует также помнить, что передаваемые данные также будут зависеть от того, является ли ваше поле одним значением, полем с несколькими значениями или полем с несколькими свойствами.
Если ваше поле представляет собой одно значение (и, следовательно, оболочка для поля является экземпляром EntityValueWrapper ), вам следует присвоить ему пустое значение, совместимое с данным типом данных . Например, два следующих метода эквивалентны:
$wrapper->title = '';
$wrapper->title->set('');
Однако следующие три примера вызовут исключение, потому что типы данных не совместимы с titleполем:
$wrapper->title->set();
$wrapper->title->set(NULL);
$wrapper->title->set(array());
Если ваше поле является полем с несколькими свойствами (например, форматированным текстовым полем, в котором определены как a, так valueи formatсвойством) и, таким образом, экземпляром EntityStructureWrapper , то array()или NULLбудет правильным пустым значением. Таким образом, вы можете сделать следующее:
$wrapper->field_formatted_text = array();
$wrapper->field_formatted_text = NULL;
Но в этом случае передача пустой строки вызвала бы ошибку. Обратите внимание, что вы могли бы valueвместо этого сделать свойство пустым, и в этом случае строка является правильным типом данных:
$wrapper->field_formatted_text->value = '';
Наконец, если ваше поле является полем с несколькими значениями (и, следовательно, ваша обертка является экземпляром EntityListWrapper ), то arrayили NULLявляются правильными пустыми значениями, и следующие три строки эквивалентны:
$wrapper->field_example_multiple->set();
$wrapper->field_example_multiple = array();
$wrapper->field_example_multiple = NULL;
Примечание. Вызов clearметода для оболочек не эквивалентен установке поля в пустое значение. Когда для поля установлено пустое значение, оно вызывает EntityMetadataWrapper :: updateParent для родительской оболочки поля. Это обеспечивает, помимо прочего, то, что setter callbackопределено в hook_entity_property_info . Звонок clearне делает этого.
EntityStructureWrapper::clear()илиEntityValueWrapper::clear()методы, возможно?