Bir entity_metadata_wrapper üzerindeki bir alanın varlığının kontrol edilmesi


22

Bir alan koleksiyonunda yineleniyorum ve alan koleksiyonu öğelerini bir entity_metadata_wrapper ile kaydırıyorum. Metodunu çağırmadan önce alanın varlığını kontrol etmek istiyorum value(ki bu değere sahip olmayan alanlarda hataya neden olur), ancak bunu yapmanın bir yolunu bulamıyorum.

$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();

Mevcut geçici çözümüm, field_get_itemsalanın boş olup olmadığını görmek için kullanmak , ancak mümkünse meta veri paketleyiciden bunu yapabilmeyi çok isterim.

Yanıtlar:


26

PHP işlevini çağırmanız yeterlidir isset():

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

EntityStructureWrapper, __isset()işlevi Aşırı Yüklenme ilkesine göre uygular .


Evet, her zaman böyle yaptım, içlerine daha az bağlı ve IMO'yu okumak daha kolay. Upvoted!
Cottser,

9

Bir varlık referansı veya saha koleksiyonu olduğunda, isset () benim için hiç çalışmadı. Bir varlık referansımız olduğu zaman ne iş yapıyor gibi görünüyor:

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

Bu cevap ve aşağıdaki yazı benim için çalıştı: dropbucket.org/node/1201
tyler.frankenstein 16:15

4

entity_referenceMetod zincirlemesi nedeniyle içeride bir yer var gibi gözüküyor . Ancak, EntityStructureWrapper için __isset () yöntemine bakın .

Gibi kontrol edin:

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

ve sonra IFmantığınızı yapmak için bir blok kullanın ...

DÜZENLE:

$has_headshot şimdi istenen onay geçerli.


"Bir yerde varlık referansınız varmış gibi gözüküyor" derken neyi kastettiğinizden emin değilim, biraz daha fazla takdir edersem açıklarsanız. __issetalan koleksiyonunda harika çalışıyor, ancak alan adının tamamını eklemem gerekmeme rağmen: field_contrib_headshotyerinecontrib_headshot
Nick Tomlin

alanlar değerdir; bir dize, bir sayı, her neyse. field_contributorbaşka bir alana atıfta bulunuyor field_contrib_headshot... bir şekilde orada yuvalanmış durumda. Bütün bunları kastetmek için entity_reference veya field_group gibi başka bir şey kullandığınızı farz ediyorum.
tenken

sizin için çalışan __isset () kod parçası neydi?
tenken

$item_wrapper->field_contributor->__isset('field_contrib_headshot')
Öyleydi

Doğrudan __isset () $has_headshot = isset($item_wrapper->field_contributor->field_contrib_headshot);
yöntemini

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

Varlık referans alanları ve saha koleksiyonları

// 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 adresinden doğrudan kopyalanıp yapıştırılan ancak şimdiye kadarki yanıtlardan daha iyi bir örnek gibi görünüyor ...


1

EntityMetadataWrapper için:

Olmaması gereken kod bloklarını çalıştırıyorsanız veya PHP hatalarıyla karşılaştıysanız, aşağıdaki örneklerden bazılarına bakın. Bu örnek nid özelliğini kullanır.

Tüm hata olabilir

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

VEYA

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

VEYA

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

Bu şekilde isset kullanmanın, nid mevcut olmasa bile doğru olarak değerlendirilebileceğini fark edebilirsiniz. -> getIdentifier () veya -> value () veya -> raw () istisnalar atabilir.

HER ZAMAN DOĞRU DOĞRU

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

BU KURULUMU KULLANIN

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

0

İsset () işlev çağrısı sonucunda kullanılamayacağını öğrendim. Bir Boolean aşağıdaki ifadeyle döndürüldüğü için, sarılmış öğenin aslında bir değeri olduğunu doğruladım.

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

0

İnsanlar genelde bunu yanlış anlarlar. Bir varlık meta veri paketleyicisine setset çağırdığınızda, varlık paketinin bu özelliği destekleyip desteklemediğini kontrol ediyorsunuz . Alanın gerçek değeriyle hiçbir ilgisi yoktur.

Bir değerin ayarlanıp ayarlanmadığını kontrol etmek için gerçekten bağımsız bir yöntem yoktur. Sadece value () veya tercihen raw () değerlendirmeniz gerekir. (Ayrıca, çok değerli bir alansa count () öğesini çağırabilirsiniz, ancak raw () boş bir dizi döndürerek gerçekte gerekli değildir.)

$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.
  }
}

Tekrarlamak için, raw (), bir alan olup olmadığını kontrol etmek için kullanmanız gereken değerdir. Güvenilir ve hesaplamalı olarak ucuz.


0

İşte kişisel referans fonksiyonum, ayarlanmamış potansiyel referans zincirinden bir değer almak için:

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 sarılmış varlık, $ field_chain şöyle bir field_names dizisidir:

[
  'field_reference_from_the_wentity',
  'field_wanted_field_from_the_referenced_entity'
] 

ayrıca şunları da yapabilirsiniz:

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

işe yarayacak!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.