Как очистить значение поля с помощью entity_metadata_wrapper ()?

Предположим, что у меня есть объект с полем field_foo, и я хочу очистить это значение поля.

Что мне следует передать в $wrapper->set()?

Я пробовал NULL и array() и оба выдают сообщение об ошибке.

19 голосов | спросил joachim 27 MarpmWed, 27 Mar 2013 18:49:11 +04002013-03-27T18:49:11+04:0006 2013, 18:49:11

4 ответа


21

Проблема заключается в том, что вы должны установить пустое значение, совместимое с типом данных вашего поля. Если вы этого не сделаете, вы получите исключение. Передача NULL или array(), когда ожидается строка, приведет к возникновению ошибки.

Еще одна вещь, о которой следует помнить, состоит в том, что передаваемые вами данные также будут зависеть от того, является ли ваше поле единственным значением, полем с несколькими значениями или полем с несколькими свойствами.

Если ваше поле является единственным значением (и, таким образом, оболочка для этого поля является экземпляром EntityValueWrapper ), вы должны присвоить ему пустое значение , совместимое с типом данных . Например, два следующих метода эквивалентны:

$wrapper->title = '';
$wrapper->title->set('');

Однако следующие три примера вызовут исключение, поскольку типы данных не совместимы с полем title:

$wrapper->title->set();
$wrapper->title->set(NULL);
$wrapper->title->set(array());

Если ваше поле является полем с несколькими свойствами (например, форматированное текстовое поле, которое определяет как свойство 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 не делает этого.

ответил Alice Heaton 28 MarpmThu, 28 Mar 2013 15:10:38 +04002013-03-28T15:10:38+04:0003 2013, 15:10:38
3

В дополнение к другим ответам и комментариям, если требуется несколько полей и , как уже отмечалось, вы не можете использовать

$wrapper->field_example_multiple->set()

$wrapper->field_example_multiple->set(NULL)

и даже $wrapper->field_example_multiple->set(array()),

, но вместо этого вы можете использовать следующее, если вы хотите очистить поле от всех его значений:

$wrapper->field_example_multiple->set(array(NULL));

Фактически, это работает независимо от того, установлено ли поле множественного значения «обязательным», и поэтому я рекомендую всегда использовать это, чтобы обеспечить надежный код.

(Конечно, если поле «требуется», то вам, возможно, не следует полностью его очищать, но ваш код может делать это в качестве предварительного шага к удалению всей сущности или чего-то подобного, поэтому есть времена когда это может быть просто законным.)

ответил Martin Q 4 PM00000050000000431 2015, 17:58:04
2

Похоже, что сложности, перечисленные в других комментариях, относятся только к обязательному полю. Если поле не требуется, это должно быть довольно простым:

$wrapper->field_foo = NULL;

Вы можете использовать оболочку для проверки свойств поля:

$properties = $wrapper->getPropertyInfo();
$field_required = !empty($properties['field_foo']['required']);

В зависимости от контекста вы также можете просто получить свойства одного поля, используя:

$wrapper->getPropertyInfo('field_foo');
ответил Giles B 17 +03002015-10-17T22:10:14+03:00312015bEurope/MoscowSat, 17 Oct 2015 22:10:14 +0300 2015, 22:10:14
1

Другим решением этой проблемы может быть EntityMetadataWrapper::clear

$entity_wrapper->field->clear()

ответил Mouneer 14 Jpm1000000pmThu, 14 Jan 2016 17:24:09 +030016 2016, 17:24:09

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132