Salve um novo valor com entity_metadata_wrapper em um campo de entidade que é uma matriz

9

Preciso salvar um novo valor em um campo em uma entidade e queria saber se era possível usar entity_metadata_wrapper ou é possível apenas definir um valor existente?

Andrew Welch
fonte
foi assim que fui definido o valor $ wrapper-> vimn_related_subjects-> set (array ($ key)); mas se eu quisesse adicionar um valor ao final da matriz? isso é possível?
Andrew Welch
Você já tentou $wrapper->vimn_related_subjects[] = $value;?
Clive

Respostas:

31

Ao lidar com campos com vários valores, o objeto de wrapper de metadados da entidade associado é uma instância de EntityListWrapper (pode ser uma boa ideia procurar na API para examinar os métodos disponíveis. Observe também que essa classe implementa a interface ArrayAccess )

Portanto, a maneira mais simples de adicionar novos valores a um EntityListWrapper é usando o operador "[]":

$wrapper->field_example[] = $new_value;

Isso cria uma nova entrada e atribui o valor a ela. Com esses métodos, o delta (o deslocamento na lista de valores) é criado automaticamente. Você também pode definir o deslocamento, se desejar. Qualquer um dos três métodos a seguir é equivalente:

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

Nos três casos, isso substituirá os valores se o delta já existir e criará uma nova entrada, se não existir.

Você também pode definir diretamente uma matriz de valor no próprio campo. Ambos os métodos são equivalentes:

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

No entanto, isso exige que você conheça a estrutura interna do campo ao qual está atribuindo, pois não está usando o wrapper de metadados do campo.

Finalmente, você pode esvaziar um campo com vários valores configurando-o para um valor vazio. Todos os três métodos são equivalentes:

$wrapper->field_example->set();
$wrapper->field_example = array();
$wrapper->field_example = NULL;
Alice Heaton
fonte
"EntityMetadataWrapperException: propriedade de dados desconhecidos Array. In EntityStructureWrapper-> getPropertyInfo ()" Estou tentando sua segunda abordagem, embora esteja direcionando um idioma específico. ou seja, $ wrapper-> idioma ($ lang) -> {$ field} -> set ($ new_array);
AlxVallejo 27/01
$w->field_allowed_regions->set(array(null));é a única opção de compensação que funcionou no meu campo de referência de taxonomia com vários valores.
Incredible
3

eu achei aquilo

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

foi um fracasso fatal. Mas

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

foi permitido.

dman
fonte