![]() |
|
|||||||
![]() |
|
|
Thread Tools | Display Modes |
|
|
|
#1
IP: 104.151.157.182
|
|||
|
|||
|
Another Real World Example
Again we return to the Shopping Cart and promotions. Another oft-requested feature is the BOGOF promotion, or Buy One Get One Free. This is a little more difficult to achieve than our previous example, as there is some manipulation needed of the cart totals. However as you will see it is still pretty much a breeze. Code:
<?php
/**
* Observer class used apply a Buy One Get One Free(bogof) algorithm to the cart
*
*/
class myBogof extends base {
/**
* an array of ids of products that can be BOGOF.
*
* @var array
*/
var $bogofsArray = array(10,4); //Under Siege2-Dark Territory & The replacement Killers
/**
* Integer number of bogofs allowed per product
*
* For example if I add 4 items of product 10, that would suggest that I pay for 2 and get the other 2 free.
* however you may want to restrict the customer to only getting 1 free regardless of the actual quantity
*
* @var integer
*/
var $bogofsAllowed = 1;
/**
* constructor method
*
* Watches for 1 notifier event, triggered from the shopping cart class.
*/
function myBogof() {
$this->attach($this, array('NOTIFIER_CART_SHOW_TOTAL_END'));
}
/**
* Update Method
*
* Called by observed class when any of our notifiable events occur
*
* This is a bit of a hack, but it works.
* First we loop through each product in the bogof Array and see if that product is in the cart.
* Then we calculate the number of free items. As it is buy one get one free, the number of free items
* is equal to the total quantity of an item/2.
* Then we have to hack a bit (would be nice if there was a single cart method to return a product's in-cart price)
* We loop thru the cart until we find the bogof item, get its final price, calculate the saving
* and adjust the cart total accordingly.
*
* @param object $class
* @param string $eventID
*/
function update(&$class, $eventID) {
$cost_saving = 0;
$products = $_SESSION['cart']->get_products();
foreach ($this->bogofsArray as $bogofItem) {
if ($_SESSION['cart']->in_cart($bogofItem)) {
if (isset($_SESSION['cart']->contents[$bogofItem]['qty']) && $_SESSION['cart']->contents[$bogofItem]['qty'] > 1) {
$numBogofs = floor($_SESSION['cart']->contents[$bogofItem]['qty'] / 2);
if ($numBogofs > $this->bogofsAllowed) $numBogofs = $this->bogofsAllowed;
if ($numBogofs > 0) {
for ($i=0, $n=sizeof($products); $i<$n; $i++) {
if ($products[$i]['id'] == $bogofItem) {
$final_price = $products[$i]['final_price'];
break;
}
}
$cost_saving .= $final_price * $numBogofs;
}
}
}
}
$_SESSION['cart']->total -= $cost_saving;
}
}
?>
First although the adjust total is correctly shown on the shopping cart page and sidebox, the line total is not adjusted. Secondly this will probably produce a confusing output at checkout. Third: Have not tested for tax compliance yet ( @TODO ) Notifiers currently set in Zen Cart Notifier points for Zen Cart 1.3.7 Shopping Cart class NOTIFIER_CART_INSTANTIATE_START NOTIFIER_CART_INSTANTIATE_END NOTIFIER_CART_RESTORE_CONTENTS_START NOTIFIER_CART_RESTORE_CONTENTS_END NOTIFIER_CART_RESET_START NOTIFIER_CART_RESET_END NOTIFIER_CART_ADD_CART_START NOTIFIER_CART_ADD_CART_END NOTIFIER_CART_UPDATE_QUANTITY_START NOTIFIER_CART_UPDATE_QUANTITY_END NOTIFIER_CART_CLEANUP_START NOTIFIER_CART_CLEANUP_END NOTIFIER_CART_COUNT_CONTENTS_START NOTIFIER_CART_COUNT_CONTENTS_END NOTIFIER_CART_GET_QUANTITY_START NOTIFIER_CART_GET_QUANTITY_END_QTY NOTIFIER_CART_GET_QUANTITY_END_FALSE NOTIFIER_CART_IN_CART_START NOTIFIER_CART_IN_CART_END_TRUE NOTIFIER_CART_IN_CART_END_FALSE NOTIFIER_CART_REMOVE_START NOTIFIER_CART_REMOVE_END NOTIFIER_CART_REMOVE_ALL_START NOTIFIER_CART_REMOVE_ALL_END NOTIFIER_CART_GET_PRODUCTS_START NOTIFIER_CART_GET_PRODUCTS_END NOTIFIER_CART_SHOW_TOTAL_START NOTIFIER_CART_SHOW_TOTAL_END NOTIFY_CART_USER_ACTION NOTIFY_HEADER_START_SHOPPING_CART NOTIFY_HEADER_END_SHOPPING_CART Order Class: NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_BEGIN NOTIFY_ORDER_PROCESSING_STOCK_DECREMENT_END NOTIFY_ORDER_PROCESSING_CREDIT_ACCOUNT_UPDATE_BEGIN NOTIFY_ORDER_PROCESSING_ATTRIBUTES_BEGIN NOTIFY_ORDER_PROCESSING_ONE_TIME_CHARGES_BEGIN Email: NOTIFY_EMAIL_AFTER_EMAIL_FORMAT_DETERMINED NOTIFY_EMAIL_BEFORE_PROCESS_ATTACHMENTS NOTIFY_EMAIL_AFTER_PROCESS_ATTACHMENTS NOTIFY_EMAIL_AFTER_SEND (individual email) NOTIFY_EMAIL_AFTER_SEND_ALL_SPECIFIED_ADDRESSES (full batch) Modules: NOTIFY_MODULE_START_META_TAGS NOTIFY_MODULE_END_META_TAGS NOTIFY_MODULE_START_CREATE_ACCOUNT NOTIFY_FAILURE_DURING_CREATE_ACCOUNT NOTIFY_LOGIN_SUCCESS_VIA_CREATE_ACCOUNT NOTIFY_MODULE_END_CREATE_ACCOUNT Checkout: NOTIFY_CHECKOUT_PROCESS_BEGIN NOTIFY_CHECKOUT_PROCESS_BEFORE_ORDER_TOTALS_PRE_CONFIRMATION_CHECK NOTIFY_CHECKOUT_PROCESS_BEFORE_ORDER_TOTALS_PROCESS NOTIFY_CHECKOUT_PROCESS_AFTER_ORDER_TOTALS_PROCESS NOTIFY_CHECKOUT_PROCESS_AFTER_PAYMENT_MODULES_BEFOREPROCESS NOTIFY_CHECKOUT_PROCESS_AFTER_ORDER_CREATE NOTIFY_CHECKOUT_PROCESS_AFTER_PAYMENT_MODULES_AFTER_ORDER_CREATE NOTIFY_CHECKOUT_PROCESS_AFTER_ORDER_CREATE_ADD_PRODUCTS NOTIFY_CHECKOUT_PROCESS_AFTER_SEND_ORDER_EMAIL NOTIFY_CHECKOUT_PROCESS_HANDLE_AFFILIATES NOTIFY_HEADER_START_CHECKOUT_CONFIRMATION NOTIFY_HEADER_END_CHECKOUT_CONFIRMATION NOTIFY_HEADER_START_CHECKOUT_PAYMENT NOTIFY_HEADER_END_CHECKOUT_PAYMENT NOTIFY_HEADER_START_CHECKOUT_PAYMENT_ADDRESS NOTIFY_HEADER_END_CHECKOUT_PAYMENT_ADDRESS NOTIFY_HEADER_START_CHECKOUT_PROCESS NOTIFY_HEADER_END_CHECKOUT_PROCESS NOTIFY_HEADER_START_CHECKOUT_SHIPPING NOTIFY_HEADER_END_CHECKOUT_SHIPPING NOTIFY_HEADER_START_CHECKOUT_SHIPPING_ADDRESS NOTIFY_HEADER_END_CHECKOUT_SHIPPING_ADDRESS NOTIFY_HEADER_START_CHECKOUT_SUCCESS NOTIFY_HEADER_END_CHECKOUT_SUCCESS NOTIFY_MODULE_START_CHECKOUT_NEW_ADDRESS NOTIFY_MODULE_END_CHECKOUT_NEW_ADDRESS Individual Pages (Header scripts): NOTIFY_HEADER_START_ACCOUNT NOTIFY_HEADER_END_ACCOUNT NOTIFY_HEADER_START_ACCOUNT_EDIT NOTIFY_HEADER_ACCOUNT_EDIT_UPDATES_COMPLETE NOTIFY_HEADER_END_ACCOUNT_EDIT NOTIFY_HEADER_START_ACCOUNT_HISTORY NOTIFY_HEADER_END_ACCOUNT_HISTORY NOTIFY_HEADER_START_ACCOUNT_HISTORY_INFO NOTIFY_HEADER_END_ACCOUNT_HISTORY_INFO NOTIFY_HEADER_START_ACCOUNT_NOTIFICATION NOTIFY_HEADER_END_ACCOUNT_NOTIFICATION NOTIFY_HEADER_START_ACCOUNT_PASSWORD NOTIFY_HEADER_END_ACCOUNT_PASSWORD NOTIFY_HEADER_START_ADDRESS_BOOK NOTIFY_HEADER_END_ADDRESS_BOOK NOTIFY_HEADER_START_ADDRESS_BOOK_PROCESS NOTIFY_HEADER_ADDRESS_BOOK_DELETION_DONE NOTIFY_HEADER_ADDRESS_BOOK_ENTRY_UPDATE_DONE NOTIFY_HEADER_ADDRESS_BOOK_ADD_ENTRY_DONE NOTIFY_HEADER_END_ADDRESS_BOOK_PROCESS NOTIFY_HEADER_START_CREATE_ACCOUNT NOTIFY_FAILURE_DURING_CREATE_ACCOUNT NOTIFY_LOGIN_SUCCESS_VIA_CREATE_ACCOUNT NOTIFY_HEADER_END_CREATE_ACCOUNT NOTIFY_HEADER_START_CREATE_ACCOUNT_SUCCESS NOTIFY_HEADER_END_CREATE_ACCOUNT_SUCCESS NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_GENERAL_INFO NOTIFY_MAIN_TEMPLATE_VARS_PRODUCT_TYPE_VARS_DOCUMENT_GENERAL_INFO NOTIFY_MAIN_TEMPLATE_VARS_EXTRA_DOCUMENT_GENERAL_INFO NOTIFY_MAIN_TEMPLATE_VARS_END_DOCUMENT_GENERAL_INFO NOTIFY_PRODUCT_TYPE_VARS_START_DOCUMENT_GENERAL_INFO NOTIFY_PRODUCT_TYPE_VARS_END_DOCUMENT_GENERAL_INFO NOTIFY_MAIN_TEMPLATE_VARS_START_DOCUMENT_PRODUCT_INFO NOTIFY_MAIN_TEMPLATE_VARS_PRODUCT_TYPE_VARS_DOCUMENT_PRODUCT_INFO NOTIFY_MAIN_TEMPLATE_VARS_EXTRA_DOCUMENT_PRODUCT_INFO NOTIFY_MAIN_TEMPLATE_VARS_END_DOCUMENT_PRODUCT_INFO NOTIFY_PRODUCT_TYPE_VARS_START_DOCUMENT_PRODUCT_INFO NOTIFY_PRODUCT_TYPE_VARS_END_DOCUMENT_PRODUCT_INFO NOTIFY_HEADER_START_DOWNLOAD NOTIFY_DOWNLOAD_VIA_SYMLINK___BEGINS NOTIFY_DOWNLOAD_WITHOUT_REDIRECT___COMPLETED NOTIFY_DOWNLOAD_WITHOUT_REDIRECT_VIA_CHUNKS___COMPLETED NOTIFY_HEADER_END_DOWNLOAD NOTIFY_HEADER_START_GV_FAQ NOTIFY_HEADER_END_GV_FAQ NOTIFY_HEADER_START_GV_SEND NOTIFY_HEADER_END_GV_SEND NOTIFY_HEADER_START_INDEX NOTIFY_HEADER_END_INDEX NOTIFY_HEADER_START_INDEX_MAIN_TEMPLATE_VARS NOTIFY_HEADER_INDEX_MAIN_TEMPLATE_VARS_RELEASE_PRODUCT_TYPE_VARS NOTIFY_HEADER_END_INDEX_MAIN_TEMPLATE_VARS NOTIFY_HEADER_START_LOGIN NOTIFY_LOGIN_SUCCESS NOTIFY_LOGIN_FAILURE NOTIFY_HEADER_END_LOGIN NOTIFY_HEADER_START_LOGOFF NOTIFY_HEADER_END_LOGOFF NOTIFY_HEADER_START_EZPAGE NOTIFY_HEADER_END_EZPAGE NOTIFY_HEADER_START_PAGE_NOT_FOUND NOTIFY_HEADER_END_PAGE_NOT_FOUND NOTIFY_HEADER_START_PASSWORD_FORGOTTEN NOTIFY_HEADER_END_PASSWORD_FORGOTTEN NOTIFY_MAIN_TEMPLATE_VARS_START_PRODUCT_FREE_SHIPPING_INFO NOTIFY_MAIN_TEMPLATE_VARS_PRODUCT_TYPE_VARS_PRODUCT_FREE_SHIPPING_INFO NOTIFY_MAIN_TEMPLATE_VARS_EXTRA_PRODUCT_FREE_SHIPPING_INFO NOTIFY_MAIN_TEMPLATE_VARS_END_PRODUCT_FREE_SHIPPING_INFO NOTIFY_PRODUCT_TYPE_VARS_START_PRODUCT_FREE_SHIPPING_INFO NOTIFY_PRODUCT_TYPE_VARS_END_PRODUCT_FREE_SHIPPING_INFO NOTIFY_HEADER_START_PRODUCT_INFO NOTIFY_HEADER_END_PRODUCT_INFO NOTIFY_MAIN_TEMPLATE_VARS_START_PRODUCT_INFO NOTIFY_MAIN_TEMPLATE_VARS_PRODUCT_TYPE_VARS_PRODUCT_INFO NOTIFY_MAIN_TEMPLATE_VARS_EXTRA_PRODUCT_INFO NOTIFY_MAIN_TEMPLATE_VARS_END_PRODUCT_INFO NOTIFY_PRODUCT_TYPE_VARS_START_PRODUCT_INFO NOTIFY_PRODUCT_TYPE_VARS_END_PRODUCT_INFO NOTIFY_MAIN_TEMPLATE_VARS_START_PRODUCT_MUSIC_INFO NOTIFY_MAIN_TEMPLATE_VARS_PRODUCT_TYPE_VARS_PRODUCT_MUSIC_INFO NOTIFY_MAIN_TEMPLATE_VARS_EXTRA_PRODUCT_MUSIC_INFO NOTIFY_MAIN_TEMPLATE_VARS_END_PRODUCT_MUSIC_INFO NOTIFY_PRODUCT_TYPE_VARS_START_PRODUCT_MUSIC_INFO NOTIFY_PRODUCT_TYPE_VARS_END_PRODUCT_MUSIC_INFO NOTIFY_HEADER_START_SITE_MAP NOTIFY_HEADER_END_SITE_MAP NOTIFY_HEADER_START_UNSUBSCRIBE NOTIFY_HEADER_END_UNSUBSCRIBE PayPal™: NOTIFY_PAYMENT_PAYPAL_RETURN_TO_STORE NOTIFY_PAYMENT_PAYPAL_CANCELLED_DURING_CHECKOUT NOTIFY_PAYMENT_PAYPAL_INSTALLED NOTIFY_PAYMENT_PAYPAL_UNINSTALLED Sideboxes: NOTIFY_SIDEBOX_START_EZPAGES_SIDEBOX NOTIFY_SIDEBOX_END_EZPAGES_SIDEBOX NOTIFY_HEADER_START_EZPAGES_HEADER NOTIFY_HEADER_END_EZPAGES_HEADER NOTIFY_FOOTER_START_EZPAGES_FOOTER NOTIFY_FOOTER_END_EZPAGES_FOOTER Search: NOTIFY_HEADER_START_ADVANCED_SEARCH_RESULTS NOTIFY_SEARCH_COLUMNLIST_STRING NOTIFY_SEARCH_SELECT_STRING NOTIFY_SEARCH_FROM_STRING NOTIFY_SEARCH_WHERE_STRING NOTIFY_SEARCH_ORDERBY_STRING NOTIFY_HEADER_END_ADVANCED_SEARCH_RESULTS EZ-Pages: NOTIFY_START_EZPAGES_FOOTERBAR NOTIFY_END_EZPAGES_FOOTERBAR NOTIFY_START_EZPAGES_HEADERBAR NOTIFY_END_EZPAGES_HEADERBAR |
![]() |
| Currently Active Users Viewing This Thread: 1 (0 members and 1 guests) | |
| Thread Tools | |
| Display Modes | |
|
|
Similar Threads
|
||||
| Thread | Thread Starter | Forum | Replies | Last Post |
| Developers API Overrides | Akra | ZenCart | 0 | 2016-05-15 12:08 PM |