function commerce_option_add_to_cart_submit in Commerce Product Option 7.2
Same name and namespace in other branches
- 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);
}
}
}