Создание отдельных полей из виджета 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';
        }
      }
    }
  }
}
Author: augusto, 2011-04-08

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,
        ),
      );
   }
}
 0
Author: Adam S, 2011-04-09 16:05:49