View source
<?php
function commerce_option_views_api($module = NULL, $api = NULL) {
return array(
"api" => "3.0",
);
}
function commerce_option_menu() {
$items['admin/commerce/products/option-sets/%commerce_option_set/delete'] = array(
'title' => 'Delete commerce option set',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'commerce_option_set_delete_confirm',
4,
),
'access arguments' => array(
'administer option sets',
),
'type' => MENU_CALLBACK,
'file' => 'commerce_option.admin.inc',
);
$items['admin/commerce/products/options/%commerce_option/delete'] = array(
'title' => 'Delete commerce option',
'page callback' => 'drupal_get_form',
'page arguments' => array(
'commerce_option_delete_confirm',
4,
),
'access arguments' => array(
'administer options',
),
'type' => MENU_CALLBACK,
'file' => 'commerce_option.admin.inc',
);
return $items;
}
function commerce_option_menu_alter(&$items) {
$items['admin/commerce/products/option-sets']['type'] = MENU_LOCAL_TASK;
$items['admin/commerce/products/option-sets']['title'] = t('Option sets');
$items['admin/commerce/orders/options']['type'] = MENU_LOCAL_TASK;
$items['admin/commerce/orders/options']['title'] = t('Options');
}
function commerce_option_entity_info() {
$return = array();
$return['commerce_option'] = array(
'label' => t('Commerce Option'),
'entity class' => 'Entity',
'controller class' => 'EntityAPIController',
'views controller class' => 'EntityDefaultViewsController',
'base table' => 'commerce_option',
'fieldable' => TRUE,
'load hook' => 'commerce_option_load',
'entity keys' => array(
'id' => 'option_id',
'bundle' => 'set_id',
'label' => 'set_id',
),
'access callback' => 'commerce_option_set_access',
'creation callback' => 'commerce_option_new',
'module' => 'commerce_option',
'bundle keys' => array(
'bundle' => 'set_id',
),
'bundles' => array(),
'view modes' => array(
'full' => array(
'label' => t('Full content'),
'custom settings' => FALSE,
),
),
'admin ui' => array(
'path' => 'admin/commerce/orders/options',
'file' => 'commerce_option.admin.inc',
'controller class' => 'CommerceOptionUIController',
),
);
$return['commerce_option_set'] = array(
'label' => t('Commerce Option Set'),
'entity class' => 'Entity',
'controller class' => 'EntityAPIControllerExportable',
'views controller class' => 'EntityDefaultViewsController',
'base table' => 'commerce_option_set',
'exportable' => TRUE,
'fieldable' => FALSE,
'load hook' => 'commerce_option_set_load',
'entity keys' => array(
'id' => 'option_set_id',
'label' => 'name',
'name' => 'set_id',
),
'deletion callback' => 'commerce_option_set_delete',
'bundle of' => 'commerce_option',
'access callback' => 'commerce_option_set_access',
'module' => 'commerce_option',
'bundles' => array(),
'admin ui' => array(
'path' => 'admin/commerce/products/option-sets',
'file' => 'commerce_option.admin.inc',
),
);
return $return;
}
function commerce_option_entity_property_info() {
$info = array();
$info['commerce_option']['properties'] = array(
'option_id' => array(
'type' => 'integer',
'label' => t('Option id'),
'schema field' => 'option_id',
),
'set_id' => array(
'type' => 'text',
'label' => t('Set id'),
'schema field' => 'set_id',
'setter callback' => 'entity_property_verbatim_set',
'required' => TRUE,
),
'product_id' => array(
'type' => 'integer',
'label' => t('Product id'),
'schema field' => 'product_id',
'required' => TRUE,
),
'line_item_id' => array(
'type' => 'integer',
'label' => t('Line item id'),
'schema_field' => 'line_item_id',
'setter callback' => 'entity_property_verbatim_set',
'required' => TRUE,
),
'created' => array(
'type' => 'date',
'label' => t('Created date'),
'schema_field' => 'created',
'setter callback' => 'entity_property_verbatim_set',
),
'changed' => array(
'type' => 'date',
'label' => t('Changed date'),
'schema_field' => 'changed',
'setter callback' => 'entity_property_verbatim_set',
),
);
$info['commerce_option_set']['properties'] = array(
'option_set_id' => array(
'type' => 'integer',
'label' => t('Option set id'),
'schema field' => 'option_set_id',
'required' => TRUE,
),
'set_id' => array(
'type' => 'text',
'label' => t('Machine name'),
'schema field' => 'set_id',
'required' => TRUE,
),
'name' => array(
'type' => 'text',
'label' => t('Human-readable name'),
'schema field' => 'name',
'required' => TRUE,
),
);
return $info;
}
function commerce_option_entity_property_info_alter(&$info) {
foreach (commerce_option_set_load_multiple(FALSE) as $option_set) {
$info['commerce_line_item']['properties'][$option_set->set_id] = array(
'label' => $option_set->name,
'type' => 'text',
'description' => t('A serialized array of all the fields defined in this option.'),
);
}
}
function commerce_option_entity_info_alter(&$entity_info) {
foreach (commerce_option_set_load_multiple(FALSE) as $info) {
$entity_info['commerce_option']['bundles'][$info->set_id] = array(
'label' => $info->name,
'admin' => array(
'path' => 'admin/commerce/products/option-sets/manage/%commerce_option_set',
'real path' => 'admin/commerce/products/option-sets/manage/' . $info->set_id,
'bundle argument' => 5,
'access arguments' => array(
'administer option sets',
),
),
);
}
}
function commerce_option_set_access($op, $type = NULL, $account = NULL) {
return user_access('administer option sets', $account);
}
function commerce_option_permission() {
$permissions = array(
'administer option sets' => array(
'title' => t('Administer Option Sets'),
'description' => t('Allow users to manage option sets.'),
),
'administer options' => array(
'title' => t('Administer options'),
'description' => t('Allow users to edit options'),
),
);
return $permissions;
}
function commerce_option_load_multiple($option_ids, $conditions = array(), $reset = FALSE) {
return entity_load('commerce_option', $option_ids, $conditions, $reset);
}
function commerce_option_load($option_id, $reset = FALSE) {
$ids = isset($option_id) ? array(
$option_id,
) : array();
$option = commerce_option_load_multiple($ids, array(), $reset);
return $option ? reset($option) : FALSE;
}
function commerce_option_load_by_line_item($line_item_id) {
$option_ids = db_select('commerce_option', 'o')
->fields('o', array(
'option_id',
))
->condition('line_item_id', $line_item_id, '=')
->execute()
->fetchCol();
return commerce_option_load_multiple($option_ids);
}
function commerce_option_load_by_product($product_id) {
$option_ids = db_select('commerce_option', 'o')
->fields('o', array(
'option_id',
))
->condition('product_id', $product_id, '=')
->execute()
->fetchCol();
return commerce_option_load_multiple($option_ids);
}
function commerce_option_save($option) {
$option->changed = REQUEST_TIME;
return entity_save('commerce_option', $option);
}
function commerce_option_new($values) {
if (!isset($values['set_id'])) {
$values['set_id'] = TRUE;
$option_sets = commerce_option_set_load_multiple(FALSE);
if (!empty($option_sets)) {
$values['set_id'] = current($option_sets)->set_id;
}
}
$values['created'] = REQUEST_TIME;
return entity_get_controller('commerce_option')
->create($values);
}
function commerce_option_set_load_multiple($option_set_ids, $conditions = array(), $reset = FALSE) {
return entity_load('commerce_option_set', $option_set_ids, $conditions, $reset);
}
function commerce_option_set_load($option_set_id, $reset = FALSE) {
$ids = isset($option_set_id) ? array(
$option_set_id,
) : array();
$option_set = commerce_option_set_load_multiple($ids, array(), $reset);
return $option_set ? reset($option_set) : FALSE;
}
function commerce_option_set_load_by_name($name) {
$query = db_select('commerce_option_set', 'cos')
->fields('cos', array(
'option_set_id',
))
->condition('set_id', $name, '=')
->execute()
->fetchField();
if (!empty($query)) {
$option_set = commerce_option_set_load($query);
return $option_set;
}
return FALSE;
}
function commerce_option_set_save($option_set) {
return entity_save('commerce_option_set', $option_set);
}
function commerce_option_set_delete($id) {
$option_set = commerce_option_set_load($id);
$bundle = $option_set->set_id;
$options = db_select('commerce_option', 'co')
->fields('co', array(
'option_id',
))
->condition('set_id', $bundle, '=')
->execute()
->fetchCol();
if (!empty($options)) {
entity_delete_multiple('commerce_option', $options);
}
entity_get_controller('commerce_option_set')
->delete(array(
$id,
));
}
function commerce_option_entity_delete($entity, $type) {
if ($type != 'commerce_line_item') {
return;
}
$options = commerce_option_load_by_line_item($entity->line_item_id);
if (empty($options)) {
return;
}
foreach ($options as $option) {
field_attach_delete('commerce_option', $option);
}
entity_delete_multiple('commerce_option', array_keys($options));
}
function commerce_option_entity_load($entities, $type) {
if ($type != 'commerce_line_item') {
return;
}
foreach ($entities as $id => $entity) {
if ($entity->type != 'product') {
continue;
}
$product_id = $entity->commerce_product[LANGUAGE_NONE][0]['product_id'];
$query = db_select('commerce_option', 'co')
->fields('co', array(
'option_id',
))
->condition('line_item_id', $id, '=')
->condition('product_id', $product_id, '=');
$result = $query
->execute()
->fetchCol();
if (empty($result)) {
continue;
}
foreach ($result as $option_id) {
$commerce_option = commerce_option_load($option_id);
$options_extracted = commerce_option_get_valuables($commerce_option);
$entity->{$commerce_option->set_id} = serialize($options_extracted);
}
}
}
function commerce_option_get_valuables($option) {
$option_extracted = array();
$fields = field_info_instances('commerce_option', $option->set_id);
$fields = array_keys($fields);
foreach ($fields as $field) {
$option_extracted[$field] = $option->{$field};
}
drupal_alter('commerce_option_valuables', $option_extracted, $option);
return $option_extracted;
}
function commerce_option_form_alter(&$form, &$form_state, $form_id) {
if (strpos($form_id, 'commerce_cart_add_to_cart_form_') === FALSE) {
return;
}
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);
$someFieldIsAdded = FALSE;
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;
}
$field_instance_info = field_info_instance('commerce_product', $field_name, $current_product->type);
if ($field_instance_info['commerce_cart_settings']['attribute_field']) {
return;
}
$lang_code = field_language('commerce_product', $current_product, $field_name);
if (!isset($field[$lang_code])) {
continue;
}
$form[$field_name] = array(
'#tree' => TRUE,
);
foreach ($field[$lang_code] as $key => $data) {
$option_set = commerce_option_set_load($data['target_id']);
$values = array(
'set_id' => $option_set->set_id,
);
$option = commerce_option_new($values);
$form_state['commerce_option'][$field_name][$key]['option'] = $option;
$form[$field_name][$key] = array(
'#parents' => array(
$field_name,
$key,
),
);
field_attach_form('commerce_option', $option, $form[$field_name][$key], $form_state);
$someFieldIsAdded = TRUE;
}
}
if ($someFieldIsAdded) {
$form['#submit'][] = 'commerce_option_add_to_cart_submit';
}
}
function commerce_option_add_to_cart_submit($form, $form_state) {
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);
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'];
field_attach_submit('commerce_option', $option, $form[$field_name][$delta], $form_state);
$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;
$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;
commerce_option_save($option);
}
}
}
function commerce_option_field_attach_submit($entity_type, $entity, $form, &$form_state) {
if ($entity_type != 'commerce_line_item') {
return;
}
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);
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;
}
$field_instance_info = field_info_instance('commerce_product', $field_name, $current_product->type);
if ($field_instance_info['commerce_cart_settings']['attribute_field']) {
return;
}
$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'];
field_attach_submit('commerce_option', $option, $form_state['complete form'][$field_name][$delta], $form_state);
$options_extracted = commerce_option_get_valuables($option);
$entity->{$option->set_id} = serialize($options_extracted);
}
}
}
function commerce_option_commerce_cart_product_comparison_properties_alter(&$comparison_properties) {
foreach (commerce_option_set_load_multiple(FALSE) as $option_set) {
$comparison_properties[] = $option_set->set_id;
}
}