¿Cuál es la forma correcta de eliminar mediante programación una entrada de campo específica para un campo de múltiples entradas de una entidad específica? (son campos específicos y entidades específicas, no tipos de campos o instancias y tipos de entidades)
Aquí hay algunas posibilidades que he analizado que no funcionan:
- Cargando la entidad con
entity_load()
, estableciendo la entrada de campo en = nulo o = matriz (), luego guardando confield_attach_update()
. Es lo más cercano que he encontrado, pero deja una entrada de campo nulo zombie en la base de datos que se muestra como una fila en blanco en los formularios hasta que el formulario se guarda yhook_field_is_empty()
puede iniciarse (hook_field_is_empty()
está configurado de manera que = nulo o = matriz () marcará como vacio) - Cargando la entidad con
entity_load()
, desarmando la entrada de campo por clave, luego guardando confield_attach_update()
. Esto parece no hacer nada, parece que Drupal interpreta que la entrada no está allí como una señal para no modificarla. (curiosamente, a veces también obtengo tiempos de espera de tiempo de consulta máximos al intentar este enfoque) field_attach_delete()
- esto es demasiado contundente: mata todos los campos de la entidadfield_purge_data()
- mejor, pero aún demasiado contundente: elimina todas las entradas del campo, no entradas específicas
Entonces, para aclarar, tengo un código que encuentra (y carga) una entidad que tiene un campo que tiene múltiples entradas, y encuentra una entrada específica en ese campo que debe eliminarse. Quiero eliminar esa entrada por completo, sin tocar ninguna otra entrada o cualquier otro campo en la entidad.
Necesitaba hacer esto como parte de una limpieza de migración de Drupal8.
Después de experimentar un poco, descubrí que iterar y luego usar unset () en el delta podría matarlo. Mi ejemplo fue eliminar una etiqueta (por lo tanto, busco 'target_id', no 'value' como lo haría a menudo para otros campos.
Y luego, si el éxito, entonces
$object->save();
fuente
Para Drupal 8, para eliminar un campo de una entidad:
Esto llamará al método mágico __unset () de ContentEntityBase:
No olvide que, para persistir en sus cambios, debe llamar
Después de que hayas hecho todos tus cambios.
fuente
Esta es la mejor manera:
fuente
el método preferido actual emplearía la entidad_metadata_wrapper
este es el mejor tutorial sobre EMW que he visto http://deeson-online.co.uk/labs/programatic-access-field-data-using-entitymetadatawrapper-drupal
fuente