View source
<?php
views_include_handlers();
function content_views_tablename($field) {
return 'node_data_' . $field['field_name'];
}
function content_views_data() {
$data = array();
foreach (content_fields() as $field) {
$module = $field['module'];
$result = module_invoke($module, 'field_settings', 'views data', $field);
if (empty($result)) {
$result = content_views_field_views_data($field);
}
if (is_array($result)) {
$data = array_merge($data, $result);
}
}
return $data;
}
function content_views_field_views_data($field) {
$field_types = _content_field_types();
if (isset($field_types[$field['type']])) {
$db_info = content_database_info($field);
$table_alias = content_views_tablename($field);
$types = array();
foreach (content_types() as $type) {
if (isset($type['fields'][$field['field_name']])) {
$types[] = $type['name'];
}
}
$data = array();
$data['table']['group'] = $field_types[$field['type']]['label'];
$data['table']['join']['node'] = array(
'table' => $db_info['table'],
'left_field' => 'vid',
'field' => 'vid',
);
$columns = array();
$arguments = array();
$filters = array();
foreach ($db_info['columns'] as $column => $attributes) {
$columns[] = $attributes['column'];
$sorts[] = !empty($attributes['sortable']) ? TRUE : FALSE;
switch ($attributes['type']) {
case 'numeric':
case 'int':
case 'mediumint':
case 'tinyint':
case 'bigint':
case 'serial':
case 'float':
$filters[] = 'views_handler_filter_numeric_content';
$arguments[] = 'views_handler_argument_content';
break;
case 'text':
case 'blob':
default:
$filters[] = 'views_handler_filter_string_content';
$arguments[] = 'views_handler_argument_string_content';
break;
}
}
$data[$columns[0]] = array(
'group' => t($field_types[$field['type']]['label']),
'title' => t($field['widget']['label']) . ' (' . $field['field_name'] . ')',
'help' => t($field_types[$field['type']]['label']) . ' - ' . t('Appears in : @types', array(
'@types' => implode(', ', $types),
)),
'field' => array(
'field' => $columns[0],
'tablename' => $db_info['table'],
'handler' => 'views_handler_field_content_multiple',
'click sortable' => $sorts[0],
'additional fields' => $columns,
'content_field_name' => $field['field_name'],
'allow_empty' => TRUE,
'access callback' => 'content_views_access_callback',
'access arguments' => array(
$field,
),
),
'argument' => array(
'field' => $columns[0],
'tablename' => $db_info['table'],
'handler' => $arguments[0],
'click sortable' => $sorts[0],
'name field' => '',
'additional fields' => $columns,
'content_field_name' => $field['field_name'],
'allow_empty' => TRUE,
),
'filter' => array(
'field' => $columns[0],
'title' => t($field['widget']['label']),
'tablename' => $db_info['table'],
'handler' => $filters[0],
'additional fields' => $columns,
'content_field_name' => $field['field_name'],
'allow_empty' => TRUE,
),
);
if (!empty($sorts[0])) {
$data[$columns[0]]['sort'] = array(
'field' => $columns[0],
'tablename' => $db_info['table'],
'handler' => 'views_handler_sort_content',
'additional fields' => $columns,
'content_field_name' => $field['field_name'],
'allow_empty' => TRUE,
);
}
return array(
$table_alias => $data,
);
}
}
class views_handler_filter_string_content extends views_handler_filter_string {
var $content_field;
function construct() {
parent::construct();
$this->content_field = content_fields($this->definition['content_field_name']);
$this->additional_fields = $this->definition['additional fields'];
}
}
class views_handler_filter_numeric_content extends views_handler_filter_numeric {
var $content_field;
function construct() {
parent::construct();
$this->content_field = content_fields($this->definition['content_field_name']);
$this->additional_fields = $this->definition['additional fields'];
}
}
class views_handler_filter_many_to_one_content extends views_handler_filter_many_to_one {
var $content_field;
function construct() {
parent::construct();
$this->content_field = content_fields($this->definition['content_field_name']);
$this->additional_fields = $this->definition['additional fields'];
$field = $this->content_field;
$this->value_title = $field['widget']['label'];
}
function get_value_options() {
$this->value_options = $this
->allowed_values();
}
function allowed_values() {
$field = $this->content_field;
$function = $field['module'] . '_allowed_values';
$options = function_exists($function) ? $function($field) : content_allowed_values($field);
return (array) $options;
}
}
class views_handler_sort_content extends views_handler_sort {
var $content_field;
function construct() {
parent::construct();
$this->content_field = content_fields($this->definition['content_field_name']);
$this->additional_fields = $this->definition['additional fields'];
}
}
class views_handler_argument_content extends views_handler_argument {
var $content_field;
function construct() {
parent::construct();
$this->content_field = content_fields($this->definition['content_field_name']);
$this->additional_fields = $this->definition['additional fields'];
}
}
class views_handler_argument_string_content extends views_handler_argument_string {
var $content_field;
function construct() {
parent::construct();
$this->content_field = content_fields($this->definition['content_field_name']);
$this->additional_fields = $this->definition['additional fields'];
}
}
class views_handler_field_content extends views_handler_field_node {
var $content_field;
function construct() {
parent::construct();
$this->content_field = content_fields($this->definition['content_field_name']);
}
function options(&$options) {
parent::options($options);
$field = $this->content_field;
$options['label'] = $field['widget']['label'];
$options['format'] = 'default';
}
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
$field = $this->content_field;
$options = $this->options;
$field_types = _content_field_types();
$formatters = array();
if (is_array($field_types[$field['type']]['formatters'])) {
foreach ($field_types[$field['type']]['formatters'] as $name => $info) {
$formatters[$name] = t($info['label']);
}
}
$form['format'] = array(
'#title' => t('Format'),
'#type' => 'select',
'#options' => $formatters,
'#required' => TRUE,
'#default_value' => $options['format'],
);
}
function options_validate($form, &$form_state) {
}
function admin_summary() {
$field = $this->content_field;
$field_types = _content_field_types();
if (isset($field_types[$field['type']]['formatters'][$this->options['format']])) {
return t($field_types[$field['type']]['formatters'][$this->options['format']]['label']);
}
}
function render($values) {
$field = $this->content_field;
$options = $this->options;
$db_info = content_database_info($field);
$values->build_mode = 'views';
$item = array();
foreach ($db_info['columns'] as $column => $attributes) {
$item[$column] = $values->{$this->table_alias . '_' . $attributes['column']};
}
return content_format($field, $item, $options['format'], $values);
}
}
class views_handler_field_content_multiple extends views_handler_field_content {
var $defer_query;
function options(&$options) {
parent::options($options);
$field = $this->content_field;
$options['multiple'] = array(
'group' => TRUE,
'multiple_number' => '',
'multiple_from' => '',
'multiple_reversed' => FALSE,
);
}
function options_form(&$form, &$form_state) {
parent::options_form($form, $form_state);
$field = $this->content_field;
$options = $this->options;
$form['multiple'] = array(
'#access' => $field['multiple'],
);
$form['multiple']['group'] = array(
'#title' => t('Group multiple values'),
'#type' => 'checkbox',
'#default_value' => $options['multiple']['group'],
);
$form['multiple']['multiple_number'] = array(
'#type' => 'textfield',
'#size' => 5,
'#field_prefix' => t('Show') . ' ',
'#field_suffix' => t(' values,'),
'#default_value' => $options['multiple']['multiple_number'],
'#prefix' => '<div class="container-inline">',
);
$form['multiple']['multiple_from'] = array(
'#type' => 'textfield',
'#size' => 5,
'#field_prefix' => t('Starting from') . ' ',
'#default_value' => $options['multiple']['multiple_from'],
);
$form['multiple']['multiple_reversed'] = array(
'#title' => t('Start from last values'),
'#type' => 'checkbox',
'#default_value' => $options['multiple']['multiple_reversed'],
'#suffix' => '</div>',
);
}
function query() {
$field = $this->content_field;
$options = $this->options;
$this->defer_query = $options['multiple']['group'] && $field['multiple'];
if (!$this->defer_query) {
return parent::query();
}
$this->field_alias = $this->real_field;
}
function pre_render($values) {
if (isset($this->view->build_info['summary'])) {
return parent::pre_render($values);
}
if (!$this->defer_query || empty($values)) {
return parent::pre_render($values);
}
$field = $this->content_field;
$db_info = content_database_info($field);
$options = $this->options;
$this->field_values = array();
$nids = array();
foreach ($values as $value) {
$nids[] = $value->nid;
}
$table_alias = content_views_tablename($field);
$query_columns = array(
"{$table_alias}.delta AS delta",
);
foreach ($db_info['columns'] as $column => $attributes) {
$query_columns[] = "{$table_alias}.{$attributes['column']} AS {$column}";
}
$query = "SELECT node.nid, " . implode(', ', $query_columns) . " FROM {node} node" . " LEFT JOIN {" . $db_info['table'] . "} {$table_alias} ON node.vid = {$table_alias}.vid" . " WHERE node.nid IN (" . implode(',', $nids) . ")" . " ORDER BY node.nid ASC, {$table_alias}.delta " . ($options['multiple']['multiple_reversed'] ? 'DESC' : 'ASC');
$result = $options['multiple']['multiple_number'] ? db_query_range($query, $options['multiple']['multiple_from'], $options['multiple']['multiple_number']) : db_query($query);
while ($item = db_fetch_array($result)) {
$this->field_values[$item['nid']][$item['delta']] = $item;
}
}
function render($values) {
if (!$this->defer_query || empty($this->field_values)) {
return parent::render($values);
}
$field = $this->content_field;
$options = $this->options;
$values->build_mode = 'views';
$items = array();
foreach ($this->field_values[$values->{$this->additional_fields['nid']}] as $item) {
$items[] = content_format($field, $item, $options['format'], $values);
}
if (count($items) > 1) {
return theme('content_view_multiple_field', $items, $field, $values);
}
else {
return $items[0];
}
}
}
function theme_content_view_multiple_field($items, $field, $values) {
$output = '';
foreach ($items as $item) {
$output .= '<div class="field-item">' . $item . '</div>';
}
return $output;
}