first import
This commit is contained in:
@@ -0,0 +1,44 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Views hooks implementations.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Implements hook_views_data_alter().
|
||||
*/
|
||||
function draggableviews_views_data_alter(&$data) {
|
||||
|
||||
$data['draggableviews_structure']['weight'] = array(
|
||||
'title' => t('Weight'),
|
||||
'help' => t('Sort entities by the draggableviews weight table field.'),
|
||||
'group' => t('Draggableviews'),
|
||||
'sort' => array(
|
||||
'handler' => 'draggableviews_handler_sort',
|
||||
),
|
||||
);
|
||||
|
||||
foreach (entity_get_info() as $entity_type => $info) {
|
||||
if (isset($info['base table']) && isset($data[$info['base table']]['table'])) {
|
||||
$data[$info['base table']]['draggableviews'] = array(
|
||||
'title' => $data[$info['base table']]['table']['group'],
|
||||
'group' => t('Draggableviews'),
|
||||
'help' => t('Provide a draggable functionality.'),
|
||||
'real field' => $info['entity keys']['id'],
|
||||
'field' => array(
|
||||
'handler' => 'draggableviews_handler_field_draggable',
|
||||
'click sortable' => FALSE,
|
||||
),
|
||||
);
|
||||
|
||||
// Explain to every entity how to join with draggableviews structure table.
|
||||
$data['draggableviews_structure']['table']['join'][$info['base table']] = array(
|
||||
'handler' => 'draggableviews_join_handler',
|
||||
'left_table' => $info['base table'], // Because this is a direct link it could be left out.
|
||||
'left_field' => $info['entity keys']['id'],
|
||||
'field' => 'entity_id',
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,141 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Views field handler. Contains all relevant Draggableviews
|
||||
* options and related logic.
|
||||
* Implements the Views Form API.
|
||||
*/
|
||||
|
||||
class draggableviews_handler_field_draggable extends views_handler_field {
|
||||
|
||||
function option_definition() {
|
||||
$options = parent::option_definition();
|
||||
|
||||
$options['draggableviews'] = array(
|
||||
'contains' => array(
|
||||
'handler' => array('default' => 'draggableviews_handler_native'),
|
||||
'save_button_label' => array('default' => 'Save'),
|
||||
'ajax' => array('default' => FALSE),
|
||||
),
|
||||
);
|
||||
|
||||
// Populate default values of form elements provided by handlers.
|
||||
foreach (draggableviews_get_handlers() as $handler_id => $handler_object) {
|
||||
$options['draggableviews']['contains'][$handler_id] = array('default' => $handler_object->option_definition());
|
||||
}
|
||||
return $options;
|
||||
}
|
||||
|
||||
function options_form(&$form, &$form_state) {
|
||||
parent::options_form($form, $form_state);
|
||||
|
||||
// Remove not needed settings options.
|
||||
$form['alter']['#access'] = FALSE;
|
||||
$form['style_settings']['#access'] = FALSE;
|
||||
$form['empty_field_behavior']['#access'] = FALSE;
|
||||
|
||||
$form['draggableviews'] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => t('Draggable Views'),
|
||||
'#collapsible' => TRUE,
|
||||
'#collapsed' => FALSE,
|
||||
);
|
||||
|
||||
$handler_options = array();
|
||||
$handler_forms = array();
|
||||
foreach (draggableviews_get_handlers() as $handler_id => $handler_object) {
|
||||
$handler = ctools_get_plugins('draggableviews', 'handler', $handler_id);
|
||||
$handler_options[$handler_id] = filter_xss($handler['label']);
|
||||
$handler_forms[$handler_id] = $handler_object->options_form($this);
|
||||
}
|
||||
|
||||
$form['draggableviews']['handler'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Handler'),
|
||||
'#options' => $handler_options,
|
||||
'#default_value' => $this->options['draggableviews']['handler'],
|
||||
);
|
||||
|
||||
// Add handler's form element as fielset that
|
||||
// is active only if handler selected.
|
||||
foreach ($handler_forms as $handler_id => $handler_form_element) {
|
||||
// Skip empty handler's form elements.
|
||||
if (empty($handler_form_element)) {
|
||||
continue;
|
||||
}
|
||||
$form['draggableviews'][$handler_id] = array(
|
||||
'#type' => 'fieldset',
|
||||
'#title' => check_plain($form['draggableviews']['handler']['#options'][$handler_id]),
|
||||
'#collapsible' => FALSE,
|
||||
'#states' => array(
|
||||
'visible' => array(
|
||||
'select[name="options[draggableviews][handler]"]' => array('value' => $handler_id),
|
||||
),
|
||||
),
|
||||
);
|
||||
foreach ($handler_form_element as $key => $form_element) {
|
||||
$form['draggableviews'][$handler_id][$key] = $form_element;
|
||||
}
|
||||
}
|
||||
|
||||
$form['draggableviews']['save_button_label'] = array(
|
||||
'#type' => 'textfield',
|
||||
'#title' => t('Custom Save button label'),
|
||||
'#description' => t("Allow to change Save button Label."),
|
||||
'#default_value' => $this->options['draggableviews']['save_button_label'],
|
||||
);
|
||||
|
||||
$form['draggableviews']['ajax'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('Ajax'),
|
||||
'#description' => t('Use ajax in draggable form.'),
|
||||
'#default_value' => $this->options['draggableviews']['ajax'],
|
||||
);
|
||||
}
|
||||
|
||||
function render($values) {
|
||||
if (user_access('access draggableviews')) {
|
||||
return '<!--form-item-' . $this->options['id'] . '--' . $this->view->row_index . '-->';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The form which replaces the placeholder from render().
|
||||
*/
|
||||
function views_form(&$form, &$form_state) {
|
||||
// The view is empty, abort.
|
||||
if (empty($this->view->result)) {
|
||||
return;
|
||||
}
|
||||
|
||||
$form[$this->options['id']] = array(
|
||||
'#tree' => TRUE,
|
||||
);
|
||||
$range = count($this->view->result);
|
||||
// At this point, the query has already been run, so we can access the results
|
||||
// in order to get the base key value (for example, nid for nodes).
|
||||
foreach ($this->view->result as $row_index => $row) {
|
||||
$entity_id = $this->get_value($row);
|
||||
|
||||
$form[$this->options['id']][$row_index] = array(
|
||||
'#tree' => TRUE,
|
||||
);
|
||||
|
||||
$handler_object = draggableviews_get_handler_class($this->options['draggableviews']['handler']);
|
||||
|
||||
// Weight field selectbox.
|
||||
$form[$this->options['id']][$row_index]['weight'] = array(
|
||||
'#type' => 'select',
|
||||
'#options' => range(-$range, $range),
|
||||
'#attributes' => array('class' => array('draggableviews-weight')),
|
||||
'#default_value' => $handler_object->get($this, $row_index),
|
||||
);
|
||||
// Item to keep id of the entity.
|
||||
$form[$this->options['id']][$row_index]['id'] = array(
|
||||
'#type' => 'hidden',
|
||||
'#value' => $this->view->result[$row_index]->{$this->view->base_field},
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
@@ -0,0 +1,137 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Native handler sort.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Sort handler for ordering by weight.
|
||||
*/
|
||||
class draggableviews_handler_sort extends views_handler_sort {
|
||||
function query() {
|
||||
$this->ensure_my_table();
|
||||
// If new items should be placed in the bottom.
|
||||
if ($this->options['draggableviews_setting_new_items_bottom_list']) {
|
||||
// ORDER BY COALESCE(weight, 10000)
|
||||
// New items will get big default instead of NULL
|
||||
$as = $this->table_alias . '_' . $this->real_field;
|
||||
$as = $this->query->add_field($this->table_alias, $this->real_field, $as, array());
|
||||
$this->query->orderby[] = array(
|
||||
'field' => 'COALESCE(' . $as . ', 10000)',
|
||||
'direction' => drupal_strtoupper($this->options['order'])
|
||||
);
|
||||
}
|
||||
else {
|
||||
// New items will be placed at the top as have NULL value.
|
||||
$this->query->add_orderby($this->table_alias, $this->real_field);
|
||||
}
|
||||
}
|
||||
|
||||
function option_definition() {
|
||||
$options = parent::option_definition();
|
||||
|
||||
// This handler invokes few times for one view,
|
||||
// in the first time the $this->view->name is empty,
|
||||
// so we need this check.
|
||||
if (is_object($this->view)) {
|
||||
$options['draggableviews_setting_view'] = array('default' => $this->view->name);
|
||||
}
|
||||
else {
|
||||
$options['draggableviews_setting_view'] = array('default' => NULL);
|
||||
}
|
||||
|
||||
$options['draggableviews_setting_arguments'] = array('default' => 'all');
|
||||
$options['draggableviews_setting_arguments_php'] = array('default' => '');
|
||||
$options['draggableviews_setting_new_items_bottom_list'] = array('default' => TRUE);
|
||||
|
||||
return $options;
|
||||
}
|
||||
|
||||
function options_form(&$form, &$form_state) {
|
||||
parent::options_form($form, $form_state);
|
||||
$form['expose_button']['#access'] = FALSE;
|
||||
$form['order']['#description'] = t('Please remember to override settings of the sort criterion if you have display that sets weights and you choose descendling order.');
|
||||
|
||||
// Check whether current views display doesn't have draggableviews field.
|
||||
// If it has, it means that this is setting view so we should set
|
||||
// option draggableviews_setting_view to 'self'
|
||||
$view_clone = clone $this->view;
|
||||
$view_clone->build($view_clone->current_display);
|
||||
$options = 'self';
|
||||
// Check whether field exists. If not it is displaying view so lets show
|
||||
// all options of other setting views.
|
||||
if (!isset($view_clone->field['draggableviews'])) {
|
||||
// Get list of all enabled views.
|
||||
$views_list = views_get_enabled_views();
|
||||
$options = array();
|
||||
|
||||
// Convert list of objects to options for the form.
|
||||
foreach ($views_list as $view_name => $view_object) {
|
||||
foreach ($view_object->display as $display_name => $display) {
|
||||
if ($display_name == 'default') {
|
||||
continue;
|
||||
}
|
||||
// Clone view and build it so we can see all the fields.
|
||||
$view_clone = clone $view_object;
|
||||
$view_clone->build($display_name);
|
||||
|
||||
// If draggableviews field attached, show this view in options.
|
||||
if (isset($view_clone->field['draggableviews'])) {
|
||||
$options[$view_name . ':' . $display_name] = $view_object->human_name . ' (' . $display->display_title . ')';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// If it is setting view.
|
||||
if (!is_array($options)) {
|
||||
$form['order']['#access'] = FALSE;
|
||||
$form['draggableviews_setting_view'] = array(
|
||||
'#type' => 'value',
|
||||
'#value' => $this->options['draggableviews_setting_view'],
|
||||
);
|
||||
}
|
||||
else {
|
||||
$form['draggableviews_setting_view'] = array(
|
||||
'#type' => 'select',
|
||||
'#title' => t('Display sort as'),
|
||||
'#default_value' => $this->options['draggableviews_setting_view'],
|
||||
'#options' => $options,
|
||||
'#description' => t('Please choose the view and display that sets the order.')
|
||||
);
|
||||
// If there is no setting views available, show error message.
|
||||
if (empty($options)) {
|
||||
drupal_set_message(t('First you should create a view that sets sorting order.'), 'error');
|
||||
}
|
||||
}
|
||||
|
||||
$form['draggableviews_setting_arguments'] = array(
|
||||
'#title' => t('Arguments handling'),
|
||||
'#type' => 'radios',
|
||||
'#options' => array(
|
||||
'all' => t('Use all arguments'),
|
||||
'none' => t('Do not use any arguments (use empty arguments)'),
|
||||
'php' => t('Prepare arguments with PHP code'),
|
||||
),
|
||||
'#default_value' => $this->options['draggableviews_setting_arguments'],
|
||||
'#description' => t('When sorting order is saved all arguments passed are saved with order. In display view we can choose how to use these arguments.')
|
||||
);
|
||||
$form['draggableviews_setting_arguments_php'] = array(
|
||||
'#title' => t('PHP code to prepare arguments'),
|
||||
'#type' => 'textarea',
|
||||
'#default_value' => $this->options['draggableviews_setting_arguments_php'],
|
||||
'#states' => array(
|
||||
'visible' => array(
|
||||
'input[name="options[draggableviews_setting_arguments]"]' => array('value' => 'php'),
|
||||
),
|
||||
),
|
||||
);
|
||||
$form['draggableviews_setting_new_items_bottom_list'] = array(
|
||||
'#type' => 'checkbox',
|
||||
'#title' => t('New items appear bottom of the list'),
|
||||
'#description' => t('New items means elements (for example nodes) that do not have saved weight (newly created).'),
|
||||
'#default_value' => $this->options['draggableviews_setting_new_items_bottom_list'],
|
||||
);
|
||||
}
|
||||
}
|
@@ -0,0 +1,72 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Native handler join handler.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Join handler for extra join conditions.
|
||||
*/
|
||||
class draggableviews_join_handler extends views_join {
|
||||
/**
|
||||
* Build the SQL for the join this object represents.
|
||||
*/
|
||||
function build_join($select_query, $table, $view_query) {
|
||||
if (empty($this->definition['table formula'])) {
|
||||
$right_table = $this->table;
|
||||
}
|
||||
else {
|
||||
$right_table = $this->definition['table formula'];
|
||||
}
|
||||
|
||||
if ($this->left_table) {
|
||||
$left = $view_query->get_table_info($this->left_table);
|
||||
$left_field = "$left[alias].$this->left_field";
|
||||
}
|
||||
else {
|
||||
// This can be used if left_field is a formula or something. It should be used only *very* rarely.
|
||||
$left_field = $this->left_field;
|
||||
}
|
||||
|
||||
$condition = "$left_field = $table[alias].$this->field";
|
||||
|
||||
// Check whether setting view is set.
|
||||
$arguments = array();
|
||||
$weight_key = draggable_views_get_draggable_sort($view_query->view);
|
||||
if (!empty($view_query->view->sort[$weight_key]->options['draggableviews_setting_view'])) {
|
||||
$condition .= " AND $table[alias].view_name = :view_name";
|
||||
$condition .= " AND $table[alias].view_display = :view_display";
|
||||
|
||||
// If it is setting view, set current view name and display name.
|
||||
if ($view_query->view->sort[$weight_key]->options['draggableviews_setting_view'] == 'self') {
|
||||
$arguments[':view_name'] = $view_query->view->name;
|
||||
$arguments[':view_display'] = $view_query->view->current_display;
|
||||
}
|
||||
else {
|
||||
list($setting_view_name, $setting_view_display) = explode(':', $view_query->view->sort[$weight_key]->options['draggableviews_setting_view']);
|
||||
$arguments[':view_name'] = $setting_view_name;
|
||||
$arguments[':view_display'] = $setting_view_display;
|
||||
}
|
||||
|
||||
// Arguments passed to view (including exposed filters).
|
||||
$view_arguments = $view_query->view->args;
|
||||
if (isset($view_query->view->exposed_raw_input)) {
|
||||
$view_arguments += $view_query->view->exposed_raw_input;
|
||||
ksort($view_arguments);
|
||||
}
|
||||
// Alter arguments according to sort criteria settings.
|
||||
if ($view_query->view->sort[$weight_key]->options['draggableviews_setting_arguments'] == 'none') {
|
||||
$view_arguments = array();
|
||||
}
|
||||
// If PHP arguments processing is set.
|
||||
if ($view_query->view->sort[$weight_key]->options['draggableviews_setting_arguments'] == 'php') {
|
||||
$view_arguments = draggableviews_eval_return($view_query->view->sort[$weight_key]->options['draggableviews_setting_arguments_php'], $view_arguments);
|
||||
}
|
||||
$condition .= " AND $table[alias].args = :view_arguments";
|
||||
$arguments[':view_arguments'] = json_encode($view_arguments);
|
||||
}
|
||||
|
||||
$select_query->addJoin($this->type, $right_table, $table['alias'], $condition, $arguments);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user