entity_metadata_wrapperのフィールドの存在を確認する


22

フィールドコレクションを繰り返し処理し、フィールドコレクションアイテムをentity_metadata_wrapperでラップしています。valueメソッドを呼び出す前にフィールドの存在を確認したいのですが(値のないフィールドでエラーが発生します)、そうする方法を見つけることができません。

$field_collection_item = field_collection_item_load($id);
$item_wrapper = entity_metadata_wrapper('field_collection_item', $field_collection_item);

// this results in an error if the field_contrib_headshot field is empty
$headshot = $item_wrapper->field_contributor->field_contrib_headshot->value();

私の現在の回避策はfield_get_items、フィールドが空であるかどうかを確認することですが、可能であればメタデータラッパーを介してこれを実行できるようにしたいと思います。

回答:


26

PHP関数を呼び出すだけですisset()

$headshot = array();
if (isset($item_wrapper->field_contributor->field_contrib_headshot)) {
  $headshot = $item_wrapper->field_contributor->field_contrib_headshot->value();
}

EntityStructureWrapper __isset()は、オーバーロードの原則に従って関数を実装します。


はい、これは常に私がやった方法であり、内部に縛られることは少なく、読みやすいIMOです。賛成!
コッツァー

9

実体参照またはフィールドのコレクションがあるときはいつでも、ISSETは()していない私のために働いていません。エンティティ参照を実行しているときはいつでも機能しているように見えます:

if($wrapped_entity->entity_reference_field->getIdentifier()) {
  // This code only fires if there is an entity reference or field collection set.
}

この回答と、次のポストは私のために働いた:dropbucket.org/node/1201を
tyler.frankenstein

4

entity_referenceメソッドの連鎖により、そこにどこかにあるように見えます。しかし、EntityStructureWrapperの__isset()メソッドを見てください

次のように確認してください:

$has_headshot = $item_wrapper->field_contributor->__isset('field_contrib_headshot');

そして、IFブロックを使用してロジックを実行します...

編集:

$has_headshot 有効なチェックが必要です。


「どこかにエンティティ参照があるように見えます」とはどういう意味かわかりませんが、もう少し説明していただければ幸いです。__isset完全なフィールド名を追加する必要がありますが、フィールドコレクションではうまく機能します。field_contrib_headshot代わりにcontrib_headshot
ニックトムリン

フィールドは値です。文字列、数値、何でも。field_contributor別のフィールドを参照していますfield_contrib_headshot...そこに何らかの方法でネストしています。これらをネストするために、entity_referenceまたはfield_groupのような何かを使用していると仮定しています...それがすべてです。
-tenken

あなたのために働いたコードの__isset()部分は何でしたか?
tenken

それはだった:$item_wrapper->field_contributor->__isset('field_contrib_headshot')
ニック・トムリン

:それは、なぜ直接ではなく)(__issetを呼び出すように私には奇妙な感じ $has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
Cottser

1
$wrapper = entity_metadata_wrapper('node', 123);
if($wrapper->__isset('field_middle_name')) {
    // Do something awesome with the middle name.
} else {
    // Don't do anything awesome, they don't have a middle name.
}

エンティティ参照フィールドとフィールドコレクション

// also check if there is an identifier, __isset alone is not enough!
if ($wrapper->__isset('field_project_number') && $wrapper->field_project_number->getIdentifier()) {
    $number =  $wrapper->field_project_number->field_project_number_complete->value();
    return $number;
}

http://dropbucket.org/node/1201から直接コピーして貼り付けましたが、これまでの他の回答よりも良い例のようです...


1

EntityMetadataWrapperの場合:

実行すべきでないコードのブロックがある場合、またはPHPエラーに遭遇した場合は、以下の例を参照してください。この例では、プロパティnidを使用します。

すべてのエラー

if ($wrapper->__isset('nid')) {
  $var = $wrapper->nid->value();
}
else {
  // Do something it's FALSE;
}

または

if ($wrapper->__isset('nid')) {
  $var = $wrapper->nid->getIdentifier();
}
else {
  // Do something it's FALSE;
}

または

if ($wrapper->nid->value()) {
  // Do something it's TRUE.
}
else {
  // Do something it's FALSE;
}

このようにissetを使用すると、nidが存在しない場合でもtrueと評価される場合があります。-> getIdentifier()、または-> value()、または-> raw()は例外をスローする場合があります。

常に真実

if (isset($wrapper->nid)) {
  // Do something it must be TRUE....Ah Hem wait.. this runs every time.
}

この代わりに使用する

try {
  $var = $wrapper->nid->raw();
} 
catch (EntityMetadataWrapperException $e) {
  $var = FALSE;
}

0

関数呼び出しの結果にisset()を使用できないことがわかりました。次の文でブール値が返されるため、実際には、ラップされた要素に値があることを確認できました。

if ( $wrapper->field_media_alternate[0]->value() ) {
  //...valid logic...
} else {
  //...not valid logic...
}

0

人々はしばしばこれを間違っています。エンティティメタデータラッパーでissetを呼び出すと、エンティティバンドルがそのプロパティをサポートしているかどうかを確認しています。フィールドの実際の値とは何の関係もありません。

実際には、値が設定されているかどうかを確認するための独立した方法はありません。value()または、できればraw()を評価する必要があります。(複数値フィールドの場合はcount()を呼び出すこともできますが、raw()は空の配列を返すため、実際には必要ありません。)

$w = entity_metadata_wrapper('node', $nid);
//Start by checking whether the node bundle supports field_entityref_myfield.
if (isset($w->field_entityref_myfield)) {
  //If we called value(), then that would cause the referenced entity
  //to be loaded, whereas raw() just gives us the entity_id if the value
  //is set, and Null if it isn't.
  if ($w->field_entityref_myfield->raw()) {
    //Do some things based on the entity-reference being set.
  } else {
    //Do some other things based on the entity-reference NOT being set.
  }
}

繰り返しますが、raw()はフィールドが存在するかどうかを確認するために使用する値です。信頼性が高く、計算的に安価です。


0

これは、潜在的に設定されていないエンティティ参照のチェーンから値を取得するための私のパーソナルヘルパー関数です。

function _get_wrapped_value_ifset($wentity, $field_chain){
  $root = $wentity;
  try{
    foreach ( $field_chain as $field_name ) {
      $root = $root->{$field_name};
    }
    return $root->value();
  }
  catch (EntityMetadataWrapperException $e){
    return null;
  }
}

$ wentityはラップされたエンティティであり、$ field_chainは次のようなfield_namesの配列です。

[
  'field_reference_from_the_wentity',
  'field_wanted_field_from_the_referenced_entity'
] 

あなたもすることができます:

[
  'field_reference_from_the_wentity', 
  'field_reference_from_the_referenced_entity',
  ... 
  'field_wanted_field_from_the_N_referenced_entity'
]

うまくいく!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.