需求:
在shopping cart页面 每一个Item 前增加checkobx控件,
让购买者可以选中需要购买的物品。
然后点击购买按钮执行购买流程。
再完成购买或者回到上一页按钮的时候恢复原本的item到购物车内。
解决思路:利用临时表存储未选中的item数据。
在完成结算或者取消结算的时候从临时表中恢复数据到正式表。
解剖一下相关表结构
magento 关于cart item的表有两个:`sales_flat_quote_item`,`sales_flat_quote_item_option`
这两个表前一个的主见是后一个的外键 item_id 。
为了完成需求我们可以创建两个零时表,针对上面两个表,
另外还要在sales_flat_quote_item中添加一个是否被选中的标记,这些数据库操作通过升级脚本实现:
定义升级脚本集成的类:写在<global>下
<resources> <bysoft_mycheckout_setup> <setup> <module>Bysoft_Mycheckout</module> <class>Mage_Sales_Model_Mysql4_Setup</class> </setup> </bysoft_mycheckout_setup> </resources>
增加是否选中状态字段
<?php $installer = $this; $installer->startSetup(); $installer->addAttribute( 'quote_item', 'selected_item', array( 'type' => 'int', 'grid' => false ) ); $installer->endSetup();
增加临时表:
<?php $installer = $this; $installer->startSetup(); $installer->run(" create table `bysoft_sales_flat_quote_item` like sales_flat_quote_item; create table `bysoft_sales_flat_quote_item_option` like sales_flat_quote_item_option; "); $installer->endSetup();
点击确认选中的item的ajax方法
checkbox 控件:
<input <?php if ($_item->getData('selected_item')):?>checked="checked"<?php endif;?> type="checkbox" item_id="<?php echo $_item->getId();?>" is_imported="<?php echo $_product->getData('is_imported');?>" name="selectitem[<?php echo $_item->getId();?>]" class="selectitem" />
确认按钮:
<button type="button" id="select_need_btn" name="select_need_btn" value="empty_cart" title="<?php echo $this->__('Checkout'); ?>" class="button btn-empty" ><span><span><?php echo $this->__('Proceed to Checkout'); ?></span></span></button>
前台ajax:
<script> (function($){ $('.btn-proceed-checkout').hide(); //全选 $('.select_all_cb').click(function(){ if (this.checked) { $('.selectitem').attr('checked',true); } else { $('.selectitem').attr('checked',false); } }) $('#select_need_btn').click(function(){ //点击需要结账的按钮。选好复选框。 var item_id_str = ''; $('.selectitem:checked').each(function() { item_id_str += ($(this).attr('item_id')) + ','; }) if (item_id_str == '') { alert('<?php echo $this->__('Please check items!');?>'); return ; } $.ajax({ url:'<?php echo $this->getUrl('checkout/cart/selectitem')?>', type:'post', data:'item_id_str='+item_id_str, async : false, //默认为true 异步 error:function(){ alert('error'); }, success:function(data){ if (data == '0') { alert('Please specify only imported or domesitc products'); return; } else { $(".item_tbody").html(data); $('.select_all_cb').attr('checked',false); $('.btn-proceed-checkout').click(); } } }); }) })(jQuery); </script>
处理选中的item, 这里有个额外需求。将进口商品和国内商品分开结算,也就是当选中商品既包含国外也包含国内的时候不执行任何操作,返回错误代码0. 如果只选中了国内,或者只选中了进口,就把未选中的数据从数据库备份起来以备之后的回复,然后讲他们从从原生表里删除,重新计算购物车价格:
继承声明:
<frontend> <routers> <checkout> <use>standard</use> <args> <modules> <Super_Awesome before="Mage_Checkout">Bysoft_Mycheckout</Super_Awesome> </modules> </args> </checkout> </routers> </frontend>
继承类具体实现:
class Bysoft_Mycheckout_CartController extends Mage_Checkout_CartController { public function selectitemAction(){ $item_id_str = Mage::app()->getRequest()->getParam('item_id_str'); $item_id_arr = explode(',' , $item_id_str); $the_item_ids = array(); foreach ($item_id_arr as $key=>$val) { if ((int)trim($val)!= '0') { $the_item_ids[] = $item_id_arr[$key] = (int)trim($val); } } $quote = Mage::getSingleton('checkout/session')->getQuote(); $cartItems = $quote->getAllVisibleItems(); $exists_imported = false; $exists_domesitc = false; foreach ($cartItems as $item) { if (in_array($item->getId(), $the_item_ids)) { $product_id = $item->getProductId(); $product = Mage::getModel('catalog/product')->load($product_id); if ($product->getData('is_imported') == 1) { $exists_imported = true; break; } } } foreach ($cartItems as $item) { if (in_array($item->getId(), $the_item_ids)) { $product_id = $item->getProductId(); $product = Mage::getModel('catalog/product')->load($product_id); if ($product->getData('is_imported') == 0) { $exists_domesitc = true; break; } } } if ($exists_imported && $exists_domesitc) { echo 0; } else { $write = Mage::getSingleton('core/resource')->getConnection('core_write'); $cartData = array(); //set staus for quote item $cartHelper = Mage::helper('checkout/cart'); $items = $cartHelper->getCart()->getItems(); foreach ($items as $item) { if (in_array($item->getId(), $the_item_ids) || in_array($item->getData('parent_item_id'),$the_item_ids)) { //需要保留的行 $this->set_selected_item($item->getId(),1); //从备份表里删除 $this->delete_from_back($item->getId()); } else { //需要移动的行 $this->set_selected_item($item->getId(),0); //放入备份表 $this->move_core_to_back($item->getId()); } } //重新计算购物车总价 $quote->setTotalsCollectedFlag(false)->collectTotals(); $quote->save(); $simple_block = $this->getLayout()->createBlock('checkout/cart_item_renderer'); $config_block = $this->getLayout()->createBlock('checkout/cart_item_renderer_configurable'); $group_block = $this->getLayout()->createBlock('checkout/cart_item_renderer_grouped'); $html = ''; foreach($cartItems as $item) { if ($item->getData('product_type') == 'simple') { $block = $simple_block; } else if ($item->getData('product_type') == 'configurable') { $block = $config_block; } else { $block = $group_block; } $html .= $block->setTemplate('checkout/cart/item/default.phtml')->setItem($item)->toHtml(); } if ($exists_domesitc && $exists_imported) { echo $html; } else { echo $html; } } } protected function _getCart() { return Mage::getSingleton('checkout/cart'); } /** * 移动未选中数据到备份表 * @param unknown $item_id */ public function move_core_to_back($item_id) { $write = Mage::getSingleton('core/resource')->getConnection('core_write'); $sql ="delete from bysoft_sales_flat_quote_item where item_id = ?"; $write->query($sql,array($item_id)); $sql = "insert into bysoft_sales_flat_quote_item select * from sales_flat_quote_item where item_id = ?"; $write->query($sql,array($item_id)); $sql = "delete from bysoft_sales_flat_quote_item_option where item_id = ?"; $write->query($sql,array($item_id)); $sql = "insert into bysoft_sales_flat_quote_item_option select * from sales_flat_quote_item_option where item_id = ?"; $write->query($sql,array($item_id)); } /** * 将item从备份表删除 */ public function delete_from_back($item_id) { $write = Mage::getSingleton('core/resource')->getConnection('core_write'); $sql ="delete from bysoft_sales_flat_quote_item where item_id = ?"; $write->query($sql,array($item_id)); $sql = "delete from bysoft_sales_flat_quote_item_option where item_id = ?"; $write->query($sql,array($item_id)); } /** * 设定Item的选中状态 * @param unknown $item_id * @param unknown $status */ public function set_selected_item($item_id, $status) { $write = Mage::getSingleton('core/resource')->getConnection('core_write'); $sql = "update sales_flat_quote_item set selected_item = ? where item_id = ?"; $write->query($sql, array($status, $item_id)); }
在完成选择Item之后页面就到了checkout页面。
选好支付和shipping之后,有两种步骤。
第一种是返回上一页。恢复item到核心表。
public function recover_item() { $quote_id = Mage::getSingleton('checkout/session')->getQuoteId(); $write = Mage::getSingleton('core/resource')->getConnection('core_write'); $sql = "insert into sales_flat_quote_item select * from bysoft_sales_flat_quote_item where quote_id = ? and item_id not in (select item_id from sales_flat_quote_item)"; $write->query($sql, array($quote_id)); $sql = "insert into sales_flat_quote_item_option select * from bysoft_sales_flat_quote_item_option where item_id in (select item_id from bysoft_sales_flat_quote_item where quote_id = ? ) and option_id not in (select option_id from sales_flat_quote_item_option)"; $write->query($sql, array($quote_id)); $sql = "delete from bysoft_sales_flat_quote_item_option where item_id in (select item_id from bysoft_sales_flat_quote_item where quote_id =?)"; $write->query($sql, array($quote_id)); $sql = "delete from bysoft_sales_flat_quote_item where quote_id = ?"; $write->query($sql, array($quote_id)); try { $quote = Mage::getSingleton('checkout/session')->getQuote(); $quote->setTotalsCollectedFlag(false)->collectTotals(); $quote->save(); } catch (Exception $e) { echo $e->getMessage(); exit(); } } public function indexAction(){ $this->recover_item(); $cart = $this->_getCart(); if ($cart->getQuote()->getItemsCount()) { $cart->init(); $cart->save(); if (!$this->_getQuote()->validateMinimumAmount()) { $minimumAmount = Mage::app()->getLocale()->currency(Mage::app()->getStore()->getCurrentCurrencyCode()) ->toCurrency(Mage::getStoreConfig('sales/minimum_order/amount')); $warning = Mage::getStoreConfig('sales/minimum_order/description') ? Mage::getStoreConfig('sales/minimum_order/description') : Mage::helper('checkout')->__('Minimum order amount is %s', $minimumAmount); $cart->getCheckoutSession()->addNotice($warning); } } // Compose array of messages to add $messages = array(); foreach ($cart->getQuote()->getMessages() as $message) { if ($message) { // Escape HTML entities in quote message to prevent XSS $message->setCode(Mage::helper('core')->escapeHtml($message->getCode())); $messages[] = $message; } } $cart->getCheckoutSession()->addUniqueMessages($messages); /** * if customer enteres shopping cart we should mark quote * as modified bc he can has checkout page in another window. */ $this->_getSession()->setCartWasUpdated(true); Varien_Profiler::start(__METHOD__ . 'cart_display'); $this ->loadLayout() ->_initLayoutMessages('checkout/session') ->_initLayoutMessages('catalog/session') ->getLayout()->getBlock('head')->setTitle($this->__('Shopping Cart')); $this->renderLayout(); Varien_Profiler::stop(__METHOD__ . 'cart_display'); }
第二种则是下单,在下单完成后恢复备份表里的数据到核心表
需要覆盖原生OnepageController内的successAction
public function successAction() { $session = $this->getOnepage()->getCheckout(); if (!$session->getLastSuccessQuoteId()) { $this->_redirect('checkout/cart'); return; } $lastQuoteId = $session->getLastQuoteId(); $lastOrderId = $session->getLastOrderId(); $lastRecurringProfiles = $session->getLastRecurringProfileIds(); if (!$lastQuoteId || (!$lastOrderId && empty($lastRecurringProfiles))) { $this->_redirect('checkout/cart'); return; } $session->clear(); $this->add_back_cart_item($lastQuoteId); $this->loadLayout(); $this->_initLayoutMessages('checkout/session'); Mage::dispatchEvent('checkout_onepage_controller_success_action', array('order_ids' => array($lastOrderId))); $this->renderLayout(); } public function add_back_cart_item($old_quote_id) { // get logged in cusomer id $customerAccountNo = Mage::getModel('customer/session')->getCustomer()->getId(); // load customer object $customerObj = Mage::getModel('customer/customer')->load($customerAccountNo); // assign this customer to quote object, before any type of magento order, first create quote. $quoteObj = Mage::getModel('sales/quote')->assignCustomer($customerObj); $quoteObj->setStoreId(Mage::app()->getStore()->getId())->save(); $new_quote_id = $quoteObj->getData('entity_id'); Mage::log($quoteObj->getData('entity_id')); $write = Mage::getSingleton('core/resource')->getConnection('core_write'); $sql = "update bysoft_sales_flat_quote_item set quote_id = ? where quote_id=?"; $write->query($sql, array($new_quote_id, $old_quote_id)); $sql = "insert into sales_flat_quote_item select * from bysoft_sales_flat_quote_item where quote_id = ?"; $write->query($sql, array($new_quote_id)); $sql = "insert into sales_flat_quote_item_option select * from bysoft_sales_flat_quote_item_option where item_id in (select item_id from bysoft_sales_flat_quote_item where quote_id =?)"; $write->query($sql, array($new_quote_id)); $quote = Mage::getSingleton('checkout/session')->getQuote(); $quote->setTotalsCollectedFlag(false)->collectTotals(); $quote->save(); }
相关推荐
在计算机用户界面设计中,复选框(Check Box)是一种常见的控件,用于让用户在多个选项中进行多选操作。本篇文章将详细讲解如何在不同的编程语言和环境中使用复选框来实现多选功能。 一、复选框的基本概念 复选框...
"Add to Cart"功能在电子商务网站中扮演着至关重要的角色,它是用户将商品加入购物车的交互过程。在这个场景中,HTML(HyperText Markup Language)是构建网页的基础语言,用于定义网页内容的结构和表现。下面我们将...
Ajax-Magento-ajax-add-to-cart.zip,[模块magento 1]magento ajax添加到购物车-ajoter vos produits au panier en ajax/感谢ajax将您的产品添加到购物车,ajax代表异步javascript和xml。它是多种web技术的集合,包括...
这个"quick-add-to-cart"项目显然聚焦于实现这一功能,以简化用户从产品库中选择并购买商品的过程。以下是关于这个功能及其实现的一些详细知识点: 1. 用户界面设计:首先,一个直观易用的用户界面(UI)是关键。...
"Add-to-cart-tester" 是一个可能用于电商网站或应用的测试工具,专注于检验“加入购物车”功能的正确性和性能。这个项目的核心是利用CSS(Cascading Style Sheets)来实现对页面元素的定位和操作,以模拟用户点击...
例如,你可以使用MP4Box将DivX文件转换为MP4格式,只需使用`-add`命令指定源文件和目标文件。此外,它还可以添加辅助音轨,或者从现有容器中导入特定媒体。使用`-info`命令可以查看文件中包含的可导入媒体类型。 2....
本项目"add_cart-master.zip"显然聚焦于微信小程序的一个核心功能——购物车系统。购物车功能是电商应用的核心组件,用户可以在此添加商品、调整数量并计算总价,同时支持对购物车中的商品进行管理,如删除。 首先...
解压后查看"Box_cFSTR2.0"目录下的(Box_cFSTR说明.txt)文件。 关于Box_cFSTR2.0.exe文件: 大小: 834970 字节 文件版本: 2.0.0.0 MD5: 7FB46647921B9660C29759070CBFA2DF SHA1: D716733998E304111C2836F0278398058...
Add to cart JumboAdobeXD源码下载设计素材UI设计
box7.add(Box.createVerticalStrut(6)); box7.add(box2); box7.add(Box.createVerticalStrut(5)); box7.add(box3); box7.add(Box.createVerticalStrut(5)); box7.add(box4); box7.add(Box....
目前只支持spree 2-4-stable 将 spree_add_to_cart_ajax 添加到您的 Gemfile 中: gem 'spree_add_to_cart_ajax' , github : 'nathandao/spree_add_to_cart_ajax' , branch : '2-4-stable' 捆绑您的依赖项并运行...
$cartItem = Cart::add($productId, '产品名称', $productQuantity, 9.99); ``` 这里,`add()`方法接收四个参数:商品ID、商品名称、数量和单价。 #### 4.2 获取购物车内容 要查看购物车内容,可以使用`Cart::...
迁移文件将包含创建 cart 表的 SQL 语句,例如字段如 item_id(商品ID)、quantity(数量)、user_id(用户ID)以及可能的 group_id(分组ID)等。 ```php // cart_table.php 迁移文件 public function up() { ...
在进行语音信号处理的时候,需要用到一些函数进行操作,但是有时MATLAB并没有装这些东西,我们自己手动添加进去...voicebox是用于MATLAB中的语音处理工具箱,其中包含了对语音的分帧处理,滤波,加窗,参数提取等函数。
1. **指令系统**:了解基本的CPU指令,如MOV(数据传输)、ADD(加法)、SUB(减法)、JMP(跳转)等。 2. **寄存器**:学习如何使用CPU的寄存器,如AX、BX、CX、DX、SP、BP等,它们用于存储数据和指针。 3. **段和...
In the Box, is a brand name for a series of CBT Feature Extensions I’ll release that are listed in the Visual Studio 2010 Add New Project dialog; see below image. This release is MVVM Training, the ...
Cart::add($productId, $quantity, ['color' => 'red']); // 获取购物车内容 $cartItems = Cart::content(); // 更新商品数量 Cart::update($itemId, $newQuantity); // 移除商品 Cart::remove($itemId); // ...
Quick.Cart.Add_v6.4.zip 是一个用于搭建简易商城的软件包,版本为6.4。这个压缩包包含了构建一个简单、快速的电子商务平台所需的关键组件。从给出的文件列表来看,我们可以分析出该系统的基本架构和组成部分: 1. ...