View source
<?php
class field_extractor_handler_field extends views_handler_field_prerender_list {
public $entity_type;
public $entities;
public $referenced_entities;
public $settings;
public function init(&$view, &$options) {
parent::init($view, $options);
$field = field_info_field($this->definition['field_name']);
$instance = array(
'settings' => array(),
);
$this->settings = field_extractor_settings($field, $instance);
$table_data = views_fetch_data($this->table);
$this->entity_type = $table_data['table']['entity type'];
}
function option_definition() {
$options = parent::option_definition();
$options['field_name'] = array(
'default' => '',
);
$options['formatter'] = array(
'default' => '',
);
$options['settings'] = array(
'default' => array(),
);
return $options;
}
function options_form(&$form, &$form_state) {
$fields = array();
foreach (field_info_instances($this->settings['entity_type']) as $bundle => $instances) {
foreach ($instances as $field_name => $field_instance) {
$fields[$field_name] = $field_name;
}
}
if (empty($this->options['field_name']) || !isset($fields[$this->options['field_name']])) {
$field_names = array_keys($fields);
$this->options['field_name'] = reset($field_names);
}
$form['field_name'] = array(
'#type' => 'select',
'#title' => t('Field'),
'#options' => $fields,
'#default_value' => $this->options['field_name'],
'#ajax' => array(
'path' => views_ui_build_form_url($form_state),
),
'#submit' => array(
'views_ui_config_item_form_submit_temporary',
),
'#executes_submit_callback' => TRUE,
);
$selected_field = field_info_field($this->options['field_name']);
$formatters = _field_extractor_formatters($selected_field['type']);
unset($formatters['field_extractor']);
if (empty($this->options['formatter']) || !isset($formatters[$this->options['formatter']])) {
$formatter_names = array_keys($formatters);
$this->options['formatter'] = reset($formatter_names);
}
$form['formatter'] = array(
'#type' => 'select',
'#title' => t('Formatter'),
'#options' => $formatters,
'#default_value' => $this->options['formatter'],
'#ajax' => array(
'path' => views_ui_build_form_url($form_state),
),
'#submit' => array(
'views_ui_config_item_form_submit_temporary',
),
'#executes_submit_callback' => TRUE,
);
$formatter = field_info_formatter_types($this->options['formatter']);
$formatter_settings = $this->options['settings'] + field_info_formatter_settings($this->options['formatter']);
ctools_include('fields');
$instance = ctools_fields_fake_field_instance($this->options['field_name'], '_dummy', $formatter, $formatter_settings);
$instance['display']['_dummy'] = array(
'type' => $this->options['formatter'],
'settings' => $formatter_settings,
);
$settings_form = array(
'#value' => array(),
);
$function = $formatter['module'] . '_field_formatter_settings_form';
if (function_exists($function)) {
$settings_form = $function($selected_field, $instance, '_dummy', $element, $form_state);
}
$form['settings'] = $settings_form;
parent::options_form($form, $form_state);
}
function query($use_groupby = FALSE) {
}
function click_sortable() {
return FALSE;
}
function post_execute(&$values) {
if (!empty($values)) {
list($this->entity_type, $this->entities) = $this->query
->get_result_entities($values);
$referenced_ids = array();
$referenced_ids_by_parent = array();
foreach ($this->entities as $entity) {
$items = field_get_items($this->entity_type, $entity, $this->definition['field_name']);
if (!empty($items)) {
list($entity_id) = entity_extract_ids($this->entity_type, $entity);
foreach ($items as $item) {
$referenced_ids[] = $item[$this->settings['column']];
$referenced_ids_by_parent[$entity_id][] = $item[$this->settings['column']];
}
}
}
$referenced_entities = entity_load($this->settings['entity_type'], $referenced_ids);
foreach ($referenced_ids_by_parent as $entity_id => $referenced_ids) {
foreach ($referenced_ids as $id) {
if (!empty($referenced_entities[$id])) {
$this->referenced_entities[$entity_id][] = $referenced_entities[$id];
}
}
}
foreach ($values as $row_id => &$value) {
$entity = $this->entities[$row_id];
list($entity_id) = entity_extract_ids($this->entity_type, $entity);
if (!empty($this->referenced_entities[$entity_id])) {
$element = field_extractor_build_element($this->referenced_entities[$entity_id], $this->settings['entity_type'], $this->options);
$items = array();
foreach (element_children($element) as $key) {
$items[$key] = $element[$key];
}
}
else {
$items = array();
}
$value->{'field_extractor_' . $this->options['id']} = $items;
}
}
}
function get_items($values) {
return $values->{'field_extractor_' . $this->options['id']};
}
function render_item($count, $item) {
$item['rendered'] = render($item);
return $item['rendered'];
}
}