エンティティメタデータラッパークラス(Drupal 7のエンティティモジュールで定義されている)を使用してフィールド値にアクセスすることを検討してきました。
しかし、これを少し厄介なものにするいくつかのことがあります。その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;
}
したがって、私の質問は次のとおりです。フィールドタイプが不明な場合にメタデータラッパーから値を取得するというこの問題に対処するための、より簡単でより良い方法はありますか。