Kiểm tra sự tồn tại của một trường trên thực thể_metadata_wrapper


22

Tôi đang lặp qua một bộ sưu tập trường và gói các mục của bộ sưu tập trường bằng một entity_metadata_wrapper. Tôi muốn kiểm tra sự tồn tại của trường trước khi gọi valuephương thức của nó (dẫn đến lỗi trên các trường không có giá trị), nhưng tôi không thể tìm ra cách để làm như vậy.

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

Cách giải quyết hiện tại của tôi là sử dụng field_get_itemsđể xem trường có trống không, nhưng tôi rất muốn có thể thực hiện việc này thông qua trình bao bọc siêu dữ liệu nếu có thể.

Câu trả lời:


26

Chỉ cần gọi hàm PHP isset():

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

EntityStr structWrapper thực hiện __isset()chức năng theo nguyên tắc của Quá tải .


Vâng, đây luôn là cách tôi đã thực hiện, ít ràng buộc vào bên trong và dễ đọc IMO hơn. Nâng cao!
Cottser

9

Bất cứ khi nào có một tham chiếu thực thể hoặc bộ sưu tập trường, isset () chưa bao giờ làm việc cho tôi. Những gì dường như hoạt động bất cứ khi nào chúng ta có một tham chiếu thực thể đang làm:

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

Câu trả lời này và bài đăng sau đây đã làm việc cho tôi: dropbucket.org/node/1201
tyler.frankenstein

4

Có vẻ như bạn có một entity_referencenơi nào đó trong đó do phương pháp xích. Nhưng, hãy xem phương thức __isset () cho EntityStr structWrapper .

Kiểm tra như:

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

và sau đó sử dụng một IFkhối để làm logic của bạn ...

CHỈNH SỬA:

$has_headshot bây giờ là kiểm tra hợp lệ mong muốn.


Tôi không chắc ý của bạn là "có vẻ như bạn có một tài liệu tham khảo thực thể ở đâu đó", nếu bạn có thể giải thích rằng một chút nữa tôi sẽ đánh giá cao nó. __issethoạt động tuyệt vời trên bộ sưu tập trường, mặc dù tôi cần thêm tên trường đầy đủ: field_contrib_headshotthay vìcontrib_headshot
Nick Tomlin

các trường là các giá trị; một chuỗi, một số, bất cứ điều gì. field_contributorđang tham khảo một lĩnh vực khác field_contrib_headshot... bằng cách nào đó bạn đang làm tổ ở đó. Tôi giả sử bạn đang sử dụng thực thể hoặc một cái gì đó khác như field_group để lồng những thứ này ... đó là tất cả những gì tôi muốn nói.
tenken

đoạn mã __isset () phù hợp với bạn là gì?
tenken

Đó là:$item_wrapper->field_contributor->__isset('field_contrib_headshot')
Nick Tomlin

Tôi cảm thấy kỳ lạ khi gọi trực tiếp __isset (), tại sao không: $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.
}

Các trường tham chiếu thực thể và các bộ sưu tập trường

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

Sao chép và dán trực tiếp từ http://dropbucket.org/node/1201 nhưng dường như là một ví dụ tốt hơn bất kỳ câu trả lời nào khác cho đến nay ...


1

Đối với EntityMetadataWrapper:

Nếu bạn có các khối mã đang chạy mà không nên hoặc nếu bạn gặp phải các lỗi PHP, hãy xem một số ví dụ dưới đây. Ví dụ này sử dụng tài sản nid.

CÓ THỂ TẤT CẢ

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

HOẶC LÀ

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

HOẶC LÀ

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

Bạn có thể thấy rằng việc sử dụng ngay lập tức như vậy có thể đánh giá là đúng ngay cả khi không có nid. -> getIdentifier () hoặc -> value () hoặc -> raw () có thể ném ngoại lệ.

LIKELY LUÔN THẬT

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

SỬ DỤNG NÀY CÀI ĐẶT

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

0

Tôi đã phát hiện ra rằngetet () không thể được sử dụng trên kết quả của một lệnh gọi hàm. Vì Boolean được trả về với câu lệnh sau, tôi có thể xác minh rằng phần tử được bao bọc, trên thực tế, có giá trị.

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

0

Mọi người thường nhận được điều này sai. Khi bạn gọi ngay lập tức trên trình bao bọc siêu dữ liệu thực thể, bạn đang kiểm tra xem gói thực thể có hỗ trợ thuộc tính đó không. Nó không có gì để làm với giá trị thực của trường.

Thực sự không có một phương pháp độc lập nào để kiểm tra xem giá trị có được đặt hay không. Bạn chỉ cần đánh giá giá trị () hoặc tốt nhất là raw (). (Bạn cũng có thể gọi Count () nếu đó là trường đa giá trị, nhưng raw () sẽ trả về một mảng trống để nó không thực sự cần thiết.)

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

Để nhắc lại, raw () là giá trị bạn nên sử dụng để kiểm tra xem một trường có tồn tại hay không. Nó đáng tin cậy và tính toán giá rẻ.


0

Đây là chức năng trợ giúp cá nhân của tôi để nhận giá trị từ chuỗi tham chiếu thực thể chưa được đặt tiềm năng:

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

$ goneity là thực thể được bao bọc, $ field_chain là một mảng các trường_names như vậy:

[
  'field_reference_from_the_wentity',
  'field_wanted_field_from_the_referenced_entity'
] 

bạn cũng có thể làm:

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

nó sẽ làm việc

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.