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_cart_form_commerce_extra_quantity'; + $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_cart_form_commerce_extra_quantity'] = 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(implode('][', $form[$field_name][$row_id]['#parents'], 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(implode('][', $form[$field_name][$row_id]['#parents'], 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(implode('][', $form[$field_name][$row_id]['#parents'], 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));