You are here

function commerce_option_add_to_cart_submit in Commerce Product Option 7.2

Same name and namespace in other branches
  1. 7 option_set_reference/commerce_option_set_reference.module \commerce_option_add_to_cart_submit()

Cart submit callback function. This is required to create / update the option related to the line item.

Parameters

$form Form array:

$form_state The form state array.:

Return value

void

1 string reference to 'commerce_option_add_to_cart_submit'
commerce_option_form_alter in ./commerce_option.module
Implements hook_form_alter().

File

./commerce_option.module, line 604

Code

function commerce_option_add_to_cart_submit($form, $form_state) {

  // Get current product, taking into account different Commerce versions behavior.
  if (isset($form_state['default_product'])) {
    $product_id = $form_state['default_product']->product_id;
  }
  elseif (isset($form_state['default_product_id'])) {
    $product_id = $form_state['default_product_id'];
  }
  elseif (isset($form_state['products'])) {
    $current_product = reset($form_state['products']);
    $product_id = $current_product->product_id;
  }
  else {
    return;
  }
  $current_product = commerce_product_load($product_id);

  // Iterates the fields of this product. We search for entity reference fields
  // to a commerce option set.
  foreach ($current_product as $field_name => $field) {
    $field_info = field_info_field($field_name);
    if ($field_info['type'] != 'entityreference' || !isset($field_info['settings']['target_type']) || $field_info['settings']['target_type'] != 'commerce_option_set') {
      continue;
    }
    $lang_code = field_language('commerce_product', $current_product, $field_name);
    if (!isset($field[$lang_code])) {
      continue;
    }
    foreach ($field[$lang_code] as $delta => $set_id) {
      $option = $form_state['commerce_option'][$field_name][$delta]['option'];

      // Notify field widgets and populate option with values.
      field_attach_submit('commerce_option', $option, $form[$field_name][$delta], $form_state);

      // Check if our option is empty. If yes we shouldn't save anything.
      // Cannot use field_get_items() because it calls field_language().
      $option_extracted = commerce_option_get_valuables($option);
      $ow = entity_metadata_wrapper('commerce_option', $option);
      $empty = TRUE;
      foreach (array_keys($option_extracted) as $option_field) {
        $value = $ow->{$option_field}
          ->value();
        if (!empty($value)) {
          $empty = FALSE;
          break;
        }
      }
      if ($empty) {
        continue;
      }
      $line_item_id = $form_state['line_item']->line_item_id;
      $product_id = $current_product->product_id;
      $match = FALSE;

      // Check if the newly created options exist on this line item already.
      // If yes we needn't save anything, commerce will just increase the
      // quantity.
      $query = db_select('commerce_option', 'co')
        ->fields('co', array(
        'option_id',
      ))
        ->condition('line_item_id', $line_item_id, '=')
        ->condition('product_id', $product_id, '=');
      $result = $query
        ->execute()
        ->fetchCol();
      if (!empty($result)) {
        $commerce_option_entities = commerce_option_load_multiple($result);
        $option_extracted = serialize($option_extracted);
        foreach ($commerce_option_entities as $commerce_option) {
          $commerce_option_extracted = commerce_option_get_valuables($commerce_option);
          $commerce_option_extracted = serialize($commerce_option_extracted);
          if ($commerce_option_extracted == $option_extracted) {
            $match = TRUE;
            break;
          }
        }
      }
      if ($match) {
        continue;
      }
      $option->line_item_id = $line_item_id;
      $option->product_id = $product_id;

      // Save the option.
      commerce_option_save($option);
    }
  }
}