View source
<?php
$plugin = array(
'label' => 'FieldAPI',
'handler' => array(
'class' => 'draggableviews_handler_fieldapi',
),
);
class draggableviews_handler_fieldapi extends draggableviews_handler {
public function option_definition() {
return array(
'field' => '',
);
}
function options_form($field) {
$form = array();
$options = array(
'' => t('- Select -'),
);
$sorts = isset($field->view->display_handler->display->display_options['sorts']) ? $field->view->display_handler->display->display_options['sorts'] : array();
if (empty($sorts)) {
$sorts = isset($field->view->display['default']->display_options['sorts']) ? $field->view->display['default']->display_options['sorts'] : array();
}
foreach ($sorts as $sort_option) {
$field_name = $sort_option['field'];
if (strpos($field_name, 'field_') === FALSE || strpos($field_name, '_value') === FALSE) {
continue;
}
$field_name = drupal_substr($field_name, 0, drupal_strlen($field_name) - 6);
if ($field_info = field_info_field($field_name)) {
if ($field_info['type'] == 'number_integer' || $field_info['type'] == 'list_integer') {
$views_field_data = field_views_field_default_views_data($field_info);
$options[$sort_option['table'] . ':' . $sort_option['field']] = filter_xss($views_field_data[$sort_option['table']][$sort_option['field']]['title']);
}
}
}
if (count($options) == 1) {
$form['field_warning'] = array(
'#markup' => '<div class="messages warning">' . t('Add weight integer field to sorts so it can be selected.') . '</div>',
);
}
$form['field'] = array(
'#type' => 'select',
'#title' => t('Field'),
'#options' => $options,
'#default_value' => $field->options['draggableviews']['draggableviews_handler_fieldapi']['field'],
'#description' => t('Please select field that contains weight. It should be integer type and already added to sorts of the view.'),
);
return $form;
}
function get($field, $index) {
$field_option = $field->options['draggableviews']['draggableviews_handler_fieldapi']['field'];
list($field_table, $field_name) = explode(':', $field_option);
$row = $field->view->result[$index];
$alias = $field->view->query
->get_field_alias($field_table, $field_name);
return $alias ? $row->{$alias} : NULL;
}
function set($form_state) {
$fv = $form_state['values'];
$view = $form_state['build_info']['args'][0];
$view_name = $view->name;
$view_display = $view->current_display;
$arguments = $view->args;
if (isset($view->exposed_raw_input)) {
$arguments += $view->exposed_raw_input;
ksort($arguments);
$form_state['redirect'] = array(
current_path(),
array(
'query' => $view->exposed_raw_input,
),
);
}
$base_table = $view->field['draggableviews']->table;
$entity_info_all = entity_get_info();
$entity_type = '';
foreach ($entity_info_all as $entity_name_key => $entity_info) {
if ($entity_info['base table'] == $base_table) {
$entity_type = $entity_name_key;
break;
}
}
$options_field = $view->field['draggableviews']->options['draggableviews']['draggableviews_handler_fieldapi']['field'];
list($field_table, $field_column) = explode(':', $options_field);
$field_name = drupal_substr($field_column, 0, drupal_strlen($field_column) - 6);
drupal_alter('draggableviews_handler_fieldapi_arguments', $fv['draggableviews'], $view);
uasort($fv['draggableviews'], 'drupal_sort_weight');
foreach ($fv['draggableviews'] as $item) {
if (isset($item['id']) && isset($item['weight'])) {
$entity_wrapper = entity_metadata_wrapper($entity_type, $item['id']);
$entity_wrapper->{$field_name} = $item['weight'];
$entity_wrapper
->save();
}
}
}
}