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()
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 title
champ:
$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 value
et format
propriété) 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 value
proprié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 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 clear
mé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 callback
défini par hook_entity_property_info est appelé. Appeler clear
ne fait pas ça.
EntityStructureWrapper::clear()
ouEntityValueWrapper::clear()
?