使用entity_metadata_wrapper将新值保存到作为数组的实体字段中


9

我需要将新值保存到实体上的字段,我想知道是否可以使用entity_metadata_wrapper还是只能设置现有值?


这就是我设置值$ wrapper-> vimn_related_subjects-> set(array($ key))的方式;但是如果我想在数组的末尾添加一个值?那可能吗?
安德鲁·韦尔奇

你试过了$wrapper->vimn_related_subjects[] = $value;吗?
克莱夫(Clive)

Answers:


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()中的未知数据属性Array。”尽管我的目标是特定语言,但我正在尝试第二种方法。即$ 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);

曾经被允许。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.