first import

This commit is contained in:
Bachir Soussi Chiadmi
2015-04-08 11:40:19 +02:00
commit 1bc61b12ad
8435 changed files with 1582817 additions and 0 deletions

View File

@@ -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',
);
}
}
}

View File

@@ -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},
);
}
}
}

View File

@@ -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'],
);
}
}

View File

@@ -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);
}
}