Я розглядав можливість використання класів обертання метаданих Entity (визначених модулем сутності в 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;
}
Отже, моє запитання: чи існують простіші / кращі способи вирішити цю проблему отримання значень із обгортки метаданих, коли тип поля не відомий?