diff --git a/MultifieldViewsHandler.php b/MultifieldViewsHandler.php index a4d9b58..15a8ea3 100644 --- a/MultifieldViewsHandler.php +++ b/MultifieldViewsHandler.php @@ -53,12 +53,19 @@ class MultifieldViewsHandler extends views_handler_field { public $fieldHandler; + public function construct() { + parent::construct(); + $definition = $this->definition; + $definition['handler'] = $definition['subfield handler']; + unset($definition['subfield handler']); + $definition['field_name'] = $definition['subfield_name']; + unset($definition['subfield_name']); + $this->fieldHandler = _views_create_handler($definition, 'handler', 'field'); + } + function init(&$view, &$options) { parent::init($view, $options); - $this->fieldHandler = new views_handler_field_field(); - $this->fieldHandler->init($view, $options); - $this->field_info = $field = field_info_field($this->definition['field_name']); $this->subfield_info = $subfield = field_info_field($this->definition['subfield_name']); $this->multiple = FALSE; @@ -307,7 +314,7 @@ class MultifieldViewsHandler extends views_handler_field { $options = parent::option_definition(); // option_definition runs before init/construct, so no $this->field_info - $field = field_info_field($this->definition['field_name']); + $field = field_info_field($this->definition['subfield_name']); $field_type = field_info_field_types($field['type']); $column_names = array_keys($field['columns']); $default_column = ''; @@ -375,7 +382,7 @@ class MultifieldViewsHandler extends views_handler_field { function options_form(&$form, &$form_state) { parent::options_form($form, $form_state); - + module_load_include('inc', 'views', 'modules/field/views_handler_field_field'); $subfield = $this->subfield_info; $formatters = _field_view_formatter_options($subfield['type']); $column_names = array_keys($subfield['columns']); @@ -819,7 +826,20 @@ class MultifieldViewsHandler extends views_handler_field { } $langcode = $this->field_language($entity_type, $entity); - $render_array = field_view_field($entity_type, $entity, $this->definition['field_name'], $display, $langcode); + $multifield_items = field_get_items($entity_type, $entity, $this->definition['field_name'], $langcode); + $render_array = array(); + foreach ($multifield_items as $multifield_item) { + $multifield = _multifield_field_item_to_entity($this->field_info['type'], $multifield_item, array('machine_name' => $this->field_info['type'])); + $subfield_langcode = $this->field_language('multifield', $multifield); + if (empty($render_array)) { + $render_array = field_view_field('multifield', $multifield, $this->definition['subfield_name'], $display, $subfield_langcode); + } + else { + $subfield_render_array = field_view_field('multifield', $multifield, $this->definition['subfield_name'], $display, $subfield_langcode); + // Multifield subfields are always single value. + $render_array[] = $subfield_render_array[0]; + } + } $items = array(); if ($this->options['field_api_classes']) { @@ -880,7 +900,6 @@ class MultifieldViewsHandler extends views_handler_field { } public function __call($name, $arguments) { - dpm($name); return call_user_func_array(array($this->fieldHandler, $name), $arguments); } } diff --git a/multifield.module b/multifield.module index 7e02b15..94cd1ff 100644 --- a/multifield.module +++ b/multifield.module @@ -555,69 +555,58 @@ function _multifield_subfield_views_data($field) { * Implements hook_field_views_data(). */ function multifield_field_views_data($field) { - $data = field_views_field_default_views_data($field); + $field_info = field_info_fields(); + $multifields = multifield_get_fields(); - $results = _multifield_subfield_views_data($field); - foreach ($results as $subfield_name => $subfield_data) { - } - //dpm($results); - - if ($field['type'] == 'test') { - $data['field_data_field_multifield_test']['field_multifield_test_field_text'] = array( - 'group' => 'Multifield', - 'title' => 'Text', - 'title short' => 'Text', - 'help' => 'Appears in: node:article', - 'field' => array( - 'table' => 'field_data_multifield_test', - 'handler' => 'MultifieldViewsHandler', - 'click sortable' => TRUE, - 'field_name' => 'field_multifield_test', - 'subfield_name' => 'field_text', - 'real field' => 'field_multifield_test_field_text_value', - 'additional fields' => array( - 'delta', - 'language', - 'bundle', - 'field_multifield_test_field_text_value', - 'field_multifield_test_field_text_format', - ), - 'entity_tables' => array( - 'node' => 'node', - 'node_revision' => 'node', - ), - 'element type' => 'div', - 'is revision' => FALSE, - ), - ); - $data['field_revision_field_multifield_test']['field_multifield_test_field_text'] = array( - 'group' => 'Multifield (historical data)', - 'title' => 'Text', - 'title short' => 'Text', - 'help' => 'Appears in: node:article', - 'field' => array( - 'table' => 'field_revision_multifield_test', - 'handler' => 'MultifieldViewsHandler', - 'click sortable' => TRUE, - 'field_name' => 'field_multifield_test', - 'subfield_name' => 'field_text', - 'real field' => 'field_multifield_test-revision_id_field_text_value', - 'additional fields' => array( - 'delta', - 'language', - 'bundle', - 'field_multifield_test_field_text_value', - 'field_multifield_test_field_text_format', - ), - 'entity_tables' => array( - 'node' => 'node', - 'node_revision' => 'node', - ), - 'element type' => 'div', - 'is revision' => TRUE, - ), - ); + $base_field = $field['field_name']; + $multifield_subfields = multifield_type_get_subfields($multifields[$base_field]); + $data = field_views_field_default_views_data($field); + $all_subfield_data = _multifield_subfield_views_data($field); + foreach ($data as &$table) { + if (isset($table[$base_field]['field'])) { + foreach ($multifield_subfields as $multifield_subfield) { + $subfield_info = $field_info[$multifield_subfield]; + $subfield_data = $all_subfield_data[$multifield_subfield]; + $new_name = $base_field . '_' . $multifield_subfield; + $f_data = $subfield_data['field_data_' . $multifield_subfield][$multifield_subfield]; + $f_data['table'] = $table[$base_field]['field']['table']; + $f_data['field']['table'] = $table[$base_field]['field']['table']; + $f_data['field']['entity_tables'] = $table[$base_field]['field']['entity_tables']; + foreach ($f_data['field']['additional fields'] as $index => &$_additional) { + if (!in_array($_additional, array('delta', 'language', 'bundle'))) { + $_additional = $base_field . '_' . $_additional; + } + } + foreach ($f_data['field']['additional fields'] as $index => $additional) { + if (!in_array($additional, array('delta', 'language', 'bundle'))) { + $source_field = substr($f_data['field']['additional fields'][$index], strlen($base_field . '_')); + if (($key = array_search($f_data['field']['additional fields'][$index], $table[$base_field]['field']['additional fields'])) !== false) { + unset($table[$base_field]['field']['additional fields'][$f_data['field']['additional fields'][$index]]); + } + $table[$f_data['field']['additional fields'][$index]]['field'] = $f_data['field']; + $table[$f_data['field']['additional fields'][$index]]['field']['handler'] = 'MultifieldViewsHandler'; + $table[$f_data['field']['additional fields'][$index]]['field']['subfield_name'] = $f_data['field']['field_name']; + $table[$f_data['field']['additional fields'][$index]]['field']['field_name'] = $base_field; + foreach (array('argument', 'filter', 'sort') as $handler) { + if (isset($subfield_data['field_data_' . $multifield_subfield][$source_field][$handler]) && isset($table[$f_data['field']['additional fields'][$index]][$handler])) { + // Overwrite handler. + $table[$f_data['field']['additional fields'][$index]][$handler]['handler'] = $subfield_data['field_data_' . $multifield_subfield][$source_field][$handler]['handler']; + // Add additional options without overwriting table, field_name etc. + $table[$f_data['field']['additional fields'][$index]][$handler] += $subfield_data['field_data_' . $multifield_subfield][$source_field][$handler]; + } + } + if (isset($subfield_data['field_data_' . $multifield_subfield][$source_field]['relationship'])) { + $table[$f_data['field']['additional fields'][$index]]['relationship'] = $subfield_data['field_data_' . $multifield_subfield][$source_field]['relationship']; + } + } + } + $table[$new_name] = $f_data; + $table[$new_name]['field']['handler'] = 'MultifieldViewsHandler'; + $table[$new_name]['field']['subfield_name'] = $f_data['field']['field_name']; + $table[$new_name]['field']['field_name'] = $base_field; + $table[$new_name]['field']['subfield handler'] = $f_data['field']['handler']; + } + } } - return $data; }