Estou percorrendo uma coleção de campos e agrupando os itens da coleção de campos com um entity_metadata_wrapper. Gostaria de verificar a existência de campo antes de chamar seu value
método (o que resulta em um erro nos campos que não têm valor), mas não consigo encontrar uma maneira de fazê-lo.
$field_collection_item = field_collection_item_load($id);
$item_wrapper = entity_metadata_wrapper('field_collection_item', $field_collection_item);
// this results in an error if the field_contrib_headshot field is empty
$headshot = $item_wrapper->field_contributor->field_contrib_headshot->value();
Minha solução atual é usar field_get_items
para ver se o campo está vazio, mas eu adoraria poder fazer isso através do wrapper de metadados, se possível.
Sempre que houver uma referência de entidade ou coleção de campos, isset () nunca funcionou para mim. O que parece funcionar sempre que uma referência de entidade está fazendo:
fonte
Parece que você tem um
entity_reference
lugar lá devido ao encadeamento do método. Mas, observe o método __isset () para EntityStructureWrapper .Verifique como:
e depois use um
IF
bloco para fazer sua lógica ...EDITAR:
$has_headshot
agora é a verificação válida desejada.fonte
__isset
funciona muito bem na coleção de campos, embora eu precise adicionar o nome completo do campo: emfield_contrib_headshot
vez decontrib_headshot
field_contributor
está referenciando outro campofield_contrib_headshot
... você está aninhando lá de alguma forma. Estou assumindo que você está usando entity_reference ou algo mais como field_group para aninhar essas coisas ... foi tudo o que eu quis dizer.$item_wrapper->field_contributor->__isset('field_contrib_headshot')
$has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Campos de referência da entidade e coleções de campos
Copiado e colado diretamente de http://dropbucket.org/node/1201, mas parece ser um exemplo melhor do que qualquer outra resposta até agora ...
fonte
Para EntityMetadataWrapper:
Se você tem blocos de código em execução que não deveriam ou se encontrou erros de PHP, veja alguns dos exemplos abaixo. Este exemplo usa a propriedade nid.
PODE TUDO ERRO
OU
OU
Você pode achar que usar isset como esse pode ser avaliado como verdadeiro mesmo se o nid não estiver presente. O -> getIdentifier () ou -> value () ou -> raw () podem gerar exceções.
SEMPRE VERDADEIRO VERDADEIRO
USE ESTE INSTRUMENTO
fonte
Descobri que isset () não pode ser usado no resultado de uma chamada de função. Como um booleano é retornado com a seguinte instrução, eu pude verificar se o elemento agrupado, de fato, tinha um valor.
fonte
As pessoas geralmente entendem errado. Quando você chama isset em um wrapper de metadados da entidade, está verificando se o pacote configurável da entidade suporta essa propriedade. Não tem nada a ver com o valor real do campo.
Não existe realmente um método independente para verificar se um valor está definido. Você apenas precisa avaliar value () ou, preferencialmente, raw (). (Você também pode chamar count () se for um campo com vários valores, mas raw () retornará uma matriz vazia, para que não seja realmente necessário.)
Para reiterar, raw () é o valor que você deve usar para verificar se existe um campo. É confiável e computacionalmente barato.
fonte
Aqui está minha função de ajudante pessoal para obter um valor de uma cadeia potencialmente não definida de referências de entidades:
$ goneity é a entidade agrupada, $ field_chain é uma matriz de field_names da seguinte forma:
você também pode fazer:
vai dar certo!
fonte