Проверка наличия для поля объекта entity_metadata_wrapper

Я выполняю итерацию через коллекцию полей и обертываю элементы коллекции полей с помощью 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, чтобы узнать, пустое ли поле, но мне бы хотелось, чтобы это можно было сделать через оболочку метаданных, если это возможно.

20 голосов | спросил Nick Tomlin 19 22013vEurope/Moscow11bEurope/MoscowTue, 19 Nov 2013 22:49:13 +0400 2013, 22:49:13

8 ответов


24

Просто вызовите функцию PHP isset() :

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

EntityStructureWrapper реализует функцию __isset() в соответствии с принципом Перегрузка .

ответил piouPiouM 21 Jpm1000000pmTue, 21 Jan 2014 19:30:37 +040014 2014, 19:30:37
9

В любой момент, когда есть ссылка на объект или сборник полей, isset () имеет never для меня. Кажется, что работает в любое время, когда мы имеем ссылку на сущность:

if($wrapped_entity->entity_reference_field->getIdentifier()) {
  // This code only fires if there is an entity reference or field collection set.
}
ответил Atomox 9 J000000Wednesday14 2014, 20:18:43
4

Похоже, что у вас есть entity_reference где-то там из-за цепочки методов. Но посмотрите на __isset () для EntityStructureWrapper .

Отметьте:

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

, а затем используйте блок IF, чтобы выполнить свою логику ...

EDIT:

$has_headshot теперь корректно проверяется.

ответил tenken 19 22013vEurope/Moscow11bEurope/MoscowTue, 19 Nov 2013 23:03:29 +0400 2013, 23:03:29
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 , но похоже лучший пример, чем любой другой ответ до сих пор ...

ответил Felix Eve 20 AM00000020000004031 2015, 02:54:40
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, например, может оцениваться как true, даже если nid отсутствует. Значение -> getIdentifier () или -> value () или -> raw () может вызывать исключения.

LIKELY ALWAYS TRUE

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;
}
ответил daveferrara1 13 Jam1000000amFri, 13 Jan 2017 00:05:20 +030017 2017, 00:05:20
0

Я обнаружил, что isset () не может использоваться в результате вызова функции. Поскольку логическое значение возвращается с помощью следующего оператора, я смог убедиться, что обернутый элемент имеет значение.

if ( $wrapper->field_media_alternate[0]->value() ) {
  //...valid logic...
} else {
  //...not valid logic...
}
ответил knice 5 Jpm1000000pmTue, 05 Jan 2016 17:52:12 +030016 2016, 17:52:12
0

Люди часто ошибаются. Когда вы вызываете isset в обертке метаданных объекта, вы проверяете, поддерживает ли этот пакет это свойство. Он не имеет ничего общего с фактическим значением поля.

На самом деле нет независимого метода проверки того, установлено ли значение. Вам просто нужно оценить значение () или, желательно, 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 () - это значение, которое вы должны использовать, чтобы проверить, существует ли поле. Это надежный и недорогой калькулятор.

ответил Scott Armstrong 4 Jam1000000amWed, 04 Jan 2017 02:39:40 +030017 2017, 02:39:40
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;
  }
}

$ goity - завернутый объект, $ field_chain - это массив таких имен полей:

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

он будет работать!

ответил Thony 8 PM00000060000003331 2018, 18:40:33

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132