1882 lines
54 KiB
PHP
Executable File
1882 lines
54 KiB
PHP
Executable File
<?php
|
||
|
||
if (!defined('IN_ECS'))
|
||
{
|
||
die('Hacking attempt');
|
||
}
|
||
|
||
/**
|
||
* 创建像这样的查询: "IN('a','b')";
|
||
*
|
||
* @access public
|
||
* @param mix $item_list 列表数组或字符串
|
||
* @param string $field_name 字段名称
|
||
*
|
||
* @return void
|
||
*/
|
||
function db_create_in($item_list, $field_name = '')
|
||
{
|
||
if (empty($item_list))
|
||
{
|
||
return $field_name . " IN ('') ";
|
||
}
|
||
else
|
||
{
|
||
if (!is_array($item_list))
|
||
{
|
||
$item_list = explode(',', $item_list);
|
||
}
|
||
$item_list = array_unique($item_list);
|
||
$item_list_tmp = '';
|
||
foreach ($item_list AS $item)
|
||
{
|
||
if ($item !== '')
|
||
{
|
||
$item_list_tmp .= $item_list_tmp ? ",'$item'" : "'$item'";
|
||
}
|
||
}
|
||
if (empty($item_list_tmp))
|
||
{
|
||
return $field_name . " IN ('') ";
|
||
}
|
||
else
|
||
{
|
||
return $field_name . ' IN (' . $item_list_tmp . ') ';
|
||
}
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 验证输入的邮件地址是否合法
|
||
*
|
||
* @access public
|
||
* @param string $email 需要验证的邮件地址
|
||
*
|
||
* @return bool
|
||
*/
|
||
function is_email($user_email)
|
||
{
|
||
$chars = "/^([a-z0-9+_]|\\-|\\.)+@(([a-z0-9_]|\\-)+\\.)+[a-z]{2,6}\$/i";
|
||
if (strpos($user_email, '@') !== false && strpos($user_email, '.') !== false)
|
||
{
|
||
if (preg_match($chars, $user_email))
|
||
{
|
||
return true;
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 验证输入的手机号码是否合法
|
||
*
|
||
* @access public
|
||
* @param string $mobile_phone
|
||
* 需要验证的手机号码
|
||
*
|
||
* @return bool
|
||
*/
|
||
function is_mobile ($mobile_phone)
|
||
{
|
||
|
||
$chars = "/^09[0-9]{8}$/";
|
||
if(preg_match($chars, $mobile_phone))
|
||
{
|
||
return true;
|
||
}
|
||
|
||
return false;
|
||
}
|
||
|
||
/**
|
||
* 检查是否为一个合法的时间格式
|
||
*
|
||
* @access public
|
||
* @param string $time
|
||
* @return void
|
||
*/
|
||
function is_time($time)
|
||
{
|
||
$pattern = '/[\d]{4}-[\d]{1,2}-[\d]{1,2}\s[\d]{1,2}:[\d]{1,2}:[\d]{1,2}/';
|
||
|
||
return preg_match($pattern, $time);
|
||
}
|
||
|
||
/**
|
||
* 获得查询时间和次数,并赋值给smarty
|
||
*
|
||
* @access public
|
||
* @return void
|
||
*/
|
||
function assign_query_info()
|
||
{
|
||
if ($GLOBALS['db']->queryTime == '')
|
||
{
|
||
$query_time = 0;
|
||
}
|
||
else
|
||
{
|
||
if (PHP_VERSION >= '5.0.0')
|
||
{
|
||
$query_time = number_format(microtime(true) - $GLOBALS['db']->queryTime, 6);
|
||
}
|
||
else
|
||
{
|
||
list($now_usec, $now_sec) = explode(' ', microtime());
|
||
list($start_usec, $start_sec) = explode(' ', $GLOBALS['db']->queryTime);
|
||
$query_time = number_format(($now_sec - $start_sec) + ($now_usec - $start_usec), 6);
|
||
}
|
||
}
|
||
$GLOBALS['smarty']->assign('query_info', sprintf($GLOBALS['_LANG']['query_info'], $GLOBALS['db']->queryCount, $query_time));
|
||
|
||
/* 内存占用情况 */
|
||
if ($GLOBALS['_LANG']['memory_info'] && function_exists('memory_get_usage'))
|
||
{
|
||
$GLOBALS['smarty']->assign('memory_info', sprintf($GLOBALS['_LANG']['memory_info'], memory_get_usage() / 1048576));
|
||
}
|
||
|
||
/* 是否启用了 gzip */
|
||
$gzip_enabled = gzip_enabled() ? $GLOBALS['_LANG']['gzip_enabled'] : $GLOBALS['_LANG']['gzip_disabled'];
|
||
$GLOBALS['smarty']->assign('gzip_enabled', $gzip_enabled);
|
||
}
|
||
|
||
function assign_menu_info()
|
||
{
|
||
global $_LANG;
|
||
include_once('includes/inc_menu.php');
|
||
|
||
include_once('includes/inc_priv.php');
|
||
|
||
foreach ($modules AS $key => $value)
|
||
{
|
||
ksort($modules[$key]);
|
||
}
|
||
ksort($modules);
|
||
|
||
foreach ($modules AS $key => $val)
|
||
{
|
||
$menus[$key]['label'] = $_LANG[$key];
|
||
if (is_array($val))
|
||
{
|
||
foreach ($val AS $k => $v)
|
||
{
|
||
if ( isset($purview[$k]))
|
||
{
|
||
if (is_array($purview[$k]))
|
||
{
|
||
$boole = false;
|
||
foreach ($purview[$k] as $action)
|
||
{
|
||
$boole = $boole || admin_priv($action, '', false);
|
||
}
|
||
if (!$boole)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
}
|
||
else
|
||
{
|
||
if (! admin_priv($purview[$k], '', false))
|
||
{
|
||
continue;
|
||
}
|
||
}
|
||
}
|
||
if ($k == 'ucenter_setup' && $_CFG['integrate_code'] != 'ucenter')
|
||
{
|
||
continue;
|
||
}
|
||
$menus[$key]['children'][$k]['label'] = $_LANG[$k];
|
||
$menus[$key]['children'][$k]['action'] = $v;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$menus[$key]['action'] = $val;
|
||
}
|
||
|
||
// 如果children的子元素长度为0则删除该组
|
||
if(empty($menus[$key]['children']))
|
||
{
|
||
unset($menus[$key]);
|
||
}
|
||
|
||
}
|
||
|
||
$GLOBALS['smarty']->assign('menus', $menus);
|
||
$GLOBALS['smarty']->assign('no_help', $_LANG['no_help']);
|
||
$GLOBALS['smarty']->assign('help_lang', $_CFG['lang']);
|
||
$GLOBALS['smarty']->assign('charset', EC_CHARSET);
|
||
$GLOBALS['smarty']->assign('admin_id', $_SESSION['admin_id']);
|
||
|
||
}
|
||
|
||
/**
|
||
* 创建地区的返回信息
|
||
*
|
||
* @access public
|
||
* @param array $arr 地区数组 *
|
||
* @return void
|
||
*/
|
||
function region_result($parent, $sel_name, $type)
|
||
{
|
||
global $cp;
|
||
|
||
$arr = get_regions($type, $parent);
|
||
foreach ($arr AS $v)
|
||
{
|
||
$region =& $cp->add_node('region');
|
||
$region_id =& $region->add_node('id');
|
||
$region_name =& $region->add_node('name');
|
||
|
||
$region_id->set_data($v['region_id']);
|
||
$region_name->set_data($v['region_name']);
|
||
}
|
||
$select_obj =& $cp->add_node('select');
|
||
$select_obj->set_data($sel_name);
|
||
}
|
||
|
||
/**
|
||
* 获得指定国家的所有省份
|
||
*
|
||
* @access public
|
||
* @param int country 国家的编号
|
||
* @return array
|
||
*/
|
||
function get_regions($type = 0, $parent = 0)
|
||
{
|
||
$sql = 'SELECT region_id, region_name FROM ' . $GLOBALS['ecs']->table('region') .
|
||
" WHERE region_type = '$type' AND parent_id = '$parent'";
|
||
|
||
return $GLOBALS['db']->GetAll($sql);
|
||
}
|
||
|
||
|
||
function get_banks($parent = 0)
|
||
{
|
||
$sql = 'SELECT bank_code, bank_name FROM ' . $GLOBALS['ecs']->table('bank') .
|
||
" WHERE parent_id = '$parent' order by bank_code";
|
||
|
||
return $GLOBALS['db']->GetAll($sql);
|
||
}
|
||
|
||
function get_gamename_by_id($id = 0)
|
||
{
|
||
if($id>0){
|
||
$sql = 'SELECT games_name FROM ' . $GLOBALS['ecs']->table('games') .
|
||
" WHERE games_id = '$id'";
|
||
|
||
return $GLOBALS['db']->GetOne($sql);
|
||
}else{
|
||
return '電子錢包';
|
||
}
|
||
}
|
||
|
||
|
||
/**
|
||
* 初始化会员数据整合类
|
||
*
|
||
* @access public
|
||
* @return object
|
||
*/
|
||
function &init_users()
|
||
{
|
||
$set_modules = false;
|
||
static $cls = null;
|
||
if ($cls != null)
|
||
{
|
||
return $cls;
|
||
}
|
||
include_once(ROOT_PATH . 'includes/modules/integrates/' . $GLOBALS['_CFG']['integrate_code'] . '.php');
|
||
$cfg = unserialize($GLOBALS['_CFG']['integrate_config']);
|
||
$cls = new $GLOBALS['_CFG']['integrate_code']($cfg);
|
||
|
||
return $cls;
|
||
}
|
||
|
||
/**
|
||
* 获得指定分类下的子分类的数组
|
||
*
|
||
* @access public
|
||
* @param int $cat_id 分类的ID
|
||
* @param int $selected 当前选中分类的ID
|
||
* @param boolean $re_type 返回的类型: 值为真时返回下拉列表,否则返回数组
|
||
* @param int $level 限定返回的级数。为0时返回所有级数
|
||
* @param int $is_show_all 如果为true显示所有分类,如果为false隐藏不可见分类。
|
||
* @return mix
|
||
*/
|
||
function cat_list($cat_id = 0, $selected = 0, $re_type = true, $level = 0, $is_show_all = true)
|
||
{
|
||
static $res = NULL;
|
||
|
||
if ($res === NULL)
|
||
{
|
||
$data = read_static_cache('cat_pid_releate');
|
||
if ($data === false)
|
||
{
|
||
$sql = "SELECT c.cat_id, c.cat_name, c.measure_unit, c.parent_id, c.is_show, c.show_in_nav, c.grade, c.sort_order, COUNT(s.cat_id) AS has_children ".
|
||
'FROM ' . $GLOBALS['ecs']->table('category') . " AS c ".
|
||
"LEFT JOIN " . $GLOBALS['ecs']->table('category') . " AS s ON s.parent_id=c.cat_id ".
|
||
"GROUP BY c.cat_id ".
|
||
'ORDER BY c.parent_id, c.sort_order ASC';
|
||
$res = $GLOBALS['db']->getAll($sql);
|
||
|
||
$sql = "SELECT cat_id, COUNT(*) AS games_num " .
|
||
" FROM " . $GLOBALS['ecs']->table('games') .
|
||
" WHERE is_delete = 0 AND is_on_sale = 1 " .
|
||
" GROUP BY cat_id";
|
||
$res2 = $GLOBALS['db']->getAll($sql);
|
||
|
||
$sql = "SELECT gc.cat_id, COUNT(*) AS goods_num " .
|
||
" FROM " . $GLOBALS['ecs']->table('games_cat') . " AS gc , " . $GLOBALS['ecs']->table('games') . " AS g " .
|
||
" WHERE g.games_id = gc.games_id AND g.is_delete = 0 AND g.is_on_sale = 1 " .
|
||
" GROUP BY gc.cat_id";
|
||
$res3 = $GLOBALS['db']->getAll($sql);
|
||
|
||
$newres = array();
|
||
foreach($res2 as $k=>$v)
|
||
{
|
||
$newres[$v['cat_id']] = $v['games_num'];
|
||
foreach($res3 as $ks=>$vs)
|
||
{
|
||
if($v['cat_id'] == $vs['cat_id'])
|
||
{
|
||
$newres[$v['cat_id']] = $v['games_num'] + $vs['games_num'];
|
||
}
|
||
}
|
||
}
|
||
|
||
foreach($res as $k=>$v)
|
||
{
|
||
$res[$k]['games_num'] = !empty($newres[$v['cat_id']]) ? $newres[$v['cat_id']] : 0;
|
||
}
|
||
//如果数组过大,不采用静态缓存方式
|
||
if (count($res) <= 1000)
|
||
{
|
||
write_static_cache('cat_pid_releate', $res);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$res = $data;
|
||
}
|
||
}
|
||
|
||
if (empty($res) == true)
|
||
{
|
||
return $re_type ? '' : array();
|
||
}
|
||
|
||
$options = cat_options($cat_id, $res); // 获得指定分类下的子分类的数组
|
||
|
||
$children_level = 99999; //大于这个分类的将被删除
|
||
if ($is_show_all == false)
|
||
{
|
||
foreach ($options as $key => $val)
|
||
{
|
||
if ($val['level'] > $children_level)
|
||
{
|
||
unset($options[$key]);
|
||
}
|
||
else
|
||
{
|
||
if ($val['is_show'] == 0)
|
||
{
|
||
unset($options[$key]);
|
||
if ($children_level > $val['level'])
|
||
{
|
||
$children_level = $val['level']; //标记一下,这样子分类也能删除
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$children_level = 99999; //恢复初始值
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
/* 截取到指定的缩减级别 */
|
||
if ($level > 0)
|
||
{
|
||
if ($cat_id == 0)
|
||
{
|
||
$end_level = $level;
|
||
}
|
||
else
|
||
{
|
||
$first_item = reset($options); // 获取第一个元素
|
||
$end_level = $first_item['level'] + $level;
|
||
}
|
||
|
||
/* 保留level小于end_level的部分 */
|
||
foreach ($options AS $key => $val)
|
||
{
|
||
if ($val['level'] >= $end_level)
|
||
{
|
||
unset($options[$key]);
|
||
}
|
||
}
|
||
}
|
||
|
||
if ($re_type == true)
|
||
{
|
||
$select = '';
|
||
foreach ($options AS $var)
|
||
{
|
||
$select .= '<option value="' . $var['cat_id'] . '" ';
|
||
$select .= ($selected == $var['cat_id']) ? "selected='ture'" : '';
|
||
$select .= '>';
|
||
if ($var['level'] > 0)
|
||
{
|
||
$select .= str_repeat(' ', $var['level'] * 4);
|
||
}
|
||
$select .= htmlspecialchars(addslashes($var['cat_name']), ENT_QUOTES) . '</option>';
|
||
}
|
||
|
||
return $select;
|
||
}
|
||
else
|
||
{
|
||
foreach ($options AS $key => $value)
|
||
{
|
||
$options[$key]['url'] = build_uri('category', array('cid' => $value['cat_id']), $value['cat_name']);
|
||
}
|
||
|
||
return $options;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 过滤和排序所有分类,返回一个带有缩进级别的数组
|
||
*
|
||
* @access private
|
||
* @param int $cat_id 上级分类ID
|
||
* @param array $arr 含有所有分类的数组
|
||
* @param int $level 级别
|
||
* @return void
|
||
*/
|
||
function cat_options($spec_cat_id, $arr)
|
||
{
|
||
static $cat_options = array();
|
||
|
||
if (isset($cat_options[$spec_cat_id]))
|
||
{
|
||
return $cat_options[$spec_cat_id];
|
||
}
|
||
|
||
if (!isset($cat_options[0]))
|
||
{
|
||
$level = $last_cat_id = 0;
|
||
$options = $cat_id_array = $level_array = array();
|
||
$data = read_static_cache('cat_option_static');
|
||
if ($data === false)
|
||
{
|
||
while (!empty($arr))
|
||
{
|
||
foreach ($arr AS $key => $value)
|
||
{
|
||
$cat_id = $value['cat_id'];
|
||
if ($level == 0 && $last_cat_id == 0)
|
||
{
|
||
if ($value['parent_id'] > 0)
|
||
{
|
||
break;
|
||
}
|
||
|
||
$options[$cat_id] = $value;
|
||
$options[$cat_id]['level'] = $level;
|
||
$options[$cat_id]['id'] = $cat_id;
|
||
$options[$cat_id]['name'] = $value['cat_name'];
|
||
unset($arr[$key]);
|
||
|
||
if ($value['has_children'] == 0)
|
||
{
|
||
continue;
|
||
}
|
||
$last_cat_id = $cat_id;
|
||
$cat_id_array = array($cat_id);
|
||
$level_array[$last_cat_id] = ++$level;
|
||
continue;
|
||
}
|
||
|
||
if ($value['parent_id'] == $last_cat_id)
|
||
{
|
||
$options[$cat_id] = $value;
|
||
$options[$cat_id]['level'] = $level;
|
||
$options[$cat_id]['id'] = $cat_id;
|
||
$options[$cat_id]['name'] = $value['cat_name'];
|
||
unset($arr[$key]);
|
||
|
||
if ($value['has_children'] > 0)
|
||
{
|
||
if (end($cat_id_array) != $last_cat_id)
|
||
{
|
||
$cat_id_array[] = $last_cat_id;
|
||
}
|
||
$last_cat_id = $cat_id;
|
||
$cat_id_array[] = $cat_id;
|
||
$level_array[$last_cat_id] = ++$level;
|
||
}
|
||
}
|
||
elseif ($value['parent_id'] > $last_cat_id)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
$count = count($cat_id_array);
|
||
if ($count > 1)
|
||
{
|
||
$last_cat_id = array_pop($cat_id_array);
|
||
}
|
||
elseif ($count == 1)
|
||
{
|
||
if ($last_cat_id != end($cat_id_array))
|
||
{
|
||
$last_cat_id = end($cat_id_array);
|
||
}
|
||
else
|
||
{
|
||
$level = 0;
|
||
$last_cat_id = 0;
|
||
$cat_id_array = array();
|
||
continue;
|
||
}
|
||
}
|
||
|
||
if ($last_cat_id && isset($level_array[$last_cat_id]))
|
||
{
|
||
$level = $level_array[$last_cat_id];
|
||
}
|
||
else
|
||
{
|
||
$level = 0;
|
||
}
|
||
}
|
||
//如果数组过大,不采用静态缓存方式
|
||
if (count($options) <= 2000)
|
||
{
|
||
write_static_cache('cat_option_static', $options);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$options = $data;
|
||
}
|
||
$cat_options[0] = $options;
|
||
}
|
||
else
|
||
{
|
||
$options = $cat_options[0];
|
||
}
|
||
|
||
if (!$spec_cat_id)
|
||
{
|
||
return $options;
|
||
}
|
||
else
|
||
{
|
||
if (empty($options[$spec_cat_id]))
|
||
{
|
||
return array();
|
||
}
|
||
|
||
$spec_cat_id_level = $options[$spec_cat_id]['level'];
|
||
|
||
foreach ($options AS $key => $value)
|
||
{
|
||
if ($key != $spec_cat_id)
|
||
{
|
||
unset($options[$key]);
|
||
}
|
||
else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
$spec_cat_id_array = array();
|
||
foreach ($options AS $key => $value)
|
||
{
|
||
if (($spec_cat_id_level == $value['level'] && $value['cat_id'] != $spec_cat_id) ||
|
||
($spec_cat_id_level > $value['level']))
|
||
{
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
$spec_cat_id_array[$key] = $value;
|
||
}
|
||
}
|
||
$cat_options[$spec_cat_id] = $spec_cat_id_array;
|
||
|
||
return $spec_cat_id_array;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 载入配置信息
|
||
*
|
||
* @access public
|
||
* @return array
|
||
*/
|
||
function load_config()
|
||
{
|
||
$arr = array();
|
||
|
||
$data = read_static_cache('shop_config');
|
||
|
||
if ($data === false)
|
||
{
|
||
$sql = 'SELECT code, value FROM ' . $GLOBALS['ecs']->table('shop_config') . ' WHERE parent_id > 0';
|
||
$res = $GLOBALS['db']->getAll($sql);
|
||
|
||
foreach ($res AS $row)
|
||
{
|
||
$arr[$row['code']] = $row['value'];
|
||
}
|
||
|
||
/* 对数值型设置处理 */
|
||
|
||
if (!isset($GLOBALS['_CFG']['ecs_version']))
|
||
{
|
||
/* 如果没有版本号则默认为2.0.5 */
|
||
$GLOBALS['_CFG']['ecs_version'] = 'v1.0.0';
|
||
}
|
||
|
||
//限定语言项
|
||
$lang_array = array('zh_cn', 'zh_tw', 'en_us');
|
||
if (empty($arr['lang']) || !in_array($arr['lang'], $lang_array))
|
||
{
|
||
$arr['lang'] = 'zh_tw'; // 默认语言为简体中文
|
||
}
|
||
|
||
if (empty($arr['integrate_code']))
|
||
{
|
||
$arr['integrate_code'] = 'ecshop'; // 默认的会员整合插件为 ecshop
|
||
}
|
||
write_static_cache('shop_config', $arr);
|
||
}
|
||
else
|
||
{
|
||
$arr = $data;
|
||
}
|
||
|
||
return $arr;
|
||
}
|
||
|
||
/**
|
||
* 获得指定分类下所有底层分类的ID
|
||
*
|
||
* @access public
|
||
* @param integer $cat 指定的分类ID
|
||
* @return string
|
||
*/
|
||
function get_children($cat = 0)
|
||
{
|
||
return 'g.cat_id ' . db_create_in(array_unique(array_merge(array($cat), array_keys(cat_list($cat, 0, false)))));
|
||
}
|
||
|
||
/**
|
||
* 获得指定文章分类下所有底层分类的ID
|
||
*
|
||
* @access public
|
||
* @param integer $cat 指定的分类ID
|
||
*
|
||
* @return void
|
||
*/
|
||
function get_article_children ($cat = 0)
|
||
{
|
||
return db_create_in(array_unique(array_merge(array($cat), array_keys(article_cat_list($cat, 0, false)))), 'cat_id');
|
||
}
|
||
|
||
/**
|
||
* 获取邮件模板
|
||
*
|
||
* @access public
|
||
* @param: $tpl_name[string] 模板代码
|
||
*
|
||
* @return array
|
||
*/
|
||
function get_mail_template($tpl_name)
|
||
{
|
||
$sql = 'SELECT template_subject, is_html, template_content FROM ' . $GLOBALS['ecs']->table('mail_templates') . " WHERE template_code = '$tpl_name'";
|
||
|
||
return $GLOBALS['db']->GetRow($sql);
|
||
|
||
}
|
||
|
||
/**
|
||
* 记录订单操作记录
|
||
*
|
||
* @access public
|
||
* @param string $order_sn 订单编号
|
||
* @param integer $order_status 订单状态
|
||
* @param integer $shipping_status 配送状态
|
||
* @param integer $pay_status 付款状态
|
||
* @param string $note 备注
|
||
* @param string $username 用户名,用户自己的操作则为 buyer
|
||
* @return void
|
||
*/
|
||
function order_action($order_sn, $order_status, $shipping_status, $pay_status, $note = '', $username = null, $place = 0)
|
||
{
|
||
if (is_null($username))
|
||
{
|
||
$username = $_SESSION['admin_name'];
|
||
}
|
||
|
||
$sql = 'INSERT INTO ' . $GLOBALS['ecs']->table('order_action') .
|
||
' (order_id, action_user, order_status, shipping_status, pay_status, action_place, action_note, log_time) ' .
|
||
'SELECT ' .
|
||
"order_id, '$username', '$order_status', '$shipping_status', '$pay_status', '$place', '$note', '" .gmtime() . "' " .
|
||
'FROM ' . $GLOBALS['ecs']->table('order_info') . " WHERE order_sn = '$order_sn'";
|
||
$GLOBALS['db']->query($sql);
|
||
}
|
||
|
||
/**
|
||
* 格式化商品价格
|
||
*
|
||
* @access public
|
||
* @param float $price 商品价格
|
||
* @return string
|
||
*/
|
||
function price_format($price, $change_price = true)
|
||
{
|
||
if($price==='')
|
||
{
|
||
$price=0;
|
||
}
|
||
if ($change_price && defined('ECS_ADMIN') === false)
|
||
{
|
||
switch ($GLOBALS['_CFG']['price_format'])
|
||
{
|
||
case 0:
|
||
$price = number_format($price, 2, '.', '');
|
||
break;
|
||
case 1: // 保留不为 0 的尾数
|
||
$price = preg_replace('/(.*)(\\.)([0-9]*?)0+$/', '\1\2\3', number_format($price, 2, '.', ''));
|
||
|
||
if (substr($price, -1) == '.')
|
||
{
|
||
$price = substr($price, 0, -1);
|
||
}
|
||
break;
|
||
case 2: // 不四舍五入,保留1位
|
||
$price = substr(number_format($price, 2, '.', ''), 0, -1);
|
||
break;
|
||
case 3: // 直接取整
|
||
$price = intval($price);
|
||
break;
|
||
case 4: // 四舍五入,保留 1 位
|
||
$price = number_format($price, 1, '.', '');
|
||
break;
|
||
case 5: // 先四舍五入,不保留小数
|
||
$price = round($price);
|
||
break;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$price = number_format($price, 2, '.', '');
|
||
}
|
||
|
||
return sprintf($GLOBALS['_CFG']['currency_format'], $price);
|
||
}
|
||
|
||
|
||
|
||
/**
|
||
* 获取指定 id snatch 活动的结果
|
||
*
|
||
* @access public
|
||
* @param int $id snatch_id
|
||
*
|
||
* @return array array(user_name, bie_price, bid_time, num)
|
||
* num通常为1,如果为2表示有2个用户取到最小值,但结果只返回最早出价用户。
|
||
*/
|
||
function get_snatch_result($id)
|
||
{
|
||
$sql = 'SELECT u.user_id, u.user_name, lg.bid_price, lg.bid_time, count(*) as num' .
|
||
' FROM ' . $GLOBALS['ecs']->table('snatch_log') . ' AS lg '.
|
||
' LEFT JOIN ' . $GLOBALS['ecs']->table('users') . ' AS u ON lg.user_id = u.user_id'.
|
||
" WHERE lg.snatch_id = '$id'".
|
||
' GROUP BY lg.bid_price' .
|
||
' ORDER BY num ASC, lg.bid_price ASC, lg.bid_time ASC LIMIT 1';
|
||
$rec = $GLOBALS['db']->GetRow($sql);
|
||
|
||
if ($rec)
|
||
{
|
||
$rec['bid_time'] = local_date($GLOBALS['_CFG']['time_format'], $rec['bid_time']);
|
||
$rec['formated_bid_price'] = price_format($rec['bid_price'], false);
|
||
|
||
/* 活动信息 */
|
||
$sql = 'SELECT ext_info " .
|
||
" FROM ' . $GLOBALS['ecs']->table('goods_activity') .
|
||
" WHERE act_id= '$id' AND act_type=" . GAT_SNATCH.
|
||
" LIMIT 1";
|
||
$row = $GLOBALS['db']->getOne($sql);
|
||
$info = unserialize($row);
|
||
|
||
if (!empty($info['max_price']))
|
||
{
|
||
$rec['buy_price'] = ($rec['bid_price'] > $info['max_price']) ? $info['max_price'] : $rec['bid_price'];
|
||
}
|
||
else
|
||
{
|
||
$rec['buy_price'] = $rec['bid_price'];
|
||
}
|
||
|
||
|
||
|
||
/* 检查订单 */
|
||
$sql = "SELECT COUNT(*)" .
|
||
" FROM " . $GLOBALS['ecs']->table('order_info') .
|
||
" WHERE extension_code = 'snatch'" .
|
||
" AND extension_id = '$id'" .
|
||
" AND order_status " . db_create_in(array(OS_CONFIRMED, OS_UNCONFIRMED));
|
||
|
||
$rec['order_count'] = $GLOBALS['db']->getOne($sql);
|
||
}
|
||
|
||
return $rec;
|
||
}
|
||
|
||
/**
|
||
* 清除指定后缀的模板缓存或编译文件
|
||
*
|
||
* @access public
|
||
* @param bool $is_cache 是否清除缓存还是清出编译文件
|
||
* @param string $ext 需要删除的文件名,不包含后缀
|
||
*
|
||
* @return int 返回清除的文件个数
|
||
*/
|
||
function clear_tpl_files($is_cache = true, $ext = '')
|
||
{
|
||
$dirs = array();
|
||
|
||
if (isset($GLOBALS['shop_id']) && $GLOBALS['shop_id'] > 0)
|
||
{
|
||
$tmp_dir = DATA_DIR ;
|
||
}
|
||
else
|
||
{
|
||
$tmp_dir = 'temp';
|
||
}
|
||
if ($is_cache)
|
||
{
|
||
$cache_dir = ROOT_PATH . $tmp_dir . '/caches/';
|
||
$dirs[] = ROOT_PATH . $tmp_dir . '/query_caches/';
|
||
$dirs[] = ROOT_PATH . $tmp_dir . '/static_caches/';
|
||
for($i = 0; $i < 16; $i++)
|
||
{
|
||
$hash_dir = $cache_dir . dechex($i);
|
||
$dirs[] = $hash_dir . '/';
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$dirs[] = ROOT_PATH . $tmp_dir . '/compiled/';
|
||
$dirs[] = ROOT_PATH . $tmp_dir . '/compiled/admin/';
|
||
}
|
||
|
||
$str_len = strlen($ext);
|
||
$count = 0;
|
||
|
||
foreach ($dirs AS $dir)
|
||
{
|
||
$folder = @opendir($dir);
|
||
|
||
if ($folder === false)
|
||
{
|
||
continue;
|
||
}
|
||
|
||
while ($file = readdir($folder))
|
||
{
|
||
if ($file == '.' || $file == '..' || $file == 'index.htm' || $file == 'index.html')
|
||
{
|
||
continue;
|
||
}
|
||
if (is_file($dir . $file))
|
||
{
|
||
/* 如果有文件名则判断是否匹配 */
|
||
$pos = ($is_cache) ? strrpos($file, '_') : strrpos($file, '.');
|
||
|
||
if ($str_len > 0 && $pos !== false)
|
||
{
|
||
$ext_str = substr($file, 0, $pos);
|
||
|
||
if ($ext_str == $ext)
|
||
{
|
||
if (@unlink($dir . $file))
|
||
{
|
||
$count++;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (@unlink($dir . $file))
|
||
{
|
||
$count++;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
closedir($folder);
|
||
}
|
||
|
||
return $count;
|
||
}
|
||
|
||
/**
|
||
* 清除模版编译文件
|
||
*
|
||
* @access public
|
||
* @param mix $ext 模版文件名, 不包含后缀
|
||
* @return void
|
||
*/
|
||
function clear_compiled_files($ext = '')
|
||
{
|
||
return clear_tpl_files(false, $ext);
|
||
}
|
||
|
||
/**
|
||
* 清除缓存文件
|
||
*
|
||
* @access public
|
||
* @param mix $ext 模版文件名, 不包含后缀
|
||
* @return void
|
||
*/
|
||
function clear_cache_files($ext = '')
|
||
{
|
||
return clear_tpl_files(true, $ext);
|
||
}
|
||
|
||
/**
|
||
* 清除模版编译和缓存文件
|
||
*
|
||
* @access public
|
||
* @param mix $ext 模版文件名后缀
|
||
* @return void
|
||
*/
|
||
function clear_all_files($ext = '')
|
||
{
|
||
return clear_tpl_files(false, $ext) + clear_tpl_files(true, $ext);
|
||
}
|
||
|
||
/**
|
||
* 页面上调用的js文件
|
||
*
|
||
* @access public
|
||
* @param string $files
|
||
* @return void
|
||
*/
|
||
function smarty_insert_scripts($args)
|
||
{
|
||
static $scripts = array();
|
||
|
||
$arr = explode(',', str_replace(' ','',$args['files']));
|
||
|
||
$str = '';
|
||
foreach ($arr AS $val)
|
||
{
|
||
if (in_array($val, $scripts) == false)
|
||
{
|
||
$scripts[] = $val;
|
||
if ($val{0} == '.')
|
||
{
|
||
$str .= '<script type="text/javascript" src="' . $val . '"></script>';
|
||
}
|
||
else
|
||
{
|
||
$str .= '<script type="text/javascript" src="js/' . $val . '"></script>';
|
||
}
|
||
}
|
||
}
|
||
|
||
return $str;
|
||
}
|
||
|
||
/**
|
||
* 创建分页的列表
|
||
*
|
||
* @access public
|
||
* @param integer $count
|
||
* @return string
|
||
*/
|
||
function smarty_create_pages($params)
|
||
{
|
||
extract($params);
|
||
|
||
$str = '';
|
||
$len = 10;
|
||
|
||
if (empty($page))
|
||
{
|
||
$page = 1;
|
||
}
|
||
|
||
if (!empty($count))
|
||
{
|
||
$step = 1;
|
||
$str .= "<option value='1'>1</option>";
|
||
|
||
for ($i = 2; $i < $count; $i += $step)
|
||
{
|
||
$step = ($i >= $page + $len - 1 || $i <= $page - $len + 1) ? $len : 1;
|
||
$str .= "<option value='$i'";
|
||
$str .= $page == $i ? " selected='true'" : '';
|
||
$str .= ">$i</option>";
|
||
}
|
||
|
||
if ($count > 1)
|
||
{
|
||
$str .= "<option value='$count'";
|
||
$str .= $page == $count ? " selected='true'" : '';
|
||
$str .= ">$count</option>";
|
||
}
|
||
}
|
||
|
||
return $str;
|
||
}
|
||
|
||
/**
|
||
* 重写 URL 地址
|
||
*
|
||
* @access public
|
||
* @param string $app 执行程序
|
||
* @param array $params 参数数组
|
||
* @param string $append 附加字串
|
||
* @param integer $page 页数
|
||
* @param string $keywords 搜索关键词字符串
|
||
* @return void
|
||
*/
|
||
function build_uri($app, $params, $append = '', $page = 0, $keywords = '', $size = 0)
|
||
{
|
||
static $rewrite = NULL;
|
||
|
||
if ($rewrite === NULL)
|
||
{
|
||
$rewrite = intval($GLOBALS['_CFG']['rewrite']);
|
||
}
|
||
|
||
$args = array('cid' => 0,
|
||
'gid' => 0,
|
||
'bid' => 0,
|
||
'acid' => 0,
|
||
'aid' => 0,
|
||
'sid' => 0,
|
||
'gbid' => 0,
|
||
'auid' => 0,
|
||
'sort' => '',
|
||
'order' => '',
|
||
);
|
||
|
||
extract(array_merge($args, $params));
|
||
|
||
$uri = '';
|
||
switch ($app)
|
||
{
|
||
case 'category':
|
||
if (empty($cid))
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
if ($rewrite)
|
||
{
|
||
$uri = 'category-' . $cid;
|
||
if (isset($bid))
|
||
{
|
||
$uri .= '-b' . $bid;
|
||
}
|
||
if (isset($price_min))
|
||
{
|
||
$uri .= '-min'.$price_min;
|
||
}
|
||
if (isset($price_max))
|
||
{
|
||
$uri .= '-max'.$price_max;
|
||
}
|
||
if (isset($filter_attr))
|
||
{
|
||
$uri .= '-attr' . $filter_attr;
|
||
}
|
||
if (!empty($page))
|
||
{
|
||
$uri .= '-' . $page;
|
||
}
|
||
if (!empty($sort))
|
||
{
|
||
$uri .= '-' . $sort;
|
||
}
|
||
if (!empty($order))
|
||
{
|
||
$uri .= '-' . $order;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$uri = 'category.php?id=' . $cid;
|
||
if (!empty($bid))
|
||
{
|
||
$uri .= '&brand=' . $bid;
|
||
}
|
||
if (isset($price_min))
|
||
{
|
||
$uri .= '&price_min=' . $price_min;
|
||
}
|
||
if (isset($price_max))
|
||
{
|
||
$uri .= '&price_max=' . $price_max;
|
||
}
|
||
if (!empty($filter_attr))
|
||
{
|
||
$uri .='&filter_attr=' . $filter_attr;
|
||
}
|
||
|
||
if (!empty($page))
|
||
{
|
||
$uri .= '&page=' . $page;
|
||
}
|
||
if (!empty($sort))
|
||
{
|
||
$uri .= '&sort=' . $sort;
|
||
}
|
||
if (!empty($order))
|
||
{
|
||
$uri .= '&order=' . $order;
|
||
}
|
||
}
|
||
}
|
||
|
||
break;
|
||
case 'goods':
|
||
if (empty($gid))
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
$uri = $rewrite ? 'goods-' . $gid : 'goods.php?id=' . $gid;
|
||
}
|
||
|
||
break;
|
||
case 'brand':
|
||
if (empty($bid))
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
if ($rewrite)
|
||
{
|
||
$uri = 'brand-' . $bid;
|
||
if (isset($cid))
|
||
{
|
||
$uri .= '-c' . $cid;
|
||
}
|
||
if (!empty($page))
|
||
{
|
||
$uri .= '-' . $page;
|
||
}
|
||
if (!empty($sort))
|
||
{
|
||
$uri .= '-' . $sort;
|
||
}
|
||
if (!empty($order))
|
||
{
|
||
$uri .= '-' . $order;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$uri = 'brand.php?id=' . $bid;
|
||
if (!empty($cid))
|
||
{
|
||
$uri .= '&cat=' . $cid;
|
||
}
|
||
if (!empty($page))
|
||
{
|
||
$uri .= '&page=' . $page;
|
||
}
|
||
if (!empty($sort))
|
||
{
|
||
$uri .= '&sort=' . $sort;
|
||
}
|
||
if (!empty($order))
|
||
{
|
||
$uri .= '&order=' . $order;
|
||
}
|
||
}
|
||
}
|
||
|
||
break;
|
||
case 'article_cat':
|
||
if (empty($acid))
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
if ($rewrite)
|
||
{
|
||
$uri = 'article_cat-' . $acid;
|
||
if (!empty($page))
|
||
{
|
||
$uri .= '-' . $page;
|
||
}
|
||
if (!empty($sort))
|
||
{
|
||
$uri .= '-' . $sort;
|
||
}
|
||
if (!empty($order))
|
||
{
|
||
$uri .= '-' . $order;
|
||
}
|
||
if (!empty($keywords))
|
||
{
|
||
$uri .= '-' . $keywords;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$uri = 'article_cat.php?id=' . $acid;
|
||
if (!empty($page))
|
||
{
|
||
$uri .= '&page=' . $page;
|
||
}
|
||
if (!empty($sort))
|
||
{
|
||
$uri .= '&sort=' . $sort;
|
||
}
|
||
if (!empty($order))
|
||
{
|
||
$uri .= '&order=' . $order;
|
||
}
|
||
if (!empty($keywords))
|
||
{
|
||
$uri .= '&keywords=' . $keywords;
|
||
}
|
||
}
|
||
}
|
||
|
||
break;
|
||
case 'article':
|
||
if (empty($aid))
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
$uri = $rewrite ? 'article-' . $aid : 'article.php?id=' . $aid;
|
||
}
|
||
|
||
break;
|
||
case 'group_buy':
|
||
if (empty($gbid))
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
$uri = $rewrite ? 'group_buy-' . $gbid : 'group_buy.php?act=view&id=' . $gbid;
|
||
}
|
||
|
||
break;
|
||
case 'auction':
|
||
if (empty($auid))
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
$uri = $rewrite ? 'auction-' . $auid : 'auction.php?act=view&id=' . $auid;
|
||
}
|
||
|
||
break;
|
||
case 'snatch':
|
||
if (empty($sid))
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
$uri = $rewrite ? 'snatch-' . $sid : 'snatch.php?id=' . $sid;
|
||
}
|
||
|
||
break;
|
||
case 'search':
|
||
break;
|
||
case 'exchange':
|
||
if ($rewrite)
|
||
{
|
||
$uri = 'exchange-' . $cid;
|
||
if (isset($price_min))
|
||
{
|
||
$uri .= '-min'.$price_min;
|
||
}
|
||
if (isset($price_max))
|
||
{
|
||
$uri .= '-max'.$price_max;
|
||
}
|
||
if (!empty($page))
|
||
{
|
||
$uri .= '-' . $page;
|
||
}
|
||
if (!empty($sort))
|
||
{
|
||
$uri .= '-' . $sort;
|
||
}
|
||
if (!empty($order))
|
||
{
|
||
$uri .= '-' . $order;
|
||
}
|
||
}
|
||
else
|
||
{
|
||
$uri = 'exchange.php?cat_id=' . $cid;
|
||
if (isset($price_min))
|
||
{
|
||
$uri .= '&integral_min=' . $price_min;
|
||
}
|
||
if (isset($price_max))
|
||
{
|
||
$uri .= '&integral_max=' . $price_max;
|
||
}
|
||
|
||
if (!empty($page))
|
||
{
|
||
$uri .= '&page=' . $page;
|
||
}
|
||
if (!empty($sort))
|
||
{
|
||
$uri .= '&sort=' . $sort;
|
||
}
|
||
if (!empty($order))
|
||
{
|
||
$uri .= '&order=' . $order;
|
||
}
|
||
}
|
||
|
||
break;
|
||
case 'exchange_goods':
|
||
if (empty($gid))
|
||
{
|
||
return false;
|
||
}
|
||
else
|
||
{
|
||
$uri = $rewrite ? 'exchange-id' . $gid : 'exchange.php?id=' . $gid . '&act=view';
|
||
}
|
||
|
||
break;
|
||
default:
|
||
return false;
|
||
break;
|
||
}
|
||
|
||
if ($rewrite)
|
||
{
|
||
if ($rewrite == 2 && !empty($append))
|
||
{
|
||
$uri .= '-' . urlencode(preg_replace('/[\.|\/|\?|&|\+|\\\|\'|"|,]+/', '', $append));
|
||
}
|
||
|
||
$uri .= '.html';
|
||
}
|
||
if (($rewrite == 2) && (strpos(strtolower(EC_CHARSET), 'utf') !== 0))
|
||
{
|
||
$uri = urlencode($uri);
|
||
}
|
||
return $uri;
|
||
}
|
||
|
||
/**
|
||
* 格式化重量:小于1千克用克表示,否则用千克表示
|
||
* @param float $weight 重量
|
||
* @return string 格式化后的重量
|
||
*/
|
||
function formated_weight($weight)
|
||
{
|
||
$weight = round(floatval($weight), 3);
|
||
if ($weight > 0)
|
||
{
|
||
if ($weight < 1)
|
||
{
|
||
/* 小于1千克,用克表示 */
|
||
return intval($weight * 1000) . $GLOBALS['_LANG']['gram'];
|
||
}
|
||
else
|
||
{
|
||
/* 大于1千克,用千克表示 */
|
||
return $weight . $GLOBALS['_LANG']['kilogram'];
|
||
}
|
||
}
|
||
else
|
||
{
|
||
return 0;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 记录帐户变动
|
||
* @param int $user_id 用户id
|
||
* @param float $user_money 可用余额变动
|
||
* @param float $frozen_money 冻结余额变动
|
||
* @param int $rank_points 等级积分变动
|
||
* @param int $pay_points 消费积分变动
|
||
* @param string $change_desc 变动说明
|
||
* @param int $change_type 变动类型:参见常量文件
|
||
* @return void
|
||
*/
|
||
function log_account_change($user_id, $user_money = 0, $frozen_money = 0, $rank_points = 0, $pay_points = 0, $change_desc = '', $change_type = ACT_OTHER, $token='')
|
||
{
|
||
/* 插入帐户变动记录 */
|
||
$account_log = array(
|
||
'user_id' => $user_id,
|
||
'user_money' => $user_money,
|
||
'frozen_money' => $frozen_money,
|
||
'rank_points' => $rank_points,
|
||
'pay_points' => $pay_points,
|
||
'change_time' => gmtime(),
|
||
'change_desc' => $change_desc,
|
||
'change_type' => $change_type,
|
||
'token' => $token
|
||
);
|
||
$GLOBALS['db']->autoExecute($GLOBALS['ecs']->table('account_log'), $account_log, 'INSERT');
|
||
|
||
if($user_money!=0 && ($change_type==0 || $change_type==1)){
|
||
$uniqid=$change_type.uniqid();
|
||
$sql="INSERT INTO ".$GLOBALS['ecs']->table('bet_log')." (user_id,game_id,gameType,game_num,bet_num,bet_time,cal_time,bet_amount,valid_amount,win_or_loss,comm_amount,state,table_id,bet_type,other) ".
|
||
"VALUES ('".$user_id."', '1','0','0','".$uniqid."','".time()."','".time()."','0','0','0','0','0','0','0','') ";
|
||
|
||
$GLOBALS['db']->query($sql);
|
||
}
|
||
|
||
if($user_money!=0 && $change_type==0){
|
||
$sql="update ".$GLOBALS['ecs']->table('users')." set sdeposit=sdeposit+".abs($user_money).",deposit=deposit+1 where user_id=".$user_id;
|
||
|
||
$GLOBALS['db']->query($sql);
|
||
}
|
||
|
||
/* 更新用户信息 */
|
||
$sql = "UPDATE " . $GLOBALS['ecs']->table('users') .
|
||
" SET user_money = user_money + ('$user_money')," .
|
||
" frozen_money = frozen_money + ('$frozen_money')," .
|
||
" rank_points = rank_points + ('$rank_points'),";
|
||
$sql.= " pay_points = pay_points + ('$pay_points')" .
|
||
" WHERE user_id = '$user_id' LIMIT 1";
|
||
$GLOBALS['db']->query($sql);
|
||
|
||
}
|
||
|
||
|
||
/**
|
||
* 获得指定分类下的子分类的数组
|
||
*
|
||
* @access public
|
||
* @param int $cat_id 分类的ID
|
||
* @param int $selected 当前选中分类的ID
|
||
* @param boolean $re_type 返回的类型: 值为真时返回下拉列表,否则返回数组
|
||
* @param int $level 限定返回的级数。为0时返回所有级数
|
||
* @return mix
|
||
*/
|
||
function article_cat_list($cat_id = 0, $selected = 0, $re_type = true, $level = 0)
|
||
{
|
||
static $res = NULL;
|
||
|
||
if ($res === NULL)
|
||
{
|
||
$data = read_static_cache('art_cat_pid_releate');
|
||
if ($data === false)
|
||
{
|
||
$sql = "SELECT c.*, COUNT(s.cat_id) AS has_children, COUNT(a.article_id) AS aricle_num ".
|
||
' FROM ' . $GLOBALS['ecs']->table('article_cat') . " AS c".
|
||
" LEFT JOIN " . $GLOBALS['ecs']->table('article_cat') . " AS s ON s.parent_id=c.cat_id".
|
||
" LEFT JOIN " . $GLOBALS['ecs']->table('article') . " AS a ON a.cat_id=c.cat_id".
|
||
" GROUP BY c.cat_id ".
|
||
" ORDER BY parent_id, sort_order ASC";
|
||
$res = $GLOBALS['db']->getAll($sql);
|
||
write_static_cache('art_cat_pid_releate', $res);
|
||
}
|
||
else
|
||
{
|
||
$res = $data;
|
||
}
|
||
}
|
||
|
||
if (empty($res) == true)
|
||
{
|
||
return $re_type ? '' : array();
|
||
}
|
||
|
||
$options = article_cat_options($cat_id, $res); // 获得指定分类下的子分类的数组
|
||
|
||
/* 截取到指定的缩减级别 */
|
||
if ($level > 0)
|
||
{
|
||
if ($cat_id == 0)
|
||
{
|
||
$end_level = $level;
|
||
}
|
||
else
|
||
{
|
||
$first_item = reset($options); // 获取第一个元素
|
||
$end_level = $first_item['level'] + $level;
|
||
}
|
||
|
||
/* 保留level小于end_level的部分 */
|
||
foreach ($options AS $key => $val)
|
||
{
|
||
if ($val['level'] >= $end_level)
|
||
{
|
||
unset($options[$key]);
|
||
}
|
||
}
|
||
}
|
||
|
||
$pre_key = 0;
|
||
foreach ($options AS $key => $value)
|
||
{
|
||
$options[$key]['has_children'] = 1;
|
||
if ($pre_key > 0)
|
||
{
|
||
if ($options[$pre_key]['cat_id'] == $options[$key]['parent_id'])
|
||
{
|
||
$options[$pre_key]['has_children'] = 1;
|
||
}
|
||
}
|
||
$pre_key = $key;
|
||
}
|
||
|
||
if ($re_type == true)
|
||
{
|
||
$select = '';
|
||
foreach ($options AS $var)
|
||
{
|
||
$select .= '<option value="' . $var['cat_id'] . '" ';
|
||
$select .= ' cat_type="' . $var['cat_type'] . '" ';
|
||
$select .= ($selected == $var['cat_id']) ? "selected='ture'" : '';
|
||
$select .= '>';
|
||
if ($var['level'] > 0)
|
||
{
|
||
$select .= str_repeat(' ', $var['level'] * 4);
|
||
}
|
||
$select .= htmlspecialchars(addslashes($var['cat_name'])) . '</option>';
|
||
}
|
||
|
||
return $select;
|
||
}
|
||
else
|
||
{
|
||
foreach ($options AS $key => $value)
|
||
{
|
||
$options[$key]['url'] = build_uri('article_cat', array('acid' => $value['cat_id']), $value['cat_name']);
|
||
}
|
||
return $options;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 过滤和排序所有文章分类,返回一个带有缩进级别的数组
|
||
*
|
||
* @access private
|
||
* @param int $cat_id 上级分类ID
|
||
* @param array $arr 含有所有分类的数组
|
||
* @param int $level 级别
|
||
* @return void
|
||
*/
|
||
function article_cat_options($spec_cat_id, $arr)
|
||
{
|
||
static $cat_options = array();
|
||
|
||
if (isset($cat_options[$spec_cat_id]))
|
||
{
|
||
return $cat_options[$spec_cat_id];
|
||
}
|
||
|
||
if (!isset($cat_options[0]))
|
||
{
|
||
$level = $last_cat_id = 0;
|
||
$options = $cat_id_array = $level_array = array();
|
||
while (!empty($arr))
|
||
{
|
||
foreach ($arr AS $key => $value)
|
||
{
|
||
$cat_id = $value['cat_id'];
|
||
if ($level == 0 && $last_cat_id == 0)
|
||
{
|
||
if ($value['parent_id'] > 0)
|
||
{
|
||
break;
|
||
}
|
||
|
||
$options[$cat_id] = $value;
|
||
$options[$cat_id]['level'] = $level;
|
||
$options[$cat_id]['id'] = $cat_id;
|
||
$options[$cat_id]['name'] = $value['cat_name'];
|
||
unset($arr[$key]);
|
||
|
||
if ($value['has_children'] == 0)
|
||
{
|
||
continue;
|
||
}
|
||
$last_cat_id = $cat_id;
|
||
$cat_id_array = array($cat_id);
|
||
$level_array[$last_cat_id] = ++$level;
|
||
continue;
|
||
}
|
||
|
||
if ($value['parent_id'] == $last_cat_id)
|
||
{
|
||
$options[$cat_id] = $value;
|
||
$options[$cat_id]['level'] = $level;
|
||
$options[$cat_id]['id'] = $cat_id;
|
||
$options[$cat_id]['name'] = $value['cat_name'];
|
||
unset($arr[$key]);
|
||
|
||
if ($value['has_children'] > 0)
|
||
{
|
||
if (end($cat_id_array) != $last_cat_id)
|
||
{
|
||
$cat_id_array[] = $last_cat_id;
|
||
}
|
||
$last_cat_id = $cat_id;
|
||
$cat_id_array[] = $cat_id;
|
||
$level_array[$last_cat_id] = ++$level;
|
||
}
|
||
}
|
||
elseif ($value['parent_id'] > $last_cat_id)
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
$count = count($cat_id_array);
|
||
if ($count > 1)
|
||
{
|
||
$last_cat_id = array_pop($cat_id_array);
|
||
}
|
||
elseif ($count == 1)
|
||
{
|
||
if ($last_cat_id != end($cat_id_array))
|
||
{
|
||
$last_cat_id = end($cat_id_array);
|
||
}
|
||
else
|
||
{
|
||
$level = 0;
|
||
$last_cat_id = 0;
|
||
$cat_id_array = array();
|
||
continue;
|
||
}
|
||
}
|
||
|
||
if ($last_cat_id && isset($level_array[$last_cat_id]))
|
||
{
|
||
$level = $level_array[$last_cat_id];
|
||
}
|
||
else
|
||
{
|
||
$level = 0;
|
||
}
|
||
}
|
||
$cat_options[0] = $options;
|
||
}
|
||
else
|
||
{
|
||
$options = $cat_options[0];
|
||
}
|
||
|
||
if (!$spec_cat_id)
|
||
{
|
||
return $options;
|
||
}
|
||
else
|
||
{
|
||
if (empty($options[$spec_cat_id]))
|
||
{
|
||
return array();
|
||
}
|
||
|
||
$spec_cat_id_level = $options[$spec_cat_id]['level'];
|
||
|
||
foreach ($options AS $key => $value)
|
||
{
|
||
if ($key != $spec_cat_id)
|
||
{
|
||
unset($options[$key]);
|
||
}
|
||
else
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
$spec_cat_id_array = array();
|
||
foreach ($options AS $key => $value)
|
||
{
|
||
if (($spec_cat_id_level == $value['level'] && $value['cat_id'] != $spec_cat_id) ||
|
||
($spec_cat_id_level > $value['level']))
|
||
{
|
||
break;
|
||
}
|
||
else
|
||
{
|
||
$spec_cat_id_array[$key] = $value;
|
||
}
|
||
}
|
||
$cat_options[$spec_cat_id] = $spec_cat_id_array;
|
||
|
||
return $spec_cat_id_array;
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 调用UCenter的函数
|
||
*
|
||
* @param string $func
|
||
* @param array $params
|
||
*
|
||
* @return mixed
|
||
*/
|
||
function uc_call($func, $params=null)
|
||
{
|
||
restore_error_handler();
|
||
if (!function_exists($func))
|
||
{
|
||
include_once(ROOT_PATH . 'uc_client/client.php');
|
||
}
|
||
|
||
$res = call_user_func_array($func, $params);
|
||
|
||
set_error_handler('exception_handler');
|
||
|
||
return $res;
|
||
}
|
||
|
||
/**
|
||
* error_handle回调函数
|
||
*
|
||
* @return
|
||
*/
|
||
function exception_handler($errno, $errstr, $errfile, $errline)
|
||
{
|
||
return;
|
||
}
|
||
|
||
/**
|
||
* 重新获得商品图片与商品相册的地址
|
||
*
|
||
* @param int $goods_id 商品ID
|
||
* @param string $image 原商品相册图片地址
|
||
* @param boolean $thumb 是否为缩略图
|
||
* @param string $call 调用方法(商品图片还是商品相册)
|
||
* @param boolean $del 是否删除图片
|
||
*
|
||
* @return string $url
|
||
*/
|
||
function get_image_path($goods_id, $image='', $thumb=false, $call='goods', $del=false)
|
||
{
|
||
$url = empty($image) ? $GLOBALS['_CFG']['no_picture'] : $image;
|
||
return $url;
|
||
}
|
||
|
||
/**
|
||
* 调用使用UCenter插件时的函数
|
||
*
|
||
* @param string $func
|
||
* @param array $params
|
||
*
|
||
* @return mixed
|
||
*/
|
||
function user_uc_call($func, $params = null)
|
||
{
|
||
if (isset($GLOBALS['_CFG']['integrate_code']) && $GLOBALS['_CFG']['integrate_code'] == 'ucenter')
|
||
{
|
||
restore_error_handler();
|
||
if (!function_exists($func))
|
||
{
|
||
include_once(ROOT_PATH . 'includes/lib_uc.php');
|
||
}
|
||
|
||
$res = call_user_func_array($func, $params);
|
||
|
||
set_error_handler('exception_handler');
|
||
|
||
return $res;
|
||
}
|
||
else
|
||
{
|
||
return;
|
||
}
|
||
|
||
}
|
||
|
||
/**
|
||
* 调用array_combine函数
|
||
*
|
||
* @param array $keys
|
||
* @param array $values
|
||
*
|
||
* @return $combined
|
||
*/
|
||
if (!function_exists('array_combine')) {
|
||
function array_combine($keys, $values)
|
||
{
|
||
if (!is_array($keys)) {
|
||
user_error('array_combine() expects parameter 1 to be array, ' .
|
||
gettype($keys) . ' given', E_USER_WARNING);
|
||
return;
|
||
}
|
||
|
||
if (!is_array($values)) {
|
||
user_error('array_combine() expects parameter 2 to be array, ' .
|
||
gettype($values) . ' given', E_USER_WARNING);
|
||
return;
|
||
}
|
||
|
||
$key_count = count($keys);
|
||
$value_count = count($values);
|
||
if ($key_count !== $value_count) {
|
||
user_error('array_combine() Both parameters should have equal number of elements', E_USER_WARNING);
|
||
return false;
|
||
}
|
||
|
||
if ($key_count === 0 || $value_count === 0) {
|
||
user_error('array_combine() Both parameters should have number of elements at least 0', E_USER_WARNING);
|
||
return false;
|
||
}
|
||
|
||
$keys = array_values($keys);
|
||
$values = array_values($values);
|
||
|
||
$combined = array();
|
||
for ($i = 0; $i < $key_count; $i++) {
|
||
$combined[$keys[$i]] = $values[$i];
|
||
}
|
||
|
||
return $combined;
|
||
}
|
||
}
|
||
|
||
function check_mobile(){
|
||
$useragent=$_SERVER['HTTP_USER_AGENT'];
|
||
if(preg_match('/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i',$useragent)||preg_match('/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i',substr($useragent,0,4))){
|
||
return true;
|
||
}
|
||
return false;
|
||
}
|
||
?>
|