diff --git modules/quantity/commerce_extra_quantity.info modules/quantity/commerce_extra_quantity.info
index 9833350..87d7269 100644
--- modules/quantity/commerce_extra_quantity.info
+++ modules/quantity/commerce_extra_quantity.info
@@ -1,7 +1,10 @@
name = Commerce Extra Quantity
-description = Wraps quantity fields with - and + links to decrease or increase quantity.
-package = Commerce Extra
+description = Wraps quantity fields with - and + links to decrease or increase quantity.
+package = Commerce Extra
core = 7.x
dependencies[] = commerce_extra
dependencies[] = commerce_cart
+
+; Views handlers
+files[] = includes/views/handlers/commerce_line_item_handler_field_quantity_plusminus.inc
diff --git modules/quantity/commerce_extra_quantity.module modules/quantity/commerce_extra_quantity.module
index a07bb43..fa08b4f 100644
--- modules/quantity/commerce_extra_quantity.module
+++ modules/quantity/commerce_extra_quantity.module
@@ -43,34 +43,31 @@ function commerce_extra_quantity_commerce_extra_configure_submit(&$form, &$form_
* Adds additional theme wrappers for add to cart's quantity textfields.
*/
function commerce_extra_quantity_form_alter(&$form, &$form_state, $form_id) {
-
- // Load quantity cardinality setting
- $quantity_cardinality = variable_get('commerce_extra_quantity_cardinality', 1);
-
// Add to cart form from field api
$str = 'commerce_cart_add_to_cart_form_';
if (drupal_substr($form_id, 0, drupal_strlen($str)) == $str) {
if (isset($form['quantity']) && $form['quantity']['#type'] == 'textfield') {
- $form['#attached']['js'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/commerce_extra_quantity.js';
- $form['#attached']['css'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/commerce_extra_quantity.css';
- $form['quantity']['#theme_wrappers'] = array('quantity_plusminus_wrapper', 'form_element');
- $form['quantity']['#amount'] = $quantity_cardinality;
- $form['#validate'][] = 'commerce_extra_quantity_validate_cardinality';
- }
- }
-
- // Quantity fields from views
- if ($form_id == 'views_form_commerce_cart_form_default') {
- if (isset($form['edit_quantity'])) {
- $form['#attached']['js'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/commerce_extra_quantity.js';
- $form['#attached']['css'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/commerce_extra_quantity.css';
- foreach ($form['edit_quantity'] as $key => $value) {
- if (is_numeric($key) && drupal_substr($key, 0, 1) != '#' && is_array($value)) {
- $form['edit_quantity'][$key]['#theme_wrappers'] = array('quantity_plusminus_wrapper', 'form_element');
- $form['edit_quantity'][$key]['#amount'] = $quantity_cardinality;
+ $quantity_cardinality = NULL;
+ // Use field formatter alter if Field formatter settings module enabled.
+ if (module_exists('field_formatter_settings')) {
+ $field_context = $form_state['context'];
+ $instance = field_info_instance($field_context['entity_type'], $field_context['field'], $field_context['bundle']);
+ $entity = reset(entity_load($field_context['entity_type'], array($field_context['entity_id'])));
+ $field_instance_display = field_get_display($instance, $field_context['view_mode'], $entity);
+ if (!empty($field_instance_display['settings']['quantity_extra_plusminus'])) {
+ $quantity_cardinality = $field_instance_display['settings']['quantity_extra_plusminus_cardinality'];
}
}
- $form['#validate'][] = 'commerce_extra_quantity_validate_cardinality';
+ else {
+ $quantity_cardinality = variable_get('commerce_extra_quantity_cardinality', '1');
+ }
+ if (!empty($quantity_cardinality)) {
+ $form['#attached']['js'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/js/commerce_line_item_quantity_plusminus.js';
+ $form['#attached']['css'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/css/commerce_line_item_quantity_plusminus.css';
+ $form['quantity']['#theme_wrappers'] = array('commerce_line_item_quantity_plusminus_wrapper', 'form_element');
+ $form['quantity']['#amount'] = $quantity_cardinality;
+ $form['#validate'][] = 'commerce_extra_quantity_validate_cardinality';
+ }
}
}
@@ -104,14 +101,24 @@ function commerce_extra_quantity_validate_cardinality(&$form, &$form_state) {
}
/**
+ * Implements hook_views_api().
+ */
+function commerce_extra_quantity_views_api() {
+ return array(
+ 'api' => 3,
+ 'path' => drupal_get_path('module', 'commerce_extra_quantity') . '/includes/views',
+ );
+}
+
+/**
* Implements hook_theme().
*/
function commerce_extra_quantity_theme($existing, $type, $theme, $path) {
return array(
- 'quantity_plusminus_wrapper' => array(
+ 'commerce_line_item_quantity_plusminus_wrapper' => array(
'render element' => 'form',
),
- 'quantity_plusminus_link' => array(
+ 'commerce_line_item_quantity_plusminus_link' => array(
'variables' => array('way' => NULL, 'quantity' => NULL, 'quantity_input_element' => NULL),
),
);
@@ -120,27 +127,27 @@ function commerce_extra_quantity_theme($existing, $type, $theme, $path) {
/**
* Returns HTML for quantity textfield having links wrapping the textfield.
*/
-function theme_quantity_plusminus_wrapper($variables) {
+function theme_commerce_line_item_quantity_plusminus_wrapper($variables) {
$amount = isset($variables['form']['#amount']) ? $variables['form']['#amount'] : 1;
- $decrease = theme('quantity_plusminus_link', array('way' => COMMERCE_EXTRA_QUANTITY_DECREASE, 'quantity' => $variables['form']['#value'], 'quantity_input_element' => $variables['form']['#id'], 'amount' => $amount));
- $increase = theme('quantity_plusminus_link', array('way' => COMMERCE_EXTRA_QUANTITY_INCREASE, 'quantity' => $variables['form']['#value'], 'quantity_input_element' => $variables['form']['#id'], 'amount' => $amount));
+ $decrease = theme('commerce_line_item_quantity_plusminus_link', array('way' => COMMERCE_EXTRA_QUANTITY_DECREASE, 'quantity' => $variables['form']['#value'], 'quantity_input_element' => $variables['form']['#id'], 'amount' => $amount));
+ $increase = theme('commerce_line_item_quantity_plusminus_link', array('way' => COMMERCE_EXTRA_QUANTITY_INCREASE, 'quantity' => $variables['form']['#value'], 'quantity_input_element' => $variables['form']['#id'], 'amount' => $amount));
return $decrease . $variables['form']['#children'] . $increase;
}
/**
* Returns HTML for link which increases/decreases quantity value.
*/
-function theme_quantity_plusminus_link($variables) {
+function theme_commerce_line_item_quantity_plusminus_link($variables) {
switch ($variables['way']) {
case COMMERCE_EXTRA_QUANTITY_DECREASE:
$text = '-';
$class = 'commerce-quantity-plusminus-link-decrease';
- $js_callback = "Drupal.commerce_extra_quantity_quantity('#" . $variables['quantity_input_element'] . "', " . $variables['way'] . ", " . $variables['amount'] . ")";
+ $js_callback = "Drupal.commerce_line_item_quantity_plusminus('#" . $variables['quantity_input_element'] . "', " . $variables['way'] . ", " . $variables['amount'] . ")";
break;
case COMMERCE_EXTRA_QUANTITY_INCREASE:
$text = '+';
$class = 'commerce-quantity-plusminus-link-increase';
- $js_callback = "Drupal.commerce_extra_quantity_quantity('#" . $variables['quantity_input_element'] . "', " . $variables['way'] . ", " . $variables['amount'] . ")";
+ $js_callback = "Drupal.commerce_line_item_quantity_plusminus('#" . $variables['quantity_input_element'] . "', " . $variables['way'] . ", " . $variables['amount'] . ")";
break;
}
if ($variables['quantity'] <= 1) {
@@ -160,3 +167,66 @@ function theme_quantity_plusminus_link($variables) {
);
return render($element);
}
+/**
+ * Implementation for hook_field_widget_info_alter.
+ * Add new settings to the quantity formatter.
+ */
+function commerce_extra_quantity_field_formatter_info_alter(&$info) {
+ if (isset($info['date_default'])) {
+ $info['commerce_cart_add_to_cart_form']['settings']['quantity_extra_plusminus'] = FALSE;
+ $info['commerce_cart_add_to_cart_form']['settings']['quantity_extra_plusminus_cardinality'] = NULL;
+ }
+}
+
+/**
+ * Implements hook_field_formatter_settings_summary_alter().
+ */
+function commerce_extra_quantity_field_formatter_settings_summary_alter(&$summary, $context) {
+ $display = $context['instance']['display'][$context['view_mode']];
+ $settings = $display['settings'];
+ if (isset($settings['quantity_extra_plusminus'])) {
+ if (empty($settings['quantity_extra_plusminus'])) {
+ $summary .= '
' . t('Commerce Extra') . ': +/- ' . t('not enabled.');
+ }
+ else {
+ $summary .= '
' . t('Commerce Extra Quantity') . ': +/- ' . t('enabled.') . ' ' . t('Cardinality') . ': ' . $settings['quantity_extra_plusminus_cardinality'] . '.';
+ }
+ }
+}
+
+/**
+ * Implements hook_field_formatter_settings_form_alter().
+ */
+function commerce_extra_quantity_field_formatter_settings_form_alter(&$settings_form, $context) {
+ $display = $context['instance']['display'][$context['view_mode']];
+ $settings = $display['settings'];
+ if ($display['type'] == 'commerce_cart_add_to_cart_form') {
+ $settings_form['show_quantity']['#weight'] = -100;
+ $settings_form['quantity_extra_plusminus'] = array(
+ '#type' => 'checkbox',
+ '#title' => t('Add +/- buttons to increase/decrease the quantity value.'),
+ '#default_value' => $settings['quantity_extra_plusminus'],
+ '#weight' => -99,
+ '#states' => array(
+ // Hide the settings when the select checkbox is disabled.
+ 'invisible' => array(
+ ':input[name="fields[field_product][settings_edit_form][settings][show_quantity]"]' => array('checked' => FALSE),
+ ),
+ ),
+ );
+ $settings_form['quantity_extra_plusminus_cardinality'] = array(
+ '#type' => 'textfield',
+ '#title' => t('Quantity cardinality'),
+ '#dscription' => t('You can change quantity cardinality for quantity widget.'),
+ '#default_value' => $settings['quantity_extra_plusminus_cardinality'],
+ '#weight' => -98,
+ '#size' => 3,
+ '#states' => array(
+ // Hide the settings when the select checkbox is disabled.
+ 'invisible' => array(
+ ':input[name="fields[field_product][settings_edit_form][settings][quantity_extra_plusminus]"]' => array('checked' => FALSE),
+ ),
+ ),
+ );
+ }
+}
diff --git modules/quantity/css/commerce_line_item_quantity_plusminus.css modules/quantity/css/commerce_line_item_quantity_plusminus.css
new file mode 100644
index 0000000..94b9caa
--- /dev/null
+++ modules/quantity/css/commerce_line_item_quantity_plusminus.css
@@ -0,0 +1,26 @@
+.commerce-quantity-plusminus-link a.button {
+ font-weight: bold;
+ text-align: center;
+ margin-bottom: 1em;
+ margin-right:0;
+ padding: 4px 7px;
+}
+.commerce-quantity-plusminus-link a.button:hover {
+ text-decoration: none;
+ background: #dedede;
+ color: #3a3a3a;
+}
+.commerce-quantity-plusminus-link.commerce-quantity-plusminus-link-decrease a {
+ border-right: none;
+ -khtml-border-radius: 10px 0px 0px 10px;
+ -moz-border-radius: 15px 0px 0px 15px;
+ -webkit-border-radius: 10px 0px 0px 10px;
+ border-radius: 10px 0px 0px 10px;
+}
+.commerce-quantity-plusminus-link.commerce-quantity-plusminus-link-increase a {
+ border-left: none;
+ -khtml-border-radius: 0px 10px 10px 0px;
+ -moz-border-radius: 0px 15px 15px 0px;
+ -webkit-border-radius: 0px 10px 10px 0px;
+ border-radius: 0px 10px 10px 0px;
+}
diff --git modules/quantity/includes/views/commerce_extra_quantity.views.inc modules/quantity/includes/views/commerce_extra_quantity.views.inc
new file mode 100644
index 0000000..28009e6
--- /dev/null
+++ modules/quantity/includes/views/commerce_extra_quantity.views.inc
@@ -0,0 +1,23 @@
+ array(
+ 'title' => t('Quantity edit with +/- buttons'),
+ 'help' => t('Adds a text field to edit the line item quantity in the View with extra +/- increase/decrease option.'),
+ 'handler' => 'commerce_line_item_handler_field_quantity_plusminus',
+ ),
+ );
+
+ return $data;
+}
diff --git modules/quantity/includes/views/commerce_extra_quantity.views_default.inc modules/quantity/includes/views/commerce_extra_quantity.views_default.inc
new file mode 100644
index 0000000..c8e103f
--- /dev/null
+++ modules/quantity/includes/views/commerce_extra_quantity.views_default.inc
@@ -0,0 +1,175 @@
+name = 'commerce_extra_quantity_shopping_cart_form';
+ $view->description = 'Display a shopping cart update form.';
+ $view->tag = 'commerce';
+ $view->base_table = 'commerce_order';
+ $view->human_name = 'Commerce Extra Quantity Shopping cart form';
+ $view->core = 0;
+ $view->api_version = '3.0';
+ $view->disabled = FALSE; /* Edit this to true to make a default view disabled initially */
+
+ /* Display: Defaults */
+ $handler = $view->new_display('default', 'Defaults', 'default');
+ $handler->display->display_options['title'] = 'Shopping cart';
+ $handler->display->display_options['use_more_always'] = FALSE;
+ $handler->display->display_options['access']['type'] = 'none';
+ $handler->display->display_options['cache']['type'] = 'none';
+ $handler->display->display_options['query']['type'] = 'views_query';
+ $handler->display->display_options['query']['options']['query_comment'] = FALSE;
+ $handler->display->display_options['exposed_form']['type'] = 'basic';
+ $handler->display->display_options['pager']['type'] = 'none';
+ $handler->display->display_options['style_plugin'] = 'table';
+ $handler->display->display_options['style_options']['columns'] = array(
+ 'commerce_display_path' => 'commerce_display_path',
+ 'line_item_title' => 'line_item_title',
+ 'commerce_unit_price' => 'commerce_unit_price',
+ 'edit_quantity' => 'edit_quantity',
+ 'edit_delete' => 'edit_delete',
+ 'commerce_total' => 'commerce_total',
+ );
+ $handler->display->display_options['style_options']['default'] = '-1';
+ $handler->display->display_options['style_options']['info'] = array(
+ 'commerce_display_path' => array(
+ 'sortable' => 0,
+ 'default_sort_order' => 'asc',
+ 'align' => '',
+ 'separator' => '',
+ ),
+ 'line_item_title' => array(
+ 'align' => '',
+ 'separator' => '',
+ ),
+ 'commerce_unit_price' => array(
+ 'sortable' => 0,
+ 'default_sort_order' => 'asc',
+ 'align' => '',
+ 'separator' => '',
+ ),
+ 'edit_quantity' => array(
+ 'align' => '',
+ 'separator' => '',
+ ),
+ 'edit_delete' => array(
+ 'align' => '',
+ 'separator' => '',
+ ),
+ 'commerce_total' => array(
+ 'sortable' => 0,
+ 'default_sort_order' => 'asc',
+ 'align' => '',
+ 'separator' => '',
+ ),
+ );
+ /* Footer: Commerce Line Item: Line item summary */
+ $handler->display->display_options['footer']['line_item_summary']['id'] = 'line_item_summary';
+ $handler->display->display_options['footer']['line_item_summary']['table'] = 'commerce_line_item';
+ $handler->display->display_options['footer']['line_item_summary']['field'] = 'line_item_summary';
+ $handler->display->display_options['footer']['line_item_summary']['label'] = 'Cart summary';
+ $handler->display->display_options['footer']['line_item_summary']['info'] = array(
+ 'quantity' => 0,
+ 'total' => 'total',
+ );
+ /* Relationship: Commerce Order: Referenced line items */
+ $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['id'] = 'commerce_line_items_line_item_id';
+ $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['table'] = 'field_data_commerce_line_items';
+ $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['field'] = 'commerce_line_items_line_item_id';
+ $handler->display->display_options['relationships']['commerce_line_items_line_item_id']['required'] = TRUE;
+ /* Field: Commerce Line item: Display path */
+ $handler->display->display_options['fields']['commerce_display_path']['id'] = 'commerce_display_path';
+ $handler->display->display_options['fields']['commerce_display_path']['table'] = 'field_data_commerce_display_path';
+ $handler->display->display_options['fields']['commerce_display_path']['field'] = 'commerce_display_path';
+ $handler->display->display_options['fields']['commerce_display_path']['relationship'] = 'commerce_line_items_line_item_id';
+ $handler->display->display_options['fields']['commerce_display_path']['label'] = '';
+ $handler->display->display_options['fields']['commerce_display_path']['exclude'] = TRUE;
+ /* Field: Commerce Line Item: Title */
+ $handler->display->display_options['fields']['line_item_title']['id'] = 'line_item_title';
+ $handler->display->display_options['fields']['line_item_title']['table'] = 'commerce_line_item';
+ $handler->display->display_options['fields']['line_item_title']['field'] = 'line_item_title';
+ $handler->display->display_options['fields']['line_item_title']['relationship'] = 'commerce_line_items_line_item_id';
+ $handler->display->display_options['fields']['line_item_title']['label'] = 'Product';
+ $handler->display->display_options['fields']['line_item_title']['alter']['make_link'] = TRUE;
+ $handler->display->display_options['fields']['line_item_title']['alter']['path'] = '[commerce_display_path]';
+ /* Field: Commerce Line item: Unit price */
+ $handler->display->display_options['fields']['commerce_unit_price']['id'] = 'commerce_unit_price';
+ $handler->display->display_options['fields']['commerce_unit_price']['table'] = 'field_data_commerce_unit_price';
+ $handler->display->display_options['fields']['commerce_unit_price']['field'] = 'commerce_unit_price';
+ $handler->display->display_options['fields']['commerce_unit_price']['relationship'] = 'commerce_line_items_line_item_id';
+ $handler->display->display_options['fields']['commerce_unit_price']['label'] = 'Price';
+ $handler->display->display_options['fields']['commerce_unit_price']['element_class'] = 'price';
+ $handler->display->display_options['fields']['commerce_unit_price']['click_sort_column'] = 'amount';
+ /* Field: Commerce Line Item: Quantity edit with +/- buttons */
+ $handler->display->display_options['fields']['quantity_plusminus']['id'] = 'quantity_plusminus';
+ $handler->display->display_options['fields']['quantity_plusminus']['table'] = 'commerce_line_item';
+ $handler->display->display_options['fields']['quantity_plusminus']['field'] = 'quantity_plusminus';
+ $handler->display->display_options['fields']['quantity_plusminus']['relationship'] = 'commerce_line_items_line_item_id';
+ $handler->display->display_options['fields']['quantity_plusminus']['label'] = 'Quantity';
+ /* Field: Commerce Line Item: Delete button */
+ $handler->display->display_options['fields']['edit_delete']['id'] = 'edit_delete';
+ $handler->display->display_options['fields']['edit_delete']['table'] = 'commerce_line_item';
+ $handler->display->display_options['fields']['edit_delete']['field'] = 'edit_delete';
+ $handler->display->display_options['fields']['edit_delete']['relationship'] = 'commerce_line_items_line_item_id';
+ $handler->display->display_options['fields']['edit_delete']['label'] = 'Remove';
+ /* Field: Commerce Line item: Total */
+ $handler->display->display_options['fields']['commerce_total']['id'] = 'commerce_total';
+ $handler->display->display_options['fields']['commerce_total']['table'] = 'field_data_commerce_total';
+ $handler->display->display_options['fields']['commerce_total']['field'] = 'commerce_total';
+ $handler->display->display_options['fields']['commerce_total']['relationship'] = 'commerce_line_items_line_item_id';
+ $handler->display->display_options['fields']['commerce_total']['element_class'] = 'price';
+ $handler->display->display_options['fields']['commerce_total']['click_sort_column'] = 'amount';
+ /* Sort criterion: Commerce Line Item: Line item ID */
+ $handler->display->display_options['sorts']['line_item_id']['id'] = 'line_item_id';
+ $handler->display->display_options['sorts']['line_item_id']['table'] = 'commerce_line_item';
+ $handler->display->display_options['sorts']['line_item_id']['field'] = 'line_item_id';
+ $handler->display->display_options['sorts']['line_item_id']['relationship'] = 'commerce_line_items_line_item_id';
+ /* Contextual filter: Commerce Order: Order ID */
+ $handler->display->display_options['arguments']['order_id']['id'] = 'order_id';
+ $handler->display->display_options['arguments']['order_id']['table'] = 'commerce_order';
+ $handler->display->display_options['arguments']['order_id']['field'] = 'order_id';
+ $handler->display->display_options['arguments']['order_id']['default_action'] = 'empty';
+ $handler->display->display_options['arguments']['order_id']['default_argument_type'] = 'fixed';
+ $handler->display->display_options['arguments']['order_id']['summary']['number_of_records'] = '0';
+ $handler->display->display_options['arguments']['order_id']['summary']['format'] = 'default_summary';
+ $handler->display->display_options['arguments']['order_id']['summary_options']['items_per_page'] = '25';
+ /* Filter criterion: Commerce Line Item: Line item is of a product line item type */
+ $handler->display->display_options['filters']['product_line_item_type']['id'] = 'product_line_item_type';
+ $handler->display->display_options['filters']['product_line_item_type']['table'] = 'commerce_line_item';
+ $handler->display->display_options['filters']['product_line_item_type']['field'] = 'product_line_item_type';
+ $handler->display->display_options['filters']['product_line_item_type']['relationship'] = 'commerce_line_items_line_item_id';
+ $handler->display->display_options['filters']['product_line_item_type']['value'] = '1';
+ $handler->display->display_options['filters']['product_line_item_type']['group'] = 0;
+ $translatables['commerce_extra_quantity_shopping_cart_form'] = array(
+ t('Defaults'),
+ t('Shopping cart'),
+ t('more'),
+ t('Apply'),
+ t('Reset'),
+ t('Sort by'),
+ t('Asc'),
+ t('Desc'),
+ t('Cart summary'),
+ t('Line items referenced by commerce_line_items'),
+ t('Product'),
+ t('Price'),
+ t('Quantity'),
+ t('Remove'),
+ t('Total'),
+ t('All'),
+ );
+
+ $views[$view->name] = $view;
+
+ return $views;
+}
diff --git modules/quantity/includes/views/handlers/commerce_line_item_handler_field_quantity_plusminus.inc modules/quantity/includes/views/handlers/commerce_line_item_handler_field_quantity_plusminus.inc
new file mode 100644
index 0000000..37f05de
--- /dev/null
+++ modules/quantity/includes/views/handlers/commerce_line_item_handler_field_quantity_plusminus.inc
@@ -0,0 +1,155 @@
+additional_fields['line_item_id'] = 'line_item_id';
+ $this->additional_fields['quantity'] = 'quantity';
+
+ // Set real_field in order to make it generate a field_alias.
+ $this->real_field = 'quantity';
+ }
+
+ function option_definition() {
+ $options = parent::option_definition();
+
+ $options['quantity_cardinality'] = 1;
+
+ return $options;
+ }
+
+ function options_form(&$form, &$form_state) {
+ parent::options_form($form, $form_state);
+
+ $form['quantity_cardinality'] = array(
+ '#type' => 'textfield',
+ '#title' => t('Quantity cardinality'),
+ '#description' => t('You can change quantity cardinality for quantity widget.'),
+ '#size' => 3,
+ '#default_value' => $this->options['quantity_cardinality'],
+ '#element_validate' => array('element_validate_number'),
+ );
+ }
+
+ function render($values) {
+ return '';
+ }
+
+ /**
+ * Returns 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,
+ );
+ $form['#attached']['js'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/js/commerce_line_item_quantity_plusminus.js';
+ $form['#attached']['css'][] = drupal_get_path('module', 'commerce_extra_quantity') . '/css/commerce_line_item_quantity_plusminus.css';
+
+ // 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_id => $row) {
+ $line_item_id = $this->get_value($row, 'line_item_id');
+ $quantity = $this->get_value($row, 'quantity');
+
+ $form[$this->options['id']][$row_id] = array(
+ '#type' => 'textfield',
+ '#datatype' => 'integer',
+ '#default_value' => round($quantity),
+ '#size' => 4,
+ '#maxlength' => max(4, strlen($quantity)),
+ '#line_item_id' => $line_item_id,
+ '#attributes' => array(
+ 'title' => $this->options['label'],
+ ),
+ '#theme_wrappers' => array('commerce_line_item_quantity_plusminus_wrapper', 'form_element'),
+ '#amount' => $this->options['quantity_cardinality'],
+ );
+ }
+ }
+
+ function views_form_validate($form, &$form_state) {
+ $field_name = $this->options['id'];
+ foreach (element_children($form[$field_name]) as $row_id) {
+ // Ensure the quantity is actually a numeric value.
+ $line_item_id = $form[$field_name][$row_id]['#line_item_id'];
+ if (!is_numeric($form_state['values'][$field_name][$row_id]) || $form_state['values'][$field_name][$row_id] < 0) {
+ form_set_error($field_name . '][' . $row_id, t('You must specify a positive number for the quantity'));
+ }
+
+ // If the custom data type attribute of the quantity element is integer,
+ // ensure we only accept whole number values.
+ if ($form[$field_name][$row_id]['#datatype'] == 'integer' &&
+ (int) $form_state['values'][$field_name][$row_id] != $form_state['values'][$field_name][$row_id]) {
+ form_set_error($field_name . '][' . $row_id, t('You must specify a whole number for the quantity.'));
+ }
+
+ // Not sure about this validation.
+ /*
+ if (($form_state['values'][$field_name][$row_id] % $this->options['quantity_cardinality'])) {
+ // Quantity is not divisible by quantity cardinality
+ form_set_error('', t('Incorrect quantity level.'));
+ watchdog('commerce_extra_quantity', 'Tried to submit a form with incorrect quantity level @quantity when having quantity cardinality of @quantity_cardinality', array('@quantity' => $form_state['values'][$field_name][$row_id], '@quantity_cardinality' => $this->options['quantity_cardinality']), WATCHDOG_ERROR);
+
+ }
+ */
+ }
+ }
+
+ function views_form_submit($form, &$form_state) {
+ $field_name = $this->options['id'];
+ $deleted_line_items = array();
+ $updated_line_items = array();
+
+ foreach (element_children($form[$field_name]) as $row_id) {
+ $line_item_id = $form[$field_name][$row_id]['#line_item_id'];
+
+ // If the line item hasn't been deleted...
+ if ($line_item = commerce_line_item_load($line_item_id)) {
+ $form_quantity = $form_state['values'][$field_name][$row_id];
+
+ // If the quantity on the form is different...
+ if ($form_quantity != $line_item->quantity) {
+ // If the quantity specified is 0, flag the line item for deletion.
+ if ($form_quantity == 0) {
+ $deleted_line_items[] = $line_item_id;
+ }
+ else {
+ // Otherwise queue the line item quantity update.
+ $updated_line_items[$line_item_id] = $form_quantity;
+ }
+ }
+ }
+ }
+
+ // Process the deletes first.
+ foreach ($deleted_line_items as $line_item_id) {
+ $order = commerce_order_load($form_state['order']->order_id);
+ commerce_cart_order_product_line_item_delete($order, $line_item_id);
+ }
+
+ // Then process the quantity updates.
+ foreach ($updated_line_items as $line_item_id => $quantity) {
+ // Load the line item and update it.
+ $line_item = commerce_line_item_load($line_item_id);
+ $line_item->quantity = $quantity;
+ commerce_line_item_save($line_item);
+ entity_get_controller('commerce_line_item')->resetCache(array($line_item->line_item_id));
+ }
+ }
+}
diff --git modules/quantity/js/commerce_line_item_quantity_plusminus.js modules/quantity/js/commerce_line_item_quantity_plusminus.js
new file mode 100644
index 0000000..85b561f
--- /dev/null
+++ modules/quantity/js/commerce_line_item_quantity_plusminus.js
@@ -0,0 +1,35 @@
+(function ($) {
+
+ // Increase/decrease quantity
+ Drupal.commerce_line_item_quantity_plusminus = function(selector, way, amount) {
+
+ // Find out current quantity and figure out new one
+ var quantity = parseFloat($(selector).val());
+ if (way == 1) {
+ // Increase
+ var new_quantity = quantity+amount;
+ }
+ else if (way == -1) {
+ // Decrease
+ var new_quantity = quantity-amount;
+ }
+ else {
+ var new_quantity = quantity;
+ }
+
+ // Set new quantity
+ if (new_quantity >= 1) {
+ $(selector).val(new_quantity);
+ }
+
+ // Set disabled class depending on new quantity
+ if (new_quantity <= 1) {
+ $(selector).prev('span').addClass('commerce-quantity-plusminus-link-disabled');
+ }
+ else {
+ $(selector).prev('span').removeClass('commerce-quantity-plusminus-link-disabled');
+ }
+
+ }
+
+}(jQuery));