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 NULLou array()quand une chaîne est attendue provoquera 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 titlechamp:
$wrapper->title->set();
$wrapper->title->set(NULL);
$wrapper->title->set(array());
Si votre champ est un champ avec des propriétés multiples (par exemple un champ de texte mis en forme, qui définit à la fois une valueet formatpropriété) et donc une instance de EntityStructureWrapper , alors array()ou NULLsera 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 valuepropriété 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 à plusieurs valeurs (et donc votre wrapper est une instance de EntityListWrapper ), alors arrayou NULLsont 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 clearméthode 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 callbackdéfini par hook_entity_property_info est appelé. Appeler clearne fait pas ça.
EntityStructureWrapper::clear()ouEntityValueWrapper::clear()?