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입니다. 공감!
Cottser

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')
Nick Tomlin

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

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;
}

nid가없는 경우에도 isset을 사용하면 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_name의 배열입니다.

[
  '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.