Estoy iterando a través de una colección de campos y envolviendo los elementos de la colección de campos con una entidad_metadata_wrapper. Me gustaría verificar la existencia de un campo antes de llamar a su value
método (que da como resultado un error en los campos que no tienen un valor), pero no puedo encontrar una manera de hacerlo.
$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();
Mi solución actual es usar field_get_items
para ver si el campo está vacío, pero me encantaría poder hacerlo a través del contenedor de metadatos si es posible.
Cada vez que hay una referencia de entidad o colección de campos, isset () nunca me ha funcionado. Lo que parece funcionar cada vez que tenemos una referencia de entidad está haciendo:
fuente
Parece que tienes un
entity_reference
lugar allí debido al método de encadenamiento. Pero, mire el método __isset () para EntityStructureWrapper .Comprobar como:
y luego usa un
IF
bloque para hacer tu lógica ...EDITAR:
$has_headshot
ahora es válido el cheque deseado.fuente
__isset
funciona muy bien en la colección de campo, aunque necesito agregar el nombre completo del campo: enfield_contrib_headshot
lugar decontrib_headshot
field_contributor
está haciendo referencia a otro campofield_contrib_headshot
... tienes anidando allí de alguna manera. Supongo que estás usando entity_reference o algo más como field_group para anidar estas cosas ... eso es todo lo que quise decir.$item_wrapper->field_contributor->__isset('field_contrib_headshot')
$has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Campos de referencia de entidad y colecciones de campos.
Copiado y pegado directamente de http://dropbucket.org/node/1201, pero parece ser un mejor ejemplo que cualquier otra respuesta hasta ahora ...
fuente
Para EntityMetadataWrapper:
Si tiene bloques de código en ejecución que no deberían o si ha encontrado errores de PHP, mire algunos de los ejemplos a continuación. Este ejemplo usa la propiedad nid.
PUEDE TODO ERROR
O
O
Puede encontrar que el uso de isset like así podría evaluarse como verdadero incluso si el nid no está presente. El -> getIdentifier (), o -> value (), o -> raw () puede lanzar excepciones.
PROBABLEMENTE SIEMPRE VERDADERO
UTILICE ESTE EN LUGAR
fuente
Descubrí que isset () no se puede usar en el resultado de una llamada de función. Como se devuelve un booleano con la siguiente declaración, pude verificar que el elemento envuelto, de hecho, tenía un valor.
fuente
La gente a menudo se equivoca. Cuando llama a isset en un contenedor de metadatos de entidad, está verificando si el paquete de entidades admite esa propiedad. No tiene nada que ver con el valor real del campo.
Realmente no hay un método independiente para verificar si se establece un valor. Solo tiene que evaluar value () o, preferiblemente, raw (). (También puede llamar a count () si es un campo de valores múltiples, pero raw () devolverá una matriz vacía, por lo que no es realmente necesario).
Para reiterar, raw () es el valor que debe usar para verificar si existe un campo. Es confiable y computacionalmente barato.
fuente
Aquí está mi función de ayuda personal para obtener un valor de una cadena de referencias de entidad potencialmente no establecida:
$ wentity es la entidad envuelta, $ field_chain es una matriz de field_names así:
también puedes hacer:
¡Funcionará!
fuente