web-dev-qa-db-ja.com

複数列のField APIウィジェットから個々のフィールドを作成する

これは 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';
        }
      }
    }
  }
}
1
Adam S

これが解決策です。

/**
*  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
Adam S