Skip to content

Instantly share code, notes, and snippets.

@caschbre
Created November 20, 2015 18:37
Show Gist options
  • Save caschbre/ab8ce68a7ebfd93b7904 to your computer and use it in GitHub Desktop.
Save caschbre/ab8ce68a7ebfd93b7904 to your computer and use it in GitHub Desktop.
/**
* Coupon Form
*
* Generate a simple coupon form that accepts a coupon code or allows the user
* to remove that coupon code.
*/
function MYMODULE_discounts_coupon_form($form, &$form_state) {
global $user;
$order = commerce_cart_order_load($user->uid);
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
$max_coupons_reached = _MYMODULE_discounts_max_coupons_reached($order);
$form_state['order'] = $order;
if (!$max_coupons_reached) {
// Coupon Code Field
$form['coupon_code'] = array(
'#type' => 'textfield',
'#title' => t('Coupon code'),
'#title_display' => 'invisible',
'#attributes' => array(
'placeholder' => t('Have a discount code?'),
),
);
// Apply Coupon Code Button
$form['coupon_add'] = array(
'#type' => 'submit',
'#value' => t('Apply Code'),
'#name' => 'coupon_add',
);
}
// List of applies coupons along with option to remove.
if (isset($order_wrapper->commerce_coupons)) {
$form['applied_coupons'] = array(
'#prefix' => '<div class="applied-coupons">',
'#suffix' => '</div>',
);
foreach ($order_wrapper->commerce_coupons as $coupon_wrapper) {
$coupon_id = $coupon_wrapper->coupon_id->value();
$coupon_code = $coupon_wrapper->code->value();
$options = array(
'query' => drupal_get_destination() + array('token' => drupal_get_token('commerce_coupon_remove_checkout:' . $coupon_id . ':' . $order->order_id)),
'attributes' => array(
'class' => array('btn', 'secondary'),
),
);
$form['applied_coupons'][$coupon_id] = array(
'#prefix' => '<div class="applied-coupon">',
'message' => array(
'#markup' => t('Coupon @coupon_code has been applied!', array('@coupon_code' => $coupon_code)),
),
'coupon_remove' => array(
'#markup' => l(t('Remove'), 'commerce/coupons/order/remove/' . $coupon_id . '/' . $order->order_id, $options),
),
'#suffix' => '</div>',
);
}
}
return $form;
}
/**
* Validate handler for MYMODULE_discounts_coupon_form().
*
* @see commerce_coupon_handler_area_cart_form_validate()
*/
function MYMODULE_discounts_coupon_form_validate($form, &$form_state) {
$coupon_code = $form_state['values']['coupon_code'];
$order = $form_state['order'];
$error = '';
// No code provided
if (empty($coupon_code)) {
$error = t('Please enter a coupon code.');
}
else {
// Check if the coupon code has already been applied.
$coupon = commerce_coupon_load_by_code($coupon_code);
if (empty($coupon)) {
$error = t('Please enter a valid coupon code.');
}
else {
// The same coupon cannot be added twice.
$order_wrapper = entity_metadata_wrapper('commerce_order', $order);
foreach ($order_wrapper->commerce_coupons as $order_coupon_wrapper) {
if ($order_coupon_wrapper->coupon_id->value() == $coupon->coupon_id) {
$error = t('The coupon you have entered has already been applied to your order');
}
}
}
}
// If a coupon was invalidated during the cart refresh (e.g. if its
// discounts failed their conditions), an error message will have been
// set.
if (empty($error)) {
$error = &drupal_static('commerce_coupon_error_' . strtolower($coupon_code));
}
// If we have errors set the form error.
if (!empty($error)) {
form_set_error('coupon_code', $error);
}
}
/**
* Submit handler for MYMODULE_discounts_coupon_form().
*
* @see commerce_coupon_handler_area_cart_form_submit()
*/
function MYMODULE_discounts_coupon_form_submit($form, &$form_state) {
$coupon_code = $form_state['values']['coupon_code'];
$order = $form_state['order'];
$error = '';
// Redeem the coupon.
$coupon = commerce_coupon_redeem_coupon_code($coupon_code, $order, $error);
$order = commerce_order_load($order->order_id);
// Error found during redeem.
if (!empty($error)) {
watchdog('MYMODULE_discounts', 'An error occurred redeeming a coupon: @error', array('@error' => $error), WATCHDOG_ERROR);
drupal_set_message('Unable to redeem coupon.');
commerce_coupon_remove_coupon_from_order($order, $coupon);
}
if ($coupon) {
// Allow modules/rules to act when a coupon has been successfully added
// to the cart.
rules_invoke_all('commerce_coupon_applied_to_cart', $coupon, $order);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment