ecshop可多次使用的红包功能

ecshop 添加可多次使用的红包步骤
1) 添加一种新的红包类型4 ,
文件 admin/templates/bonus_type_info.htm 
找到  <input type="radio" name="send_type" value="0" {if $bonus_arr.send_type eq 0} checked="true" {/if} onClick="showunit(0)"  />{$lang.send_by[0]}
      <input type="radio" name="send_type" value="1" {if $bonus_arr.send_type eq 1} checked="true" {/if} onClick="showunit(1)"  />{$lang.send_by[1]}
      <input type="radio" name="send_type" value="2" {if $bonus_arr.send_type eq 2} checked="true" {/if} onClick="showunit(2)"  />{$lang.send_by[2]}
      <input type="radio" name="send_type" value="3" {if $bonus_arr.send_type eq 3} checked="true" {/if} onClick="showunit(3)"  />{$lang.send_by[3]}
      再其后面添加
<input type="radio" name="send_type" value="4" {if $bonus_arr.send_type eq 4} checked="true" {/if} onClick="showunit(4)"  />通用红包 多次使用

2) 生成这类红包字符串
增加文件 admin/templates/bonus_by_print_phpsir.htm 点此下载 bonus_by_print_phpsir
修改文件 admin/bonus.php 找到
 elseif ($_REQUEST['send_by'] == SEND_BY_PRINT)
    {
        $smarty->assign('type_list',    get_bonus_type());

        $smarty->display('bonus_by_print.htm');
    }

    再其后添加
     elseif ($_REQUEST['send_by'] == 4)
    {
        $smarty->assign('type_list',    get_bonus_type_phpsir());

        $smarty->display('bonus_by_print_phpsir.htm');
    }

3) 增加 get_bonus_type_phpsir 函数 
文件 admin/includes/lib_main.php

function get_bonus_type_phpsir()
{
    $bonus = array();
    $sql = 'SELECT type_id, type_name, type_money FROM ' . $GLOBALS['ecs']->table('bonus_type') .
           ' WHERE send_type = 4';
    $res = $GLOBALS['db']->query($sql);

    while ($row = $GLOBALS['db']->fetchRow($res))
    {
        $bonus[$row['type_id']] = $row['type_name'].' [' .sprintf($GLOBALS['_CFG']['currency_format'], $row['type_money']).']';
    }

    return $bonus;
}

4) 在 bonus.php 里面 找到 
if ($_REQUEST['act'] == 'send_by_print')
{
...........................
}
再其后面添加,处理增加这类红包时候生成方法

if ($_REQUEST['act'] == 'send_by_print_phpsir')
{
    @set_time_limit(0);

    /* 红下红包的类型ID和生成的数量的处理 */
    $bonus_typeid = !empty($_POST['bonus_type_id']) ? $_POST['bonus_type_id'] : 0;
    $bonus_sum    = !empty($_POST['bonus_sum'])     ? $_POST['bonus_sum']     : 1;

    /* 生成红包序列号 */

    for ($i = 0, $j = 0; $i < $bonus_sum; $i++)
    {
        $bonus_sn = $_POST['bonus_txt'];
        $db->query("INSERT INTO ".$ecs->table('user_bonus')." (bonus_type_id, bonus_sn) VALUES('$bonus_typeid', '$bonus_sn')");

        $j++;
    }

    /* 记录管理员操作 */
    admin_log($bonus_sn, 'add', 'userbonus');

    /* 清除缓存 */
    clear_cache_files();

    /* 提示信息 */
    $link[0]['text'] = $_LANG['back_bonus_list'];
    $link[0]['href'] = 'bonus.php?act=bonus_list&bonus_type=' . $bonus_typeid;

    sys_msg($_LANG['creat_bonus'] . $j . $_LANG['creat_bonus_num'], 0, $link);
}

5) 修改 bonus.php 让后台显示红包内容
if ($_REQUEST['act'] == 'bonus_list')
{
...........................
}
和
if ($_REQUEST['act'] == 'query_bonus')
{
...........................
}
里面增加
 if ($bonus_type['send_type'] == 4)
    {
        $smarty->assign('show_bonus_sn', 1);
    }

至此 后台部分完成

前台部分 修改 
includes/lib_order.php

function bonus_info($bonus_id, $bonus_sn = '')
{
    $sql = "SELECT t.*, b.* " .
            "FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," .
                $GLOBALS['ecs']->table('user_bonus') . " AS b " .
            "WHERE t.type_id = b.bonus_type_id    ";

    if ($bonus_id > 0)
    {
        $sql .= " AND b.bonus_id = '$bonus_id'";
        $row = $GLOBALS['db']->getRow($sql);
        return $row;
    }
    else
    {
        $sql .= " AND b.bonus_sn = '$bonus_sn'";
        $row = $GLOBALS['db']->getRow($sql);
    }

    if($row['send_type'] == 4) // phpsir 如果是第4类型红包,那么就找一个未使用的红包,这种红包可被多次使用,不限制每人使用次数
    {
        $sess_userid = $_SESSION["user_id"];
        $sql = "SELECT t.*, b.* " .
                "FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," .
                    $GLOBALS['ecs']->table('user_bonus') . " AS b " .
                "WHERE t.type_id = b.bonus_type_id  and b.used_time = 0  ";
        if ($bonus_id > 0)
        {
            $sql .= "AND b.bonus_id = '$bonus_id'";
        }
        else
        {
            $sql .= "AND b.bonus_sn = '$bonus_sn'";
        }
//print $sql;

        $row = $GLOBALS['db']->getRow($sql);
        //var_dump($row);
        return $row;

    }

// 如果想每人只使用N次,请用下面的部分
/*
  if($row['send_type'] == 4) // phpsir 如果是第4类型红包,那么就找一个未使用的红包,这种红包可被多次使用,不限制每人使用次数
    {
        $sess_userid = $_SESSION["user_id"];
        $sql = "SELECT t.*, b.* " .
                "FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," .
                    $GLOBALS['ecs']->table('user_bonus') . " AS b " .
                "WHERE t.type_id = b.bonus_type_id  and b.user_id = '$sess_userid'   and  b.bonus_sn = '$bonus_sn' ";
        $rows = $GLOBALS['db']->getAll($sql);
        $allow_used_bonus_num = 2; // 最大允许使用次数
        if(count($rows) >= $allow_used_bonus_num )
        {
            return false;
        }else{
            $sql = "SELECT t.*, b.* " .
                    "FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," .
                        $GLOBALS['ecs']->table('user_bonus') . " AS b " .
                    "WHERE t.type_id = b.bonus_type_id  and b.used_time = 0   and  b.bonus_sn = '$bonus_sn' ";
            $row = $GLOBALS['db']->getRow($sql);
            return $row;
        }

    }

*/ 

    return $row;

}

红包txt

2015-03-31 付:
今天有人要求在 user.php 里面增加红包的函数里面也增加 此类功能,付如下

function add_bonus($user_id, $bouns_sn)
{
    if (empty($user_id))
    {
        $GLOBALS['err']->add($GLOBALS['_LANG']['not_login']);

        return false;
    }


	 
    /* 查询红包序列号是否已经存在 */
    $sql = "SELECT bonus_id, bonus_sn, user_id, bonus_type_id FROM " .$GLOBALS['ecs']->table('user_bonus') .
         " WHERE bonus_sn = '$bouns_sn'";


    $row = $GLOBALS['db']->getRow($sql);
	//var_dump($row);
    if ($row)
    {
		//phpsir 
		 if($row['send_type'] == 4) // phpsir 如果是第4类型红包,那么就找一个未使用的红包,这种红包可被多次使用,不限制每人使用次数
		{
   		      $sql = "SELECT t.*, b.* " .
					"FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," .
						$GLOBALS['ecs']->table('user_bonus') . " AS b " .
					"WHERE t.type_id = b.bonus_type_id     and user_id  = '$user_id' ";
			if ($bonus_id > 0)
			{
				$sql .= "AND b.bonus_id = '$bonus_id'";
			}
			else
			{
				$sql .= "AND b.bonus_sn = '$bouns_sn'";
			}
			//echo $sql; 
			$row = $GLOBALS['db']->getRow($sql);       
			//var_dump($row);
			  // 此处是限制某用户只能使用一次此红包 仅仅在用户没有使用过的情况下,进入下面的语句中,分发一个未用红包。
			if(!$row){
                           
				$sql = "SELECT t.*, b.* " .
				"FROM " . $GLOBALS['ecs']->table('bonus_type') . " AS t," .
				$GLOBALS['ecs']->table('user_bonus') . " AS b " .
				"WHERE t.type_id = b.bonus_type_id  and b.used_time = 0   and user_id  = 0   ";
				if ($bonus_id > 0)
				{
				$sql .= "AND b.bonus_id = '$bonus_id'";
				}
				else
				{
				$sql .= "AND b.bonus_sn = '$bouns_sn'";
				}
				//echo $sql; 
				$row = $GLOBALS['db']->getRow($sql);       
				//var_dump($row);

			}


		}





        if ($row['user_id'] == 0)
        {
            //红包没有被使用
            $sql = "SELECT send_end_date, use_end_date ".
                   " FROM " . $GLOBALS['ecs']->table('bonus_type') .
                   " WHERE type_id = '" . $row['bonus_type_id'] . "'";

            $bonus_time = $GLOBALS['db']->getRow($sql);

            $now = gmtime();
            if ($now > $bonus_time['use_end_date'])
            {
                $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_use_expire']);
                return false;
            }

            $sql = "UPDATE " .$GLOBALS['ecs']->table('user_bonus') . " SET user_id = '$user_id' ".
                   "WHERE bonus_id = '$row[bonus_id]'";
            $result = $GLOBALS['db'] ->query($sql);
            if ($result)
            {
                 return true;
            }
            else
            {
                return $GLOBALS['db']->errorMsg();
            }
        }
        else
        {
            if ($row['user_id']== $user_id)
            {
                //红包已经添加过了。
                $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_is_used']);
            }
            else
            {
                //红包被其他人使用过了。
                $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_is_used_by_other']);
            }

            return false;
        }
    }
    else
    {
        //红包不存在
        $GLOBALS['err']->add($GLOBALS['_LANG']['bonus_not_exist']);
        return false;
    }

}