entity_metadata_wrapper()でフィールド値をクリアするにはどうすればよいですか?


20

フィールドを持つエンティティがあり、field_fooそのフィールドの値をクリアするとします。

何に渡すべき$wrapper->set()ですか?

試しましたがNULLarray()両方ともエラーメッセージを生成します。


1
EntityStructureWrapper::clear()またはEntityValueWrapper::clear()メソッドを探していますか?
クライブ

::clear直接呼び出すことは、フィールドを空の値に設定することと同じではありません。空の値でupdateParent呼び出す場合setとは異なります。とりわけ、updateParentことを保証setter callback不動産情報(参照で定義されているがdrupalcontrib.org/api/drupal/...)と呼ばれています。
アリスヒートン

回答:


24

問題は、フィールドのデータ型と互換性のある空の値を設定する必要があることです。そうしないと、例外が発生します。渡すNULLまたはarray()文字列が予想される場合には、そのためにエラーが発生します。

留意すべきもう1つのことは、渡すデータは、フィールドが単一値、複数値フィールド、または複数のプロパティを持つフィールドであるかどうかにも依存するということです。

フィールドが単一の値である(したがって、フィールドのラッパーがEntityValueWrapperのインスタンスである)場合、問題のデータ型と互換性のある空の値を割り当てる必要があります。たとえば、次の2つのメソッドは同等です。

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

ただし、次の3つの例では、データ型がtitleフィールドと互換性がないため、例外が発生します。

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

あなたのフィールドは、複数(例えば、Aの両方に定義フォーマットのテキストフィールド、プロパティを持つフィールドの場合valueformat従って性)のインスタンスEntityStructureWrapper、次いでarray()又はNULL正しい空の値であろう。したがって、次のことができます。

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

ただし、その場合、空の文字列を渡すとエラーが発生します。value代わりにプロパティを空にすることもできます。その場合、文字列は正しいデータ型です。

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

最後に、フィールドが複数値フィールドである(したがって、ラッパーがEntityListWrapperのインスタンスである)場合、arrayまたはNULLは正しい空の値であり、次の3行は同等です。

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

注:clearラッパーでメソッドを呼び出すことは、フィールドを空の値に設定することと同等ではありません。フィールドが空の値に設定されると、フィールドの親ラッパーでEntityMetadataWrapper :: updateParentを呼び出します。これにより、中でもhook_entity_property_infosetter callbackによって定義されたものが呼び出されるようになります。呼び出しclearはそれを行いません。


1
フィールドが複数必須である場合、フィールドは空にできないため、as array()またはasの設定NULLは失敗する可能性があることに注意してください。これは$node、空の必須フィールドをプログラムで保存できる通常のフィールド割り当てとは異なります(DrupalのUIを介しては保存されません)。この場合の回避策はarray(N)、Nが存在しないがまだ参照されているエンティティのIDである場合です。そのIDで保存されるため、データはほぼ間違いなくリレーショナルの意味で「壊れている」ことに注意してください。ただし、適切なことをすべて実行している場合(たとえば、Display SuiteまたはPanelsを使用している場合)、テーマレイヤーには影響しません。
JP

$w->field_allowed_regions->set(array(null));多値分類基準フィールドで機能した唯一のオプションです。
信じられないほど

私の場合、単一の値を持つエンティティ参照フィールドがあります。以下は私のために働いた:$ wrapper-> field_entity_reference-> set(NULL);
マルコスBuarque

3

他の回答とコメントに加えて、フィールドが複数必須の場合、前述のように使用できません

$wrapper->field_example_multiple->set()

$wrapper->field_example_multiple->set(NULL)

また$wrapper->field_example_multiple->set(array())

ただし、フィールドのすべての値をクリアする場合は、代わりに次を使用できます。

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

実際、これはマルチプルバリューフィールドが「必須」に設定されているかどうかに関係なく機能するため、コードの堅牢性を確保するために、常にこれを使用することをお勧めします。

(もちろん、フィールドが「必須」である場合は、とにかく完全にクリアするべきではありませんが、コードはエンティティ全体または類似のものを削除するための予備ステップとしてこれを行っている可能性があるため、正当であるだけです。)


`$ wrapper-> field_example_multiple-> set(array(NULL))`を使用すると、データ配列にNULL要素が含まれることに注意してください。このメソッドは値をクリアせず、values配列を単一のNULL値に設定します。
アレックスSkrypnyk

いい視点ね。これで、必要な値をクリアしないという発言に戻ると思います。おそらく意図的に不可能にされているでしょう。
マーティンQ

実際のところ、必須フィールドには少なくとも1つの非ヌル値が必要です。必須の複数値フィールドをリセットする場合は、新しい値で上書きします。すなわち:$product_display->field_product = array($product_id);
Interdruper

2

他のコメントにリストされている複雑さは、必須フィールドにのみ関連しているようです。フィールドが不要な場合、これは非常に簡単です。

$wrapper->field_foo = NULL;

ラッパーを使用して、フィールドのプロパティを確認できます。

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

コンテキストに応じて、次を使用して1つのフィールドのプロパティを取得することもできます。

$wrapper->getPropertyInfo('field_foo');

1

この問題の別の解決策は EntityMetadataWrapper::clear

$entity_wrapper->field->clear()


EntityMetadataWrapper :: clearメソッドは「protected」として宣言されているため、コードから呼び出すことはできません。オブジェクトの外部から直接アクセスできるのは「public」メソッドのみです。
Interdruper
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.