Created
November 20, 2015 18:37
-
-
Save caschbre/ab8ce68a7ebfd93b7904 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 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