entity_metadata_wrapper를 사용할 때 알 수없는 필드 유형의 값에 액세스


12

필자는 Drupal 7의 엔터티 모듈에서 정의한 Entity Metadata Wrapper 클래스를 사용하여 필드 값에 액세스하는 방법을 살펴 보았습니다.

그러나 이것을 조금 어색하게 만드는 몇 가지가 있습니다. 다음 field_something과 같이 이름이 지정된 필드를 정의하는 컨텐츠 유형에 대한 랩퍼가 있다고 가정하십시오 .

$wrapper = entity_metadata_wrapper('node', node_load($nid));
$value = $wrapper->field_something->value();

내가 가진 첫 번째 문제는 내가 얻는 것이 실제 값 (문자열, 엔티티 등)인지, 다른 메타 데이터 구조 래퍼 (필드가 여러 값을 가질 때)인지 또는 배열인지를 미리 알 수있는 방법이 없다는 것입니다 필드에는 여러 속성이 있습니다).

방법을 사용하여 이러한 질문에 대답하는 방법을 찾았습니다 info().

$info = $wrapper->field_something->info();
$is_multi_value = (strpos($info['type'], 'list<') === 0);
$has_multiple_properties = isset($info['property info']]);

그러나 그것은 거의 실용적이지 않습니다. 사전 정의를 모른 채 필드를 사용하고 싶을 때마다 몇 가지 경우를 고려해야합니다. 이것은 내 코드를 상당히 무겁게 만듭니다.

이 문제를 해결하기 위해 다음과 같은 코드를 작성했습니다.

  1. 단일 값 필드 인 경우에도 항상 배열을 반환합니다.
  2. 여러 속성이있는 경우 첫 번째 열의 값을 반환하십시오.

포인트 1은 호출자가 이것이 단일 값 필드인지 아닌지를 알고 싶어하지 않는 한 항상 작동합니다. 포인트 2는 일부 경우에만 작동하지만 모두 적용되는 경우 편리합니다.

코드는 다음과 같습니다.

function entity_metadata_simple_values($field) {
  $fields = array();
  $values = array();
  $info = $field->info();
  if (strpos($info['type'], 'list<') === 0) {
    foreach ($field->getIterator() as $field_iteration) {
      $fields[] = $field_iteration;
    }
  } else {
    $fields[] = $field;
  }
  foreach ($fields as $final_field) {
    $ff_info = $final_field->info();
    if (isset($ff_info['property info'])) {
      $column = reset(array_keys($ff_info['property info']));
      $values[] = $final_field->{$column}->value();
    } else {
      $values[] = $final_field->value();
    }
  }

  return $values;
}

그래서 내 질문은 : 필드 유형을 알 수 없을 때 메타 데이터 래퍼에서 값을 가져 오는이 문제를 해결하는 더 간단하고 나은 방법이 있습니까?

답변:


4

이 과정을 좀 더 쉽게하기위한 몇 가지 제안이 있습니다.

$wrapper->field_something->type();

즉, 필드의 타입 반환 node, taxonomy_term, integer, text그런 다음 처리 할 수있는 등 값에서 반환 $wrapper->field_something->value()올바르게합니다.

또한

$wrapper->field_something->raw()

필드의 원시 값을 반환합니다. 이는 array값이 여러 개인 필드의 경우에 해당합니다. 예를 들어, a entity_referencenid참조 된 엔터티 또는 참조 된 엔터티 ID (또는 엔터티 ID)입니다 array.


죄송합니다. 너무 빨리 입력했습니다! $ wrapper-> field_something-> type ()은 $ wrapper-> field_something-> info ()에서 반환 한 배열의 'type'요소와 동일한 정보를 반환합니다. 결정적으로, 다중 값 유형에 대해 문자열 "list <type>"을 여전히 반환하므로 다중 값을 처리하기 위해 strpos (또는 이에 상응하는)가 여전히 필요합니다 (가져 오기 전에 처리하려는 경우).
Alice Heaton

두 번째 요점은 :-> raw () 또는-> value ()의 반환을 테스트하여 다중 값을 사용하면 실제로 해결할 수 있지만 값을 가져 오기 전에 값이 여러 개인 것처럼 알고 싶습니다. 각 항목에 대한 랩퍼를 다시 작성 해야하는 배열을 수동으로 이동하는 대신-> getIterator () 사용하여 foreach 루프를 통해 실행하고 싶습니다.
Alice Heaton

3

아무도 다른 해결책을 찾지 못했기 때문에 내 질문에 대답 할 것입니다.

아닌 엔티티 메타 데이터 래퍼를 사용하여 알 수없는 필드 유형의 액세스 값 간단한 방법은.

내가 처음 설명한 방법에 대한 대체 방법이 있습니다 (예 : @thepearson이 지적한 방법). 특히이 방법은 유용합니다.

 entity_property_list_extract_type($type)

형식이 목록이면 목록 형식을 반환하고 (예 : 형식이 'list <integer>'인 경우 '정수') 형식이 목록이 아닌 경우 false를 반환합니다. 내부적으로 처음 게시 한 코드와 같은 strpos를 수행하지만 더 확실한 증거라고 생각합니다.

결론은 다음과 같습니다.

  • 필드 메타 데이터를 모르거나 가능한 각 사례를 신중하게 처리하려는 경우 엔터티 메타 데이터 래퍼가 제대로 작동합니다.

  • 필드가 어떤 유형인지 정확히 알고 사용하려는 경우 엔터티 메타 데이터 래퍼가 제대로 작동합니다.

  • 필드 유형이 어떤지에 대한 아이디어 만있는 경우 (예 : 모든 텍스트, 형식이 있는지 여부를 모르고 단일 또는 다중 값인지 여부를 모르는 경우) 엔티티 메타 데이터 랩퍼 지름길을 제공하지 않으며 초기 질문에서 한 것처럼 직접 작성해야합니다.


1

단일 / 다중 필드 검사의 EntityListWrapper경우 다중 값 필드와 EntityValueWrapper단일 값 필드에 대한 래퍼 객체 유형을 테스트하는 것이 유용하다는 것을 알았습니다 .

<?php
...
$wrapper = entity_metadata_wrapper('user', $account);
// Get address, or first address if a multi-value field instance.
if (get_class($wrapper->field_address) == 'EntityListWrapper') {
  $value = $wrapper->field_address[0]->value();
}
else {
  $value = $wrapper->field_address->value();
}

또는 심지어if($wrapper->field_name instanceof EntityListWrapper) {...}
rudolfbyker
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.