网络营销电子商务研究中心  
How to buy the best prescription safety glasses in Canada? Let's study!
Go Back   网络营销电子商务研究中心 > 网站建设 > ZenCart
User Name
Password
 
FAQ Members List Calendar Cheap Glasses Mark Forums Read

Reply
 
Thread Tools Display Modes
  #1   IP: 104.151.157.182
Old 2016-05-15, 12:27 PM
Alamance Alamance is offline
初级会员
 
Join Date: 2011-07-28
Posts: 3
Alamance 现在声名狼藉
Default

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;
  }
}
?>
NB: There are still some weaknesses here...


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
Reply With Quote
Reply


Currently Active Users Viewing This Thread: 1 (0 members and 1 guests)
 
Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump

Similar Threads
Thread Thread Starter Forum Replies Last Post
Developers API Overrides Akra ZenCart 0 2016-05-15 12:08 PM

Prescription-glasses.com offers prescription glasses online at discount prices.
All times are GMT +8. The time now is 04:16 AM.


Powered by vBulletin Version 3.8.7
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.