Сохраните новое значение с entity_metadata_wrapper в поле объекта, которое является массивом

9

Мне нужно сохранить новое значение в поле объекта, и мне было интересно, можно ли использовать entity_metadata_wrapper или можно только установить существующее значение?

Эндрю Уэлч
источник
вот как мне было установлено значение $ wrapper-> vimn_related_subjects-> set (array ($ key)); но если бы я хотел добавить значение в конец массива? это возможно?
Эндрю Уэлч
Ты пробовал $wrapper->vimn_related_subjects[] = $value;?
Клайв

Ответы:

31

При работе с полями с несколькими значениями связанный объект-оболочка метаданных сущности является экземпляром EntityListWrapper (может быть хорошей идеей просмотреть API, чтобы посмотреть доступные методы. Также обратите внимание, что этот класс реализует интерфейс ArrayAccess )

Поэтому самый простой способ добавить новые значения в EntityListWrapper - использовать оператор «[]»:

$wrapper->field_example[] = $new_value;

Это создает новую запись и присваивает ей значение. С помощью этих методов дельта (смещение в списке значений) создается автоматически. Вы также можете установить смещение самостоятельно, если хотите. Любой из трех следующих методов эквивалентен:

$wrapper->field_example[$delta] = $new_value;
$wrapper->field_example->offsetSet($delta, $new_value);
$wrapper->field_example->get($delta)->set($new_value);

Во всех трех случаях это перезапишет значения, если дельта уже существует, и создаст новую запись, если нет.

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

$value = array
  0 => array('property_example' => 'hello'),
  1 => array('property_example' => 'world')
);
$wrapper->field_example = $value;
$wrapper->field_example->set($value);

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

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

$wrapper->field_example->set();
$wrapper->field_example = array();
$wrapper->field_example = NULL;
Алиса Хитон
источник
"EntityMetadataWrapperException: Неизвестное свойство данных Массив. В EntityStructureWrapper-> getPropertyInfo ()" Я пробую ваш второй подход, хотя я нацеливаюсь на конкретный язык. т. е. $ wrapper-> language ($ lang) -> {$ field} -> set ($ new_array);
AlxVallejo
$w->field_allowed_regions->set(array(null));является единственным вариантом очистки, который работал для моего справочного поля многозначной таксономии.
Невероятно
3

я нашел это

$wrapper->field_example[]->set($new_value);

был фатальный провал. Но

$wrapper->field_example[NULL]->set($new_value);

был разрешен.

ГАУ
источник