これは Addressfield および Views モジュールを参照します。
Locationモジュールと同じように、Addressfieldモジュールのビューのサポートを拡張したいのですが。 Locationモジュールが提供する追加フィールドには、Country、Longitude、およびLatitude自体、およびProximityまたはDistanceフィルターとソートがあります。
追加 経度と緯度の列をAddressfieldモジュールに追加しました。
Locationモジュールのデータベースは、Drupal 7ではかなり単純ですが、D7 Field APIを使用して構築されていません。
AddressfieldモジュールはField APIを使用して構築されており、ViewsにはContent:フィールドがあり、Addressfieldデータベーステーブルの各列に基づいて引数、並べ替え、フィルターが行われます。ビューは、単一のフィールドでフォーマッタの選択肢のみを提供します。
ビューにテーマを設定するのと同じくらい簡単にフォーマッタをFields APIモジュールに追加できるため、これは問題ありません。したがって、緯度または経度のみを表示するフォーマッターを作成できます。おそらく、さらに良いことに、OpenLayersマップで使用するWKTポイントとして緯度と経度を表示するフォーマッターを作成できます。
ただし、必要なのは近接フィルターなので、Field APIの機能をビューで拡張する方法を説明しますが、これはあまり簡単ではありません。
例として使用できるFields 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';
}
}
}
}
}
これが解決策です。
/**
* 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,
),
);
}
}