Bootstrap

ecshop 实现全站调用购物车功能

此功能是根据网友提供的方法,然后自己实际操作后发现了一些问题,更改了部分代码,完美了一些,下面的代码都贴出来了

今天给一朋友解决一个问题,需要在商城每个页面中的购物车处都显示购物车详情!其实,这个功能很简单,现在很多商城都在用(PS:虽然我的成都零食网现在还没有使用这个功能,并且以后暂时也没有打算使用这个功能,今天还是把这个写出来分享给大家。)。要实现并不是难事,就是在订单模板中加几个关于订单详情的显示嘛。如果需要在这里面加入删除或更新也只需要结合JS进行调用就行了。现在将我实现这个功能的方法公布如下:

可以从图中看出,我主要是添加了 购物车 详单和删除操作。其它都是一样的。以下是具体实现方法和简单原理:
要实现,首先要知道这一块是怎么出来的,做过 ECSHOP二次开发 的朋友对这个肯定不陌生了,模板 文件 在模板文件夹中的库文件夹的cart_info.lbi(找不到的同志可以 搜索 一下),原来这个模板里的东西很简单,就是添显示了“ 购物车 里有X个 商品 ,去结算”这类的信息。今天,我们要将其全部显示。
其次,我们要显示详情,肯定需要将这个详情使用弹出的方式来显示,不能直接显示,直接显示谁都会,那样有打开订单结算页有什么区别呢?占有太多地方了,这里就要用到css和js的一些基础知识了。
我的 代码 和注释如下:
  1. <!--{if $goods11}-->
                    <ul id="mcart-mz">   
                      {foreach from=$goods11 item=goods11 name=goods11}             
                       <li>
                        <div class="p-img fl">
                           <a href="{$goods11.url}" target="_blank">
                             <img src="{$goods11.goods_thumb}" alt="" height="50" width="50">
                           </a>
                        </div>      
                        <div class="p-name fl">
                           <a href="{$goods11.url}" target="_blank">{$goods11.short_name}</a>
                        </div>      
                         <div class="p-detail fr ar">          
                            <span class="p-price"><strong>{$goods11.goods_price}</strong>×{$goods11.goods_number}</span><br>          
                            <span class="hl-green">小计:{$goods11.subtotal}</span><br>           
                             <a class="del" href="javascript:" onClick="deleteCartGoods({$goods11.rec_id})">[删除]</a> 
                         </div>   
                      </li>
                      <hr class="hr1"/>
                     <!--{/foreach}-->
                    </ul>
                    <div class="smb ar">共<b>{$goods_number}</b>件商品 共计<strong>¥:{$order_amount}</strong><br><a href="flow.php">
    <img src="themes/chengrenyongpin/images/car1_14.jpg" width="120" alt="去结算">
    </a></div>  
                 <!--{else}-->
                    您的购物车暂无商品
                <!--{/if}--> 


以上代码仅供参考。如需要使用,需要结合以下CSS代码,请同步复制到相应 目录 文件或嵌入相关文件中
  1. .car_ul {
  2.     background: none repeat scroll 0 0 #FFFFFF;
  3.     border: 1px solid #F5859D;
  4.     display: none;
  5.     float: left;
  6.     margin-top: 4px;
  7.     padding: 5px;
  8.     position: absolute;
  9.     right: -1px;
  10.     top: 20px;
  11.     width: 270px;
  12. }
  13. .car_ul li {
  14.     padding: 3px 0;
  15. }
  16. .car_ul li {
  17.     line-height: 22px;
  18.     width: 270px;
  19. }
  20. .car_ul .f_l {
  21.     float: left;
  22.     width: 177px;
  23. }
  24. .car_ul .f_r {
  25.     float: right;
  26.     padding-top: 2px;
  27.     text-align: right;
  28.     width: 90px;
  29. }
  30. car_ul .name {
  31.     float: left;
  32.     height: 46px;
  33.     line-height: 23px;
  34.     overflow: hidden;
  35.     padding: 2px 0 0 5px;
  36.     width: 117px;
  37. }
  38. .car_ul .f_r b {
  39.     color: #FF0000;
  40. }
  41. .car_ul .f_r .del {
  42.     color: #999999;
  43. }
复制代码

当然。这里默认这个详单是display:none的。需要您通过js进行调用将期display:block。
接下来,就是要改 程序 了:
打开/include/lib_insert.php找到function insert_cart_info()。将其改成以下内容
  1. function insert_cart_info1()
    {
        $sql = 'SELECT c.*,g.goods_name,g.goods_thumb,g.goods_id,c.goods_number,c.goods_price' .
               ' FROM ' . $GLOBALS['ecs']->table('cart') ." AS c ".
                                             " LEFT JOIN ".$GLOBALS['ecs']->table('goods')." AS g ON g.goods_id=c.goods_id ".
               " WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "'";
        $row = $GLOBALS['db']->GetAll($sql);
                    $arr = array();
                    foreach($row AS $k=>$v)
                    {
                                    $arr[$k]['goods_thumb']  =get_image_path($v['goods_id'], $v['goods_thumb'], true);
            $arr[$k]['short_name']   = $GLOBALS['_CFG']['goods_name_length'] > 0 ?
                                                   sub_str($v['goods_name'], $GLOBALS['_CFG']['goods_name_length']) : $v['goods_name'];
                                    $arr[$k]['url']          = build_uri('goods', array('gid' => $v['goods_id']), $v['goods_name']);
                                    $arr[$k]['goods_number'] = $v['goods_number'];
                                    $arr[$k]['goods_name']   = $v['goods_name'];
                                    $arr[$k]['goods_price']  = price_format($v['goods_price']);
                                    $arr[$k]['rec_id']       = $v['rec_id'];
                    }
        $sql = 'SELECT SUM(goods_number) AS number, SUM(goods_price * goods_number) AS amount' .
               ' FROM ' . $GLOBALS['ecs']->table('cart') .
               " WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "'";
        $row = $GLOBALS['db']->GetRow($sql);


        if ($row)
        {
            $number = intval($row['number']);
            $amount = floatval($row['amount']);
        }
        else
        {
            $number = 0;
            $amount = 0;
        }


        $GLOBALS['smarty']->assign('str',sprintf($GLOBALS['_LANG']['cart_info'], $number, price_format($amount, false)));
            $GLOBALS['smarty']->assign('goods11',$arr);
            $GLOBALS['smarty']->assign('goods_number',$number);
            $GLOBALS['smarty']->assign('order_amount',$amount);
        $output = $GLOBALS['smarty']->fetch('library/car_info.lbi');
        return $output;
    }


这样,就大功告成了!! 购物车 详细内容会显示了。但关键的是 购物车 中的删除。这个就要我们重新写入相应程序了才行。
我们在 网站 根目录建一个文件为delete_cart_goods.php。它的作用,来专门负责 购物车 进行更新的那么一个程序(其实只用于删除 购物车 的订单)
<?php
define('IN_ECS', true);
require(dirname(__FILE__) . '/includes/init.php');
include_once('includes/cls_json.php');
$result = array('error' => 0, 'message' => '', 'content' => '', 'goods_id' => '');
$json  = new JSON;
if($_POST['id'])
{
$sql = 'DELETE FROM '.$GLOBALS['ecs']->table('cart')." WHERE rec_id=".$_POST['id'];
$GLOBALS['db']->query($sql);
}
$sql = 'SELECT c.*,g.goods_name,g.goods_thumb,g.goods_id,c.goods_number,c.goods_price' .
                         ' FROM ' . $GLOBALS['ecs']->table('cart') ." AS c ".
                         " LEFT JOIN ".$GLOBALS['ecs']->table('goods')." AS g ON g.goods_id=c.goods_id ".
                         " WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "'";
$row = $GLOBALS['db']->GetAll($sql);
$arr = array();
foreach($row AS $k=>$v)
{
                $arr[$k]['goods_thumb']  =get_image_path($v['goods_id'], $v['goods_thumb'], true);
                $arr[$k]['short_name']   = $GLOBALS['_CFG']['goods_name_length'] > 0 ?
                                                                                                                                                                         sub_str($v['goods_name'], $GLOBALS['_CFG']['goods_name_length']) : $v['goods_name'];
                $arr[$k]['url']          = build_uri('goods', array('gid' => $v['goods_id']), $v['goods_name']);
                $arr[$k]['goods_number'] = $v['goods_number'];
                $arr[$k]['goods_name']   = $v['goods_name'];
                $arr[$k]['goods_price']  = price_format($v['goods_price']);
                $arr[$k]['rec_id']       = $v['rec_id'];
}
$sql = 'SELECT SUM(goods_number) AS number, SUM(goods_price * goods_number) AS amount' .
                         ' FROM ' . $GLOBALS['ecs']->table('cart') .
                         " WHERE session_id = '" . SESS_ID . "' AND rec_type = '" . CART_GENERAL_GOODS . "'";
$row = $GLOBALS['db']->GetRow($sql);
if ($row)
{
                $number = intval($row['number']);
                $amount = floatval($row['amount']);
}
else
{
                $number = 0;
                $amount = 0;
}
$GLOBALS['smarty']->assign('str',sprintf($GLOBALS['_LANG']['cart_info'], $number, price_format($amount, false)));
$GLOBALS['smarty']->assign('goods11',$arr);
$GLOBALS['smarty']->assign('goods_number',$number);
$GLOBALS['smarty']->assign('order_amount',$amount);
$result['content'] = $GLOBALS['smarty']->fetch('library/car_info.lbi');
die($json->encode($result));
?>


代码如上了,但细心的人看,这其实和lib_insert中的insert_cart_info函数是一样的,只是最后一行不一样,一个是输出到json 数据 组,一个直接返回。
这样有了这些以后就只差模板中的JS调用了。我们给删除 链接 添加了代码<a class="del" href="javascript:">[删除]</a>
插入deleteCartGoods这个js就行了。在这里 提示 一下,使用Jquery和使用EC自带的JS写法是有一定区别的,JQuery 我在这里就不写了,因为我火柴网的确没有使用,我也就懒得写了。
  1. <script type="text/javascript">
  2. function deleteCartGoods(rec_id)
  3. {
  4. Ajax.call('delete_cart_goods.php', 'id='+rec_id, deleteCartGoodsResp**e, 'POST', 'JSON');
  5. }
  6. /**
  7. * 接收删除后返回的信息
  8. */
  9. function deleteCartGoodsResp**e(res)
  10. {
  11.   if (res.error)
  12.   {
  13.     alert(res.err_msg);
  14.   }
  15.   else
  16.   {
  17.       document.getElementById('ECS_CARTINFO').innerHTML = res.content;//这里的ID需要改一下
  18.   }
  19. }
  20. </script>
复制代码


原理很简单,先发送删除指令,然后将返回的json数据重新加载到ECS_CARTINFO中的代码中就行了。

到此,大功告成!!
;