Guarde un nuevo valor con entity_metadata_wrapper en un campo de entidad que es una matriz

9

Necesito guardar un nuevo valor en un campo en una entidad y me preguntaba si era posible usar entity_metadata_wrapper o ¿solo es posible establecer un valor existente?

Andrew Welch
fuente
así es como se configuró el valor $ wrapper-> vimn_related_subjects-> set (array ($ key)); pero si quisiera agregar un valor al final de la matriz? ¿es eso posible?
Andrew Welch
¿Lo has intentado $wrapper->vimn_related_subjects[] = $value;?
Clive

Respuestas:

31

Cuando se trata de campos de valores múltiples, el objeto contenedor de metadatos de la entidad asociada es una instancia de EntityListWrapper (puede ser una buena idea examinar la API para ver los métodos disponibles. También tenga en cuenta que esta clase implementa la interfaz ArrayAccess )

Entonces, la forma más sencilla de agregar nuevos valores a un EntityListWrapper es mediante el uso del operador "[]":

$wrapper->field_example[] = $new_value;

Esto crea una nueva entrada y le asigna el valor. Con estos métodos, el delta (el desplazamiento dentro de la lista de valores) se crea automáticamente. También puede establecer el desplazamiento usted mismo si lo desea. Cualquiera de los tres métodos siguientes son equivalentes:

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

En los tres casos, esto sobrescribirá los valores si el delta ya existe, y creará una nueva entrada si no.

También puede establecer directamente una matriz de valores en el campo mismo. Ambos métodos son equivalentes:

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

Sin embargo, esto requiere que conozca la estructura interna del campo al que está asignando, ya que no está utilizando el contenedor de metadatos del campo.

Finalmente, puede vaciar un campo de valores múltiples configurándolo en un valor vacío. Los tres métodos son equivalentes:

$wrapper->field_example->set();
$wrapper->field_example = array();
$wrapper->field_example = NULL;
Alice Heaton
fuente
"EntityMetadataWrapperException: propiedad de datos desconocida Array. En EntityStructureWrapper-> getPropertyInfo ()" Estoy intentando su segundo enfoque, aunque estoy apuntando a un idioma específico. es decir, $ wrapper-> language ($ lang) -> {$ field} -> set ($ new_array);
AlxVallejo
$w->field_allowed_regions->set(array(null));es la única opción de compensación que funcionó para mi campo de referencia de taxonomía de valores múltiples.
Increíble el
3

encontre eso

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

Fue un fracaso fatal. Pero

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

estaba permitido.

dman
fuente