필자는 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는 일부 경우에만 작동하지만 모두 적용되는 경우 편리합니다.
코드는 다음과 같습니다.
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;
}
그래서 내 질문은 : 필드 유형을 알 수 없을 때 메타 데이터 래퍼에서 값을 가져 오는이 문제를 해결하는 더 간단하고 나은 방법이 있습니까?