Создание отдельных полей от многостолбцового Поля виджет API

Это ссылается на Аддрессфилд и модули Представлений.

Я хотел бы расшириться, поддержка Представлений модуля Аддрессфилда как модуль Местоположения делает. Некоторыми дополнительными полями, которые модуль Местоположения делает доступным, является Страна, Долгота и Широта собой и фильтрами Близости или Расстояния и видами.

Я добавил столбцы долготы и широты к модулю Аддрессфилда.

База данных для модуля Местоположения является довольно прямой в Drupal 7, но не созданном использовании Поля D7 API.

Модуль Аддрессфилда создается с помощью Поля API, и с Представлениями это имеет Содержание: доступное поле и также аргументы, виды и фильтры на основе каждого из столбцов в таблице базы данных Аддрессфилда. Представления только предлагают выбор средств форматирования на единственном поле.

Это прекрасно, потому что столь же легко добавить средство форматирования к Поля модуль 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
23.12.2019, 18:33
1 ответ

Вот решение.

/**
*  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
07.03.2020, 23:02

Теги

Похожие вопросы