Перевірка на наявність поля на entry_metadata_wrapper


22

Я повторюю колекцію полів і загортаю елементи колекції поля за допомогою_фабрикату_файла. Я хотів би перевірити наявність поля, перш ніж викликати його 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()функцію відповідно до принципу перевантаження .


Так, це завжди, як я це робив, менш прив’язаний до внутрішніх справ і легше читати ІМО. Оголошено!
Котцер

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десь там завдяки методу ланцюга. Але подивіться на метод __isset () для EntityStructureWrapper .

Перевірити як:

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

а потім за допомогою IFблоку виконайте свою логіку ...

Редагувати:

$has_headshot тепер дійсний бажаний чек.


Я не впевнений, що ви маєте на увазі під "виглядає так, що у вас десь є посилання на сутність", якщо ви могли б пояснити це ще трохи, я би оцінив це. __issetвідмінно працює над польовою колекцією, хоча мені потрібно додати повну назву поля: field_contrib_headshotзамістьcontrib_headshot
Нік Томлін

поля - значення; рядок, число, що завгодно. field_contributorпосилається на інше поле field_contrib_headshot... ви там якось вкладаєтесь. Я припускаю, що ви використовуєте object_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 відсутній. -> 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 () не можна використовувати в результаті виклику функції. Оскільки Boolean повертається із наступним твердженням, я зміг переконатися, що обернутий елемент насправді має значення.

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

0

Люди часто трапляються не так. Під час виклику isset на обгортці метаданих сутності, ви перевіряєте, чи підтримує сукупність об'єктів цю властивість. Це не має нічого спільного з фактичним значенням поля.

Насправді не існує незалежного методу перевірки встановленого значення. Вам просто потрібно оцінити значення () або, бажано, необроблене (). (Ви також можете зателефонувати 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;
  }
}

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

це буде працювати!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.