web-dev-qa-db-fra.com

Comment effacer une valeur de champ avec entity_metadata_wrapper ()?

Supposons que j'ai une entité avec un champ field_foo Dessus et que je veuille effacer la valeur de ce champ.

Que dois-je transmettre à $wrapper->set()?

J'ai essayé NULL et array() et les deux produisent un message d'erreur.

20
joachim

Le problème est que vous devez définir une valeur vide compatible avec le type de données de votre champ. Si vous ne le faites pas, vous obtiendrez une exception levée. Passer NULL ou array() lorsqu'une chaîne est attendue générera donc une erreur.

Une autre chose à garder à l'esprit est que les données que vous transmettez dépendent également du fait que votre champ est une valeur unique, un champ à plusieurs valeurs ou un champ avec plusieurs propriétés.

Si votre champ est une valeur unique (et donc le wrapper pour le champ est une instance de EntityValueWrapper ), vous devez lui affecter une valeur vide compatible avec le type de données en question . Par exemple, les deux méthodes suivantes sont équivalentes:

$wrapper->title = '';
$wrapper->title->set('');

Cependant, les trois exemples suivants lèveront une exception, car les types de données ne sont pas compatibles avec le champ title:

$wrapper->title->set();
$wrapper->title->set(NULL);
$wrapper->title->set(array());

Si votre champ est un champ avec plusieurs propriétés (par exemple un champ de texte formaté, qui définit à la fois une propriété value et format) et donc une instance de EntityStructureWrapper , alors array() ou NULL sera la valeur vide correcte. Vous pouvez donc effectuer les opérations suivantes:

$wrapper->field_formatted_text = array();
$wrapper->field_formatted_text = NULL;

Mais dans ce cas, le passage d'une chaîne vide aurait déclenché une erreur. Notez que vous auriez pu choisir de rendre la propriété value vide à la place, auquel cas une chaîne est le type de données correct:

$wrapper->field_formatted_text->value = '';

Enfin, si votre champ est un champ à valeurs multiples (et donc votre wrapper est une instance de EntityListWrapper ) alors array ou NULL sont les valeurs vides correctes, et les trois lignes suivantes sont équivalentes:

$wrapper->field_example_multiple->set();
$wrapper->field_example_multiple = array();
$wrapper->field_example_multiple = NULL;

Remarque: L'appel de la méthode clear sur les wrappers n'est pas équivalent à définir le champ sur une valeur vide. Lorsque le champ est défini sur une valeur vide, il appelle ensuite EntityMetadataWrapper :: updateParent sur le wrapper parent du champ. Cela garantit entre autres que le setter callback Défini par hook_entity_property_info est appelé. Appeler clear ne fait pas cela.

24
Alice Heaton

Suite à d'autres réponses et commentaires, si le champ est multiple et requis, comme indiqué précédemment, vous ne pouvez pas utiliser

$wrapper->field_example_multiple->set()

$wrapper->field_example_multiple->set(NULL)

ni même $wrapper->field_example_multiple->set(array()),

mais à la place, vous pouvez utiliser ce qui suit si vous souhaitez effacer le champ de toutes ses valeurs:

$wrapper->field_example_multiple->set(array(NULL));

En fait, cela fonctionne que le champ à valeurs multiples soit défini sur "requis" ou non, et je vous recommande donc de toujours l'utiliser pour vous assurer que votre code est robuste.

(Bien sûr, si le champ est `` obligatoire '', vous ne devriez peut-être pas le supprimer complètement de toute façon, mais votre code peut le faire comme une étape préliminaire à la suppression de l'entité entière ou quelque chose de similaire, donc il peut y avoir des moments où il peut soyez juste légitime.)

3
Martin Q

Il semble que les complexités énumérées dans les autres commentaires ne concernent qu'un champ obligatoire. Si le champ n'est pas obligatoire, cela devrait être assez simple:

$wrapper->field_foo = NULL;

Vous pouvez utiliser l'encapsuleur pour vérifier les propriétés du champ:

$properties = $wrapper->getPropertyInfo();
$field_required = !empty($properties['field_foo']['required']);

Selon le contexte, vous pouvez également simplement obtenir les propriétés d'un seul champ en utilisant:

$wrapper->getPropertyInfo('field_foo');
2
Giles B

Une autre solution à ce problème pourrait être EntityMetadataWrapper::clear

$entity_wrapper->field->clear()

1
Mouneer