Создание отдельных полей из виджета API полей с несколькими столбцами
Это ссылается на модули Адресного поля и представлений .
Я хотел бы иметь расширенную поддержку представлений для модуля адресного поля, как это делает модуль местоположения. Некоторые из дополнительных полей, доступных в модуле определения местоположения, - это Страна, Долгота и Широта сами по себе, а также фильтры и сортировки близости или расстояния.
Я добавил столбцы долготы и широты в модуль адресного поля.
База данных для модуль определения местоположения довольно прост в Drupal 7, но не построен с использованием API полей D7.
Модуль Addressfield построен с использованием API полей и с представлениями имеет Содержимое: доступное поле, а также аргументы, сортировку и фильтры на основе каждого из столбцов в таблице базы данных Addressfield. Просмотры предлагают только выбор форматов для одного поля.
Это нормально, потому что добавить средство форматирования в модуль API полей так же просто, как и создать представление. Так что я можно создать форматер, который показывает только широту или долготу. Возможно, еще лучше, я могу создать форматер, который отображает широту и долготу в качестве точки WKT, которая будет использоваться для карты OpenLayers.
Однако мне нужен фильтр близости, поэтому я излагаю, как расширить функциональность API полей в представлениях, что не очень прямолинейно.
Доступна ли документация для конкретного случая или модулей, расширяющих API полей, которые можно использовать в качестве примеры?
Я подумал, что логичнее всего было бы использовать hook_field_views_data_alter()
. Вот примерный код, и я не уверен, почему он не работает.
function addressfield_field_views_data_alter (&$result, $field) {
if (array_key_exists('field_data_field_address', $result)) {
if ($result['field_data_field_address']) {
$columns = array();
$columns = array(
'field_address_administrative_area',
'field_address_country',
'field_address_lat',
'field_address_lng',
'field_address_locality',
'field_address_postal_code',
'field_address_premise',
'field_address_thoroughfare',
);
$add_fields = array('entity_type', 'delta', 'language', 'bundle');
foreach ($result['field_data_field_address'] as $column => $data) {
if (in_array($column, $columns)){
$result['field_data_field_address'][$column]['field'] = array(
'field' => $column,
'table' => 'field_data_field_address',
'handler' => 'views_handler_field_field',
'click sortable' => TRUE,
'field_name' => $column,
'additional fields' => $add_fields,
'entity_tables' => array(
'node' => 'node',
'node_revision' => 'node',
),
'element type' => 'div',
'is revision' => FALSE,
'entity id' => 'nid',
'base table' => 'node',
);
$result['field_data_field_address'][$column]['group'] = 'Content';
}
}
}
}
}
1 answers
Вот решение.
/**
* Implements hook_field_views_data_alter
*
* @param mixed $result
* @param mixed $field
*/
function addressfield_field_views_data_alter (&$result, $field) {
if (array_key_exists('field_data_field_address', $result)) {
$result['field_data_field_address']['field_address_country'] += array(
'title' => t('Country'),
'help' => t('The Country name of the field'),
'field' => array(
'handler' => 'addressfield_views_handler_field_country',
'click sortable' => TRUE,
),
);
}
}
Или, если вы хотите не использовать реальное поле в таблице, такое как field_address_country, а вместо псевдонима поля, вы можете добавить атрибут поля и таблицы в массив полей, как это.
function addressfield_field_views_data_alter (&$result, $field) {
if ($field['type'] == 'addressfield')) {
$result['field_data_field_address']['country'] = array(
'title' => t('Country'),
'group' => 'Bad Ass',
'help' => t('The Country name of the field'),
'field' => array(
'field' => 'field_address_country',
'table' => 'field_data_field_address',
'handler' => 'views_handler_field',
'click sortable' => TRUE,
),
);
}
}