xss_clean((string)$url, true));
$url = str_ireplace([''], '', $url);
if ($is_html) {
$url = htmlspecialchars($url);
}
return $url;
}
/**
* 模糊比较两个变量
* @param $str1 变量1
* @param $str2 变量2
* @return 判断两个变量是否相等
*/
function dr_diff($str1, $str2) {
if (is_array($str1) && is_array($str2)) {
return array_diff($str1, $str2) ? false : true;
} elseif (dr_strlen($str1) != dr_strlen($str2)) {
return false;
}
return $str1 == $str2;
}
/**
* 返回包含数组中所有键名的一个新数组
* @param $array 指定数组
* @param $value 具体值
* @param $strict 严格比较
* @return 返回包含数组中所有键名的一个新数组
*/
function dr_array_keys($array, $value = '', $strict = false) {
if (!$array || !is_array($array)) {
return 0;
}
if ($value) {
return array_keys($array, $value, $strict);
} else {
return array_keys($array);
}
}
/**
* 返回包含数组中指定键名的对应值
* @param $array 指定数组
* @param $key 数组key
* @return 返回包含数组中指定键名的对应值
*/
function dr_array_value($array, $key) {
if (!$array || !is_array($array)) {
return NULL;
} elseif (is_array($key)) {
return NULL;
} elseif (isset($array[$key])) {
return $array[$key];
} else {
return NULL;
}
}
/**
* 判断存在于数组中
* @param $var|array 指定值或数组
* @param $array 指定数组
* @return 判断$var是否存在于数组$array中
*/
function dr_in_array($var, $array) {
if (!$array || !is_array($array)) {
return 0;
} elseif (is_array($var)) {
return array_intersect($var, $array);
} else {
return in_array($var, $array);
}
}
/**
* 两个数组比较
* @param $arr1 指定数组1
* @param $arr2 指定数组2
* @return 比较两个数组的键值,并返回交集
*/
function dr_array_intersect($arr1, $arr2) {
if (!is_array($arr1) || !is_array($arr2)) {
return false;
}
return array_intersect($arr1, $arr2);
}
/**
* 两个数组比较
* @param $arr1 指定数组1
* @param $arr2 指定数组2
* @return 比较两个数组的键名,并返回交集
*/
function dr_array_intersect_key($arr1, $arr2) {
if (!is_array($arr1) || !is_array($arr2)) {
return false;
}
return array_intersect_key($arr1, $arr2);
}
/**
* 字符长度
* @param $string 字符串
* @return 返回字符串的长度
*/
function dr_strlen($string) {
if (is_array($string)) {
return dr_count($string);
}
return strlen((string)$string);
}
/**
* 读取 php.ini 容量参数并转为字节数
* @param $name ini 参数名,如 post_max_size
* @return int 字节数,无效或无限返回 0
*/
function dr_ini_get_bytes($name) {
if (!function_exists('ini_get')) {
return 0;
}
$val = ini_get($name);
if ($val === false || $val === '' || $val === '-1') {
return 0;
}
$val = trim($val);
$num = (float) $val;
$unit = strtolower(substr($val, -1));
if ($unit === 'g') {
return (int) ($num * 1073741824);
} elseif ($unit === 'm') {
return (int) ($num * 1048576);
} elseif ($unit === 'k') {
return (int) ($num * 1024);
}
return (int) $num;
}
/**
* 表单编辑器内容最大字节数(依据 php.ini 的 post_max_size)
* @return int
*/
function dr_form_editor_max_length() {
static $max;
if ($max !== null) {
return $max;
}
$max = dr_ini_get_bytes('post_max_size');
if ($max > 0) {
$uploadMax = dr_ini_get_bytes('upload_max_filesize');
if ($uploadMax > 0 && $uploadMax < $max) {
$max -= $uploadMax;
}
$max = (int) max(1048576, $max * 0.85);
} else {
$max = 8388608;
}
return $max;
}
/**
* 字符是否包含
* @param $string 原字符串
* @param $key 查询的字符串
* @return 返回$string中是否包含$key,区分大小写
*/
function dr_strpos($string, $key) {
return strpos((string)$string, $key);
}
/**
* 字符是否包含
* @param $string 原字符串
* @param $key 查询的字符串
* @return 返回$string中是否包含$key,不区分大小写
*/
function dr_stripos($string, $key) {
return stripos((string)$string, $key);
}
/**
* 上传移动文件
* @param $tempfile 临时文件
* @param $fullname 存储文件
* @return 将临时文件存储到指定的目录中
*/
function dr_move_uploaded_file($tempfile, $fullname) {
$contentType = $_SERVER['CONTENT_TYPE'] ?? getenv('CONTENT_TYPE');
if ($contentType && $_SERVER['HTTP_CONTENT_RANGE']
&& strpos($contentType, 'multipart') !== false && strpos($_SERVER['HTTP_CONTENT_RANGE'], 'bytes') === 0) {
// 命名一个新名称
$value = str_replace('bytes ', '', $_SERVER['HTTP_CONTENT_RANGE']);
list($str, $total) = explode('/', $value);
list($str, $max) = explode('-', $str);
// 分段名称
$temp_file = dirname($fullname).'/'.md5($_SERVER['HTTP_CONTENT_DISPOSITION']);
if ($total - $max < 1024) {
// 减去误差表示分段上传完毕
if (!file_put_contents($temp_file, file_get_contents($tempfile), FILE_APPEND)) {
unlink($temp_file);
return false;
}
// 移动最终的文件
if (!rename($temp_file, $fullname)) {
unlink($temp_file);
return false;
}
unlink($temp_file);
return true;
} else {
// 正在分段上传
echo file_put_contents($temp_file, file_get_contents($tempfile), FILE_APPEND);exit;
}
} else {
return move_uploaded_file($tempfile, $fullname);
}
}
/**
* html实体字符转换
* @param $value 指定字符串
* @param $fullname 存储文件
* @return 用htmlspecialchars进行html转码值
*/
function dr_html2code($value) {
return htmlspecialchars((string)$value);
}
/**
* html实体字符转换
* @param $value 指定字符串
* @param $fk 强制转为utf8
* @param $flags 用下列标记中的一个或多个作为一个位掩码
* @return htmlspecialchars_decode进行html转码值
*/
function dr_code2html($value, $fk = false, $flags = '') {
return dr_html_code($value, $fk, $flags);
}
/**
* html实体字符转换
* @param $value 指定字符串
* @param $fk 强制转为utf8
* @param $flags 用下列标记中的一个或多个作为一个位掩码
* @return htmlspecialchars_decode进行html转码值
*/
function dr_html_code($value, $fk = false, $flags = '') {
if (!$value) {
return '';
}
!$flags && $flags = ENT_QUOTES | ENT_HTML401 | ENT_HTML5;
if ($fk) {
// 将所有HTML实体转换为它们的适用字符
return html_entity_decode($value, $flags, 'UTF-8');
}
// 将特殊的HTML实体转换回字符
return htmlspecialchars_decode($value, $flags);
}
/**
* 快捷登录接入商信息列表
* @return 返回文件数组
*/
function dr_oauth_list() {
$data = [];
$path = FCPATH.'ThirdParty/OAuth/';
$local = dr_dir_map($path, 1);
if ($local) {
foreach ($local as $dir) {
if (is_file($path.$dir.'/App.php')) {
$data[strtolower($dir)] = require $path.$dir.'/App.php';
}
}
}
return $data;
}
/**
* 判断是否是移动端终端
* @return bool
*/
if (!function_exists('dr_is_mobile')) {
function dr_is_mobile() {
if (defined('SITE_MOBILE_NOT_PAD') && SITE_MOBILE_NOT_PAD) {
// 判断是否为平板,将排除为移动端
$clientkeywords = [
'ipad',
];
// 从HTTP_USER_AGENT中查找关键字
if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower((string)$_SERVER['HTTP_USER_AGENT']))){
return false;
}
}
if (isset ($_SERVER['HTTP_X_WAP_PROFILE'])) {
// 如果有HTTP_X_WAP_PROFILE则一定是移动设备
return true;
} elseif (isset ($_SERVER['HTTP_USER_AGENT'])) {
// 判断手机发送的客户端标志,兼容性有待提高
$clientkeywords=['nokia','sony','ericsson','mot','samsung','htc','sgh','lg','sharp','sie-','philips','panasonic','alcatel','lenovo','iphone','xiaomi','ipod','blackberry','meizu','android','netfront','symbian','ucweb','windowsce','palm','operamini','operamobi','openwave','nexusone','cldc','midp','wap','mobile'];
// 从HTTP_USER_AGENT中查找手机浏览器的关键字
if (preg_match("/(" . implode('|', $clientkeywords) . ")/i", strtolower((string)$_SERVER['HTTP_USER_AGENT']))){
return true;
}
}
// 协议法,因为有可能不准确,放到最后判断
if (isset ($_SERVER['HTTP_ACCEPT'])) {
// 如果只支持wml并且不支持html那一定是移动设备
// 如果支持wml和html但是wml在html之前则是移动设备
if ((strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') !== false) && (strpos($_SERVER['HTTP_ACCEPT'], 'text/html') === false || (strpos($_SERVER['HTTP_ACCEPT'], 'vnd.wap.wml') < strpos($_SERVER['HTTP_ACCEPT'], 'text/html'))))
{
return true;
}
}
return false;
}
}
/**
* 后台搜索字段过滤函数
* @param $t 单个字段数组
* @return 是否被搜索时可用
*/
function dr_is_admin_search_field($t) {
if (!$t) {
return 0;
}
if (!$t['ismain']) {
return 0;
} elseif (in_array($t['fieldtype'], [
'Uid', 'Text', 'Textarea', 'Textbtn', 'Textselect',
'Ueditor', 'Select', 'Radio', 'Checkbox', 'Selects', 'Editor',
'Linkage', 'Linkages'
])) {
return 1;
}
return 0;
}
/**
* 通过数组值查找数组key
* @param $array 数组
* @param $value 指定键值
* @return 返回键值对应的键名
*/
function dr_get_array_key($array, $value) {
if ($array && !in_array($value, $array)) {
return false;
}
$new = array_flip($array);
return isset($new[$value]) ? $new[$value] : false;
}
/**
* 站点信息/项目信息的字段输出(自定义模板方式)
* @param $name 字段名
* @param $siteid 项目/站点id
* @return 字段值
*/
function dr_site_info($name, $siteid = SITE_ID) {
return \Phpcmf\Service::C()->get_cache('site', $siteid, 'config', $name);
}
/**
* 站点信息/项目信息的字段输出(自定义字段方式)
* @param $name 字段名
* @param $siteid 项目/站点id
* @return 字段值
*/
function dr_site_value($name, $siteid = SITE_ID) {
return \Phpcmf\Service::C()->get_cache('site', $siteid, 'param', $name);
}
/**
* ftable字段输出
* @param $id 字段id
* @param $value 存储值
* @param $class 给table指定class
* @return 表格
*/
function dr_get_ftable($id, $value, $class = '') {
$field = \Phpcmf\Service::C()->get_cache('table-field', $id);
if (!$field) {
return 'Ftable字段没有得到缓存数据';
}
return \Phpcmf\Service::L('Field')->get('ftable')->show_table($field, $value, $class);
}
/**
* ftable字段数组
* @param $id 字段id
* @param $value 存储值
* @return 表格输出
*/
function dr_get_ftable_array($id, $value) {
$field = \Phpcmf\Service::C()->get_cache('table-field', $id);
if (!$field) {
return [];
}
$value = dr_string2array($value);
if ($value) {
$img = [];
foreach ($field['setting']['option']['field'] as $n => $t) {
if ($t['type']) {
if ($t['type'] == 3) {
// 图片
$img[] = $n;
}
}
}
$rt = [];
foreach ($value as $row) {
if ($img) {
foreach ($img as $i) {
$row[$i] = dr_get_file($row[$i]);
}
}
$rt[] = $row;
}
return $rt;
}
return $value;
}
/**
* 获取内容中的缩略图
* @param $value 内容值
* @param $num 指定获取数量
* @return 在变量中提取img标签的图片路径到数组
*/
function dr_get_content_img($value, $num = 0) {
return dr_get_content_url($value, 'src', 'gif|jpg|jpeg|png', $num);
}
/**
* 获取内容中的指定标签URL地址
* @param $value 内容值
* @param $attr 标签值,例如src
* @param $ext 指定扩展名,例如jpg|gif
* @param $num 指定获取数量
* @return 在变量中提取img标签的图片路径到数组
*/
function dr_get_content_url($value, $attr, $ext, $num = 0) {
$rt = [];
if (!$value) {
return $rt;
}
$ext = str_replace(',', '|', $ext);
$value = preg_replace('/\.('.$ext.')@(.*)(\'|")/iU', '.$1$3', $value);
if (preg_match_all("/(".$attr.")=([\"|']?)([^ \"'>]+\.(".$ext."))\\2/i", $value, $imgs)) {
$imgs[3] = array_unique($imgs[3]);
foreach ($imgs[3] as $i => $img) {
if ($num && $i+1 > $num) {
break;
}
$rt[] = dr_file(trim($img, '"'));
}
}
return $rt;
}
/**
* 插件是否被安装
* @param $dir 插件英文名
* @return bool
*/
function dr_is_app($dir) {
return is_file(dr_get_app_dir($dir).'/install.lock');
}
/**
* 模块是否被安装
* @param $dir 模块英文名
* @param $siteid 站点id
* @return bool
*/
function dr_is_module($dir, $siteid = SITE_ID) {
return \Phpcmf\Service::L('cache')->get('module-'.$siteid, $dir) ? 1 : 0;
}
/**
* 字符串替换函数
* @param $str 指定字符串
* @param $o 需要替换的值
* @param $t 替换后的值
* @return 进行str_replace运算
*/
function dr_rp($str, $o, $t = '') {
return str_replace($o, $t, (string)$str);
}
/**
* 替换模板参数特殊字符
* @param $str 指定字符串
* @param $rt 正向或者反向
* @return 特殊字符替换
*/
function dr_rp_view($str, $rt = 0) {
$a = [
'=',
' '
];
$b = [
'_FINECMS_ET_',
'_XUNRUICMS_SK_',
];
return $rt ? str_replace($b, $a, (string)$str) : str_replace($a, $b, (string)$str);
}
/**
* 二维码调用
* @param $text 指定字符串
* @param $thumb 中间图片
* @param $level 等级字母
* @param $size 大小值
* @return 生成二维码图片url
*/
function dr_qrcode($text, $thumb = '', $level = 'H', $size = 5) {
return ROOT_URL.'index.php?s=api&c=api&m=qrcode&thumb='.urlencode($thumb).'&text='.urlencode($text).'&size='.$size.'&level='.$level;
}
/**
* 秒转化时间
* @param $times 多少秒
* @return 返回秒对于的时分秒值
*/
function dr_sec2time($times){
$times = intval($times);
$result = '00:00:00';
if ($times > 0) {
$hour = floor($times/3600);
$minute = floor(($times-3600 * $hour)/60);
$second = floor((($times-3600 * $hour) - 60 * $minute) % 60);
strlen($hour) == 1 && $hour = '0'.$hour;
strlen($minute) == 1 && $minute = '0'.$minute;
strlen($second) == 1 && $second = '0'.$second;
$result = $hour.':'.$minute.':'.$second;
}
return $result;
}
/**
* 格式化多文件数组
* @param $value json字符
* @param $limit 限定返回几个值
* @return 格式化多文件数组
*/
function dr_get_files($value, $limit = '') {
$data = [];
$value = dr_string2array($value, $limit);
if (!$value) {
return $data;
} elseif (!isset($value['file']) && !isset($value['id'])) {
return $value;
}
$arr = isset($value['id']) && $value['id'] ? $value['id'] : $value['file'];
foreach ($arr as $i => $file) {
if ($file) {
$data[] = [
'url' => dr_get_file($file), // 对应文件的url
'file' => $file, // 对应文件或附件id
'title' => $value['title'][$i], // 对应标题
'description' => $value['description'][$i], // 对应描述
];
}
}
return $data;
}
/**
* 格式化图片专用数组
* @param $value json字符
* @return 格式化图片专用数组
*/
function dr_get_image($value) {
$data = [];
$value = dr_string2array($value);
if (!$value) {
return $data;
}
foreach ($value as $i => $file) {
if ($file) {
$data[] = [
'id' => $file, // 对应文件或附件id
'file' => dr_get_file($file), // 对应文件的url
];
}
}
return $data;
}
/**
* 文件上传临时目录
* @return 文件上传临时目录
*/
function dr_upload_temp_path() {
if (function_exists('ini_get')) {
$path = ini_get('upload_tmp_dir');
if ($path) {
return rtrim($path, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
}
}
return WRITEPATH.'temp/';
}
/**
* 星级显示
* @param $num 数字
* @param $shifen 按十分计算
* @return 星级显示
*/
function dr_star_level($num, $shifen = 0) {
$lv = 5;
$shifen && $num = (int)$num/2;
$num = floatval($num);
$int = min(floor($num), $lv);
if (!$int) {
return '';
}
// 实心
$shi = [];
for ($i=0; $i<$int; $i++) {
$shi[] = '';
}
// 五星返回
if (dr_count($shi) >= $lv) {
return @implode('', $shi);
}
// 剩下的心
if ($num - $int > 0.5) {
$shi[]= '';
} else {
$shi[] = '';
}
$sx = $lv - dr_count($shi);
if ($sx > 0) {
for ($i=1; $i< $lv - $int; $i++) {
$shi[] = '';
}
}
return @implode('', $shi);
}
/**
* 规范化建表/DDL SQL。
* Install.sql 等以 MySQL 方言为源,优先交给当前数据库驱动 formatCreateSql 转换;
* 驱动未就绪时回退为 MySQLi 规则,保证安装早期可用。
*
* @param string $sql
* @return string
*/
function dr_format_create_sql($sql) {
if (!$sql) {
return '';
}
$sql = trim($sql);
// 优先走当前连接驱动(MySQLi / 后续 SQLite3 等)
if (class_exists('\Phpcmf\Service', false)) {
try {
$db = \Phpcmf\Service::M()->db;
if ($db && method_exists($db, 'formatCreateSql')) {
return $db->formatCreateSql($sql);
}
} catch (\Throwable $e) {
// 安装早期或数据库未初始化时忽略,走下方默认规则
}
}
// 默认按 MySQLi 规则(与 CodeIgniter\Database\MySQLi\Connection::formatCreateSql 一致)
$sql = str_replace('ENGINE=InnoDB ', 'ENGINE=InnoDB ', $sql);
return trim(str_replace(
'CHARSET=utf8 ',
'CHARSET=utf8mb4 COLLATE utf8mb4_unicode_ci ',
$sql
));
}
/**
* 获取cms域名部分
* @param $url 指定url
* @return 从指定url中获取cms域名部分
*/
function dr_cms_domain_name($url) {
if (!$url) {
return '';
}
$param = parse_url($url);
if (isset($param['host']) && $param['host']) {
return $param['host'];
}
return $url;
}
/**
* 获取非空值
* @param $param 指定文字
* @return 获取第一个非空值
*/
function dr_is_not_null_value(...$param) {
if (empty($param)) {
return '';
}
foreach ($param as $k => $t) {
if (!dr_is_empty($t)) {
return $t;
}
}
return '';
}
/**
* 多语言输出
* @param $param 指定文字
* @return 将指定文字转换成系统对于的语言文字
*/
function dr_lang(...$param) {
if (empty($param)) {
return '';
}
// 取第一个作为语言名称
$string = $param[0];
unset($param[0]);
// 调用语言包内容
$string = \Phpcmf\Service::L('lang')->text($string);
if ($param) {
foreach ($param as $k => $t) {
$param[$k] = \Phpcmf\Service::L('lang')->text($t);
}
return vsprintf($string, $param);
}
return $string;
}
/**
* 获取终端列表
* @return 获取终端列表
*/
function dr_client_data($siteid = SITE_ID) {
$rt = [
'pc' => 'PC端',
'mobile' => '移动端',
];
$rt2 = \Phpcmf\Service::R(WRITEPATH.'config/app_client_name_'.$siteid.'.php');
if ($rt2) {
$rt = $rt + $rt2;
}
return $rt;
}
// 获取url在导航的id
function dr_navigator_id($type, $markid) {
return (int)\Phpcmf\Service::L('cache')->get('navigator-'.SITE_ID.'-url', $type, $markid);
}
/**
* 格式化编辑器内容数据
* @param $value 指定文字
* @param $title title标题值
* @return 将UEDITOR_IMG_TITLE替换成指定的标题
*/
function dr_ueditor_html($value, $title = '') {
if (!$value) {
return '';
}
return UEDITOR_IMG_TITLE ? str_replace(UEDITOR_IMG_TITLE, $title, htmlspecialchars_decode($value)) : htmlspecialchars_decode($value);
}
/**
* 获取域名部分
* @param $url
* @return 从$url中获取到域名
*/
function dr_get_domain_name($url) {
if (!$url) {
return '';
}
list($url) = explode(':', str_replace(['https://', 'http://', '/'], '', $url));
return $url;
}
/**
* 按百分比分割数组
* @param $data 数组
* @param $num 分成几等分
* @return 将数组按百分比等分划分
*/
function dr_save_bfb_data($data, $num = 100) {
$cache = [];
$count = dr_count($data);
if ($count > $num) {
$pagesize = ceil($count/$num);
for ($i = 1; $i <= $num; $i ++) {
$cache[$i] = array_slice($data, ($i - 1) * $pagesize, $pagesize);
}
} else {
for ($i = 1; $i <= $count; $i ++) {
$cache[$i] = array_slice($data, ($i - 1), 1);
}
}
return $cache;
}
/**
* 会员头像存储目录
* @param $uid
* @return 按uid进行分配头像存储目录
*/
function dr_avatar_dir($uid) {
if (!$uid) {
return '';
}
$uid = abs(intval($uid));
$uid = sprintf("%09d", $uid); //前边加0补齐9位,例如UID为31的用户变成 000000031
$dir1 = substr($uid, 0, 3); //取左边3位,即 000
$dir2 = substr($uid, 3, 2); //取4-5位,即00
$dir3 = substr($uid, 5, 2); //取6-7位,即00
// 下面拼成用户头像路径,即000/00/00/
return $dir1.'/'.$dir2.'/'.$dir3.'/';
}
/**
* 会员头像存储路径
* @return 返回头像存储目录和对于的访问url
*/
function dr_avatar_path() {
//$config = \Phpcmf\Service::C()->get_cache('site', SITE_ID, 'image');
$config = [
'avatar_url' => defined('SYS_AVATAR_URL') ? SYS_AVATAR_URL : '',
'avatar_path' => defined('SYS_AVATAR_PATH') ? SYS_AVATAR_PATH : '',
];
if (!$config['avatar_path'] || !$config['avatar_url']) {
return [
SYS_UPLOAD_PATH.'member/',
SYS_UPLOAD_URL.'member/'
];
} elseif ((strpos($config['avatar_path'], '/') === 0 || strpos($config['avatar_path'], ':') !== false) && is_dir($config['avatar_path'])) {
// 相对于根目录
return [
rtrim($config['avatar_path'], DIRECTORY_SEPARATOR).'/',
trim($config['avatar_url'], '/').'/'
];
} else {
// 在当前网站目录
return [
ROOTPATH.trim($config['avatar_path'], '/').'/',
(SYS_ATTACHMENT_REL ? FC_NOW_HOST : ROOT_URL).trim($config['avatar_path'], '/').'/'
];
}
}
/**
* 会员头像
*
* @param $uid
* @param $fix 是否加时间戳后缀
* @return 会员头像url
*/
if (!function_exists('dr_avatar')) {
function dr_avatar($uid, $fix = 1) {
if ($uid) {
list($cache_path, $cache_url) = dr_avatar_path();
$file = dr_avatar_dir($uid).$uid.'.jpg';
// 钩子处理
$rs = \Phpcmf\Hooks::trigger_callback('avatar_get', $cache_path, $file);
if ($rs && isset($rs['code']) && $rs['code'] && $rs['msg']) {
return $rs['msg'];
}
if (is_file($cache_path.$file)) {
return $cache_url.$file.($fix ? '?time='.filemtime($cache_path.$file) : '');
} elseif (is_file($cache_path.$uid.'.jpg')) {
return $cache_url.$uid.'.jpg'.($fix ? '?time='.filemtime($cache_path.$uid.'.jpg') : '');
}
}
return ROOT_THEME_PATH.'assets/images/avatar.png';
}
}
/**
* 调用会员详细信息(自定义字段需要手动格式化)
*
* @param $uid 会员uid
* @param $name 输出字段
* @param $cache 缓存时间
* @return 用户详情数组
*/
function dr_member_info($uid, $name = '', $cache = -1) {
$data = \Phpcmf\Service::L('cache')->get_data('member-info-'.$uid);
if (!$data) {
$data = \Phpcmf\Service::M('member')->get_member($uid);
if ($data) {
$data['salt'] = '***';
$data['password'] = '***';
}
SYS_CACHE && \Phpcmf\Service::L('cache')->set_data('member-info-'.$uid, $data, $cache > 0 ? $cache : SYS_CACHE_SHOW * 3600);
}
return $name ? $data[$name] : $data;
}
/**
* 调用会员详细信息(自定义字段需要手动格式化)
*
* @param $username 会员账号
* @param $name 输出字段
* @param $cache 缓存时间
* @return 用户详情数组
*/
function dr_member_username_info($username, $name = '', $cache = -1) {
$data = \Phpcmf\Service::L('cache')->get_data('member-info-name-'.$username);
if (!$data) {
$data = \Phpcmf\Service::M('member')->get_member(0, $username);
if ($data) {
$data['salt'] = '***';
$data['password'] = '***';
}
SYS_CACHE && \Phpcmf\Service::L('cache')->set_data('member-info-name-'.$username, $data, $cache > 0 ? $cache : SYS_CACHE_SHOW * 3600);
}
return $name ? $data[$name] : $data;
}
/**
* 执行函数
*/
function dr_list_function($func, $value, $param = [], $data = [], $field = [], $name = '') {
if (!$func) {
$dfunc = [
'Uid' => 'uid',
'Files' => 'files',
'Image' => 'image',
'Ueditor' => 'content',
'Editor' => 'content',
'Score' => 'score',
'Date' => 'datetime',
'Radio' => 'radio_name',
'Select' => 'select_name',
'Checkbox' => 'checkbox_name',
'Linkage' => 'linkage_name',
'Linkages' => 'linkages_name',
];
$dname = [
'title' => 'title',
'catid' => 'catid',
'author' => 'author',
'displayorder' => 'save_text_value',
];
if ($name && isset($dname[$name]) && $dname[$name]) {
$func = $dname[$name];
} elseif ($field['fieldtype'] && isset($dfunc[$field['fieldtype']]) && $dfunc[$field['fieldtype']]) {
$func = $dfunc[$field['fieldtype']];
} elseif (!$value) {
return '';
} else {
return htmlspecialchars((string)$value);
}
}
$obj = \Phpcmf\Service::L('Function_list');
if (method_exists($obj, $func)) {
return call_user_func_array([$obj, $func], [$value, $param, $data, $field]);
} elseif (dr_is_call_function($func)) {
return call_user_func_array($func, [$value, $param, $data, $field]);
} else {
log_message('debug', '你没有定义字段列表回调函数:'.$func);
}
return htmlspecialchars((string)$value);
}
/**
* 联动菜单包屑导航
*
* @param string $code 联动菜单代码
* @param intval $id id
* @param string $symbol 间隔符号
* @param string $url url地址格式,必须存在[linkage],否则返回不带url的字符串
* @param string $html 格式替换
* @return string
*/
function dr_linkagepos($code, $id, $symbol = ' > ', $url = '', $html = '') {
if (!$code || !$id) {
return '';
}
$url = $url ? urldecode($url) : '';
$data = dr_linkage($code, $id, 0);
if (!$data) {
return '';
}
$name = [];
$array = explode(',', $data['pids']);
$array[] = $data['ii'];
foreach ($array as $ii) {
if ($ii) {
$data = dr_linkage($code, $ii, 0);
if ($url) {
$curl = str_replace(
['[linkage]', '{linkage}', '[id]', '{id}', '[iid]', '{iid}'],
[$data['id'], $data['id'], $data['ii'], $data['ii'], $data['iid'], $data['iid']],
$url
);
$name[] = ($html ? str_replace(['[url]', '[name]'], array($curl, $data['name']), $html) : "{$data['name']}");
} else {
$name[] = $data['name'];
}
}
}
return implode($symbol, array_unique($name));
}
/**
* 联动菜单调用
*
* @param string $code 菜单代码
* @param intval $id 菜单id
* @param intval $level 调用级别,1表示顶级,2表示第二级,等等
* @param string $name 菜单名称,如果有显示它的值,否则返回数组
* @return array
*/
function dr_linkage($code, $id, $level = 0, $name = '') {
if (!$id) {
return false;
}
// id 查询
if (is_numeric($id)) {
$id = dr_linkage_id($code, $id);
if (!$id) {
return false;
}
}
$data = \Phpcmf\Service::L('cache')->get_file('data-'.$id, 'linkage/'.SITE_ID.'_'.$code.'/');
if (!$data) {
return false;
}
$pids = explode(',', $data['pids']);
if ($level == 0) {
return $name ? $data[$name] : $data;
}
if (!$pids) {
return $name ? $data[$name] : $data;
}
$i = 1;
foreach ($pids as $pid) {
if ($pid) {
if ($i == $level) {
$link = dr_linkage($code, $pid, 0);
return $name ? $link[$name] : $link;
}
$i++;
}
}
return $name ? $data[$name] : $data;
}
/**
* 联动菜单json数据
*
* @param string $code 菜单代码
* @param intval $pid 菜单父级id或者别名
* @return array
*/
function dr_linkage_json($code) {
if (!$code) {
return [];
}
return \Phpcmf\Service::L('cache')->get_file('json', 'linkage/'.SITE_ID.'_'.$code.'/');
}
/**
* 联动菜单列表数据
*
* @param string $code 菜单代码
* @param intval $pid 菜单父级id或者别名
* @return array
*/
function dr_linkage_list($code, $pid) {
if (!$code) {
return false;
}
if ($pid && !is_numeric($pid)) {
// 别名情况时获取id号
$pid = dr_linkage_cname($code, $pid);
}
return \Phpcmf\Service::L('cache')->get_file('list-'.$pid, 'linkage/'.SITE_ID.'_'.$code.'/');
}
/**
* 联动菜单的id号获取
*
* @param string $code 菜单代码
* @param string $cname 别名
* @return array
*/
function dr_linkage_id($code, $cname) {
if (!$code || !$cname) {
return false;
}
$ids = \Phpcmf\Service::L('cache')->get_file('id', 'linkage/'.SITE_ID.'_'.$code.'/');
if (isset($ids[$cname]) && $ids[$cname]) {
return $ids[$cname];
}
return false;
}
/**
* 联动菜单的别名获取
*
* @param string $code 菜单代码
* @param int $id id
* @return array
*/
function dr_linkage_cname($code, $id) {
if (!$code || !$id) {
return 0;
}
$ids = array_flip(\Phpcmf\Service::L('cache')->get_file('id', 'linkage/'.SITE_ID.'_'.$code.'/'));
if (isset($ids[$id]) && $ids[$id]) {
return $ids[$id];
}
return 0;
}
/**
* 联动菜单的最大层级
*
* @param string $code 菜单代码
* @return array
*/
function dr_linkage_level($code) {
if (!$code) {
return 0;
}
return (int)\Phpcmf\Service::L('cache')->get_file('level', 'linkage/'.SITE_ID.'_'.$code.'/');
}
/**
* 支付表单调用
* mark 表名-主键id-字段id
* value 支付金额
* title 支付说明
* */
function dr_payform($mark, $value = 0, $title = '', $url = '', $remove_div = 1, $tpl = '') {
if (!dr_is_app('pay')) {
return '没有安装「支付系统」插件';
}
return \Phpcmf\Service::M('Pay', 'pay')->payform($mark, $value, $title, $url, $remove_div, $tpl);
}
/**
* 字段表单调用
* field 字段配置
* value 默认值
* remove_div 移除div区域
* load_js 重新加载js文件
* */
function dr_fieldform($field, $value = '', $remove_div = 1, $load_js = 0) {
if (!$field) {
return '字段数据不存在';
}
$field = dr_string2array($field);
if (!$field['fieldtype']) {
return '字段类别不存在';
}
$f = \Phpcmf\Service::L('Field')->get($field['fieldtype']);
$f->remove_div = $remove_div;
if ($load_js) {
$f->set_load_js($field['fieldtype'], 0);
}
return $f->input($field, $value);
}
// 获取字段表单框
function dr_field_form($field, $value = '', $app = '', $remove_div = 1) {
if (!$field) {
return 'field字段信息为空';
}
$f = \Phpcmf\Service::L('Field')->get($field['fieldtype']);
if (!$f) {
return 'field对象('.$field['fieldtype'].')不存在';
}
$f->remove_div = $remove_div;
return $f->input($field, $value);
}
/**
* 资料块内容
*
* @param intval $id
* @return array
*/
function dr_block($id, $type = 0, $site = 0) {
return \Phpcmf\Service::C()->get_cache('block-'.($site ? $site : SITE_ID), $id, $type);
}
// 是否是微信公众号
function dr_is_weixin_app() {
$user = (string)$_SERVER['HTTP_USER_AGENT'];
if (strpos($user, 'MicroMessenger')) {
if (strpos($user, 'WindowsWechat')) {
return 0;
}
return 1;
}
return 0;
}
/**
* 全局变量调用
*
* @param string $name 别名
* @return
*/
function dr_var_value($name) {
return \Phpcmf\Service::C()->get_cache('var', $name);
}
// 获取自定义目录
function dr_get_dir_path($path) {
if ((strpos($path, '/') === 0 || strpos($path, ':') !== false)) {
// 相对于根目录
return rtrim($path, DIRECTORY_SEPARATOR).'/';
} else {
// 在当前网站目录
return ROOTPATH.trim($path, '/').'/';
}
}
// 缩略图路径和url
function dr_thumb_path($img = '') {
$path = '';
if ($img) {
$md5 = md5($img);
$path = substr($md5, 0, 1).substr($md5, -1, 1)
.'/'.substr($md5, 2, 1).substr($md5, -2, 1).'/'.$md5;
}
$config = \Phpcmf\Service::C()->get_cache('site', SITE_ID, 'image');
if (!$config['cache_path'] || !$config['cache_url']) {
return [
ROOTPATH.'uploadfile/thumb/',
(SYS_ATTACHMENT_REL ? FC_NOW_HOST : ROOT_URL).'uploadfile/thumb/',
$config['ext'],
$path
];
}
if ((strpos($config['cache_path'], '/') === 0 || strpos($config['cache_path'], ':') !== false) && is_dir($config['cache_path'])) {
// 相对于根目录
return [
rtrim($config['cache_path'], DIRECTORY_SEPARATOR).'/',
trim($config['cache_url'], '/').'/',
$config['ext'],
$path
];
} else {
// 在当前网站目录
return [
ROOTPATH.trim($config['cache_path'], '/').'/',
(SYS_ATTACHMENT_REL ? FC_NOW_HOST : ROOT_URL).trim($config['cache_path'], '/').'/',
$config['ext'],
$path
];
}
}
// 无缩略图的地址
function dr_nopic() {
$config = \Phpcmf\Service::C()->get_cache('site', SITE_ID, 'image');
if (isset($config['nopic']) && $config['nopic']) {
return dr_url_rel($config['nopic']);
}
return dr_url_rel(ROOT_THEME_PATH.'assets/images/nopic.gif');
}
// 缩略图
function dr_thumb($img, $width = 0, $height = 0, $water = 0, $mode = 'auto', $webimg = 0) {
if (!$img) {
return dr_nopic();
} elseif (is_array($img)) {
return IS_DEV ? '文件参数不能是数组' : dr_nopic();
} elseif (!$width && !$height && !$water) {
return dr_get_file($img).(IS_DEV ? '#没有设置高宽参数,将以原图输出' : '');
} elseif (is_numeric($img) || $webimg) {
// 强制缩略图水印
if (defined('SITE_THUMB_WATERMARK') && SITE_THUMB_WATERMARK) {
$water = 1;
}
// 钩子处理
$rs = \Phpcmf\Hooks::trigger_callback('thumb', $img, $width, $height, $water, $mode, $webimg);
if ($rs && isset($rs['code']) && $rs['code'] && $rs['msg']) {
return $rs['msg'];
}
if (!IS_DEV) {
// 非开发者模式下读取缓存
list($cache_path, $cache_url, $ext, $path) = dr_thumb_path($img);
$cache_file = $path.'/'.$width.'x'.$height.($water ? '_water' : '').'_'.$mode.'.'.($ext ? 'webp' : 'jpg');
if (is_file($cache_path.$cache_file)) {
return dr_url_rel($cache_url.$cache_file);
}
}
return dr_url_rel(\Phpcmf\Service::L('image')->thumb($img, $width, $height, $water, $mode, $webimg));
}
$file = dr_file($img);
if ($file && CI_DEBUG && !is_numeric($img)) {
$file.= '#图片不是数字id号,dr_thumb函数无法进行缩略图处理';
}
return $file ? $file : dr_nopic();
}
/**
* 文件真实地址
*/
function dr_get_file($id, $full = 0) {
if (!$id) {
return IS_DEV ? '文件参数没有值' : '';
} elseif (is_array($id)) {
return IS_DEV ? '文件参数不能是数组' : '';
} elseif (is_numeric($id)) {
// 表示附件id
$info = \Phpcmf\Service::C()->get_attachment($id);
if ($info['url']) {
return $full ? $info['url'] : dr_url_rel($info['url']);
}
} elseif (strpos($id, 'data:image/') === 0) {
return $id;
}
$file = dr_file($id, $full);
return $file ? $file : $id;
}
/**
* 文件下载地址
*/
function dr_down_file($id, $name = '') {
if (!$id) {
return IS_DEV ? '文件参数不能为空' : '';
} elseif (is_array($id)) {
return IS_DEV ? '文件参数不能是数组' : '';
}
if (defined('SC_HTML_FILE')) {
return dr_web_prefix("index.php?s=api&c=file&m=down&id=".$id."&name=".urlencode($name));
}
$sn = md5($id);
\Phpcmf\Service::L('cache')->set_auth_data('down-file-'.$sn, [
'id' => $id,
'name' => $name,
]);
return dr_web_prefix("index.php?s=api&c=file&m=down&id=".$sn);
}
/**
* 根据附件信息获取文件地址
*
* @param array $data
* @return string
*/
function dr_get_file_url($data, $w = 0, $h = 0) {
if (!$data) {
return IS_DEV ? '文件信息不存在' : '';
} elseif ($data['remote']) {
$remote = \Phpcmf\Service::C()->get_cache('attachment', $data['remote']);
if ($remote) {
return $remote['url'].$data['attachment'];
} else {
return IS_DEV ? '自定义附件('.$data['remote'].')的配置已经不存在' : '';
}
} elseif ($w && $h && dr_is_image($data['fileext'])) {
//return dr_thumb($data['id'], $w, $h, 0, 'crop');
return dr_get_file($data['id']);
}
return SYS_UPLOAD_URL.$data['attachment'];
}
/**
* 任意字段的选项值(用于options参数的字段,如复选框、下拉选择框、单选按钮)
*
* @param intval $id
* @return array
*/
function dr_field_options($id) {
if (!$id) {
return '';
}
$data = \Phpcmf\Service::L('cache')->get_data('field-info-'.$id);
if (!$data) {
$field = \Phpcmf\Service::C()->get_cache('table-field', $id);
if (!$field) {
return '';
}
$data = dr_format_option_array($field['setting']['option']['options']);
if (!$data) {
return '';
}
// 存储缓存
\Phpcmf\Service::L('cache')->set_data('field-info-'.$id, $data, 10000);
}
return $data;
}
/**
* 任意字段的属性数组
*
* @param intval $id
* @return array
*/
function dr_field_setting(...$param) {
if (empty($param)) {
return [];
}
// 取第一个作为字段id
$id = $param[0];
unset($param[0]);
if (!$id) {
return [];
}
$data = \Phpcmf\Service::L('cache')->get_data('field-setting-'.$id);
if (!$data) {
$field = \Phpcmf\Service::C()->get_cache('table-field', $id);
if (!$field) {
return [];
}
$data = dr_string2array($field['setting']);
if (!$data) {
return [];
}
// 存储缓存
\Phpcmf\Service::L('cache')->set_data('field-setting-'.$id, $data, 10000);
}
if (!$param) {
return $data;
}
return dr_get_param_var($data, $param);
}
function dr_get_param_var($return, $param = []) {
if (!$param) {
return $return;
}
if (!is_array($param)) {
$param = [$param];
}
foreach ($param as $v) {
$var = (!$v ? 0 : dr_safe_replace($v));
if (isset($return[$var])) {
$return = $return[$var];
} else {
return null;
}
}
return $return;
}
function dr_rp_param_var($tpl, $param) {
if (empty($param) || !is_array($param)) {
return $tpl;
}
foreach ($param as $var => $val) {
if (is_array($val)) {
continue;
}
$tpl = str_replace('$'.$var, (string)$val, $tpl);
$tpl = str_replace('{'.$var.'}', (string)$val, $tpl);
}
return $tpl;
}
// 提醒说明
function dr_notice_info() {
if (is_file(WRITEPATH . 'config/notice.php')) {
$data = \Phpcmf\Service::R(WRITEPATH . 'config/notice.php');
if (is_array($data) && $data) {
foreach ($data as $i => $t) {
if ($t['name']) {
$data[$i]['name'] = dr_lang($data[$i]['name']);
}
}
return $data;
}
}
return [
1 => [
'name' => dr_lang('系统'),
'icon' => 'fa fa-bell-o',
],
2 => [
'name' => dr_lang('用户'),
'icon' => 'fa fa-user',
],
3 => [
'name' => dr_lang('内容'),
'icon' => 'fa fa-th-large',
],
4 => [
'name' => dr_lang('应用'),
'icon' => 'fa fa-puzzle-piece',
],
5 => [
'name' => dr_lang('交易'),
'icon' => 'fa fa-rmb',
],
6 => [
'name' => dr_lang('订单'),
'icon' => 'fa fa-shopping-cart',
],
];
}
// 提醒说明更新
function dr_notice_update($id, $name = '', $icon = '') {
if (!$id) {
return;
}
$data = dr_notice_info();
if ($name) {
$data[$id] = [
'name' => $name,
'icon' => $icon,
];
} else {
unset($data[$id]);
}
\Phpcmf\Service::R(WRITEPATH . 'config/notice.php', true);
\Phpcmf\Service::L('config')->file(WRITEPATH . 'config/notice.php', '设置自定义消息类型')->to_require($data);
}
// 提醒图标
function dr_notice_icon($type, $c = '') {
$data = dr_notice_info();
if ($data && isset($data[$type]) && $data[$type]) {
return '';
}
return '';
}
/**
* 验证用户权限(废弃)
* my 我的authid
* auth 目标权限组
* return 1有权限 0无权限
*/
function dr_member_auth($my, $auth) {
return 1;
}
/**
* 用于用户权限取取反值(废弃)
*/
function dr_member_auth_id($authid, $postid) {
return [];
}
/**
* 获取折扣价格值
* @param $value 价格值
* @param $zhe 折扣值
* @return 折扣计算后的值
*/
function dr_zhe_price($value, $zhe) {
if (!$value) {
return 0;
}
return (float)max(0, (int)$value * ($zhe/100));
}
/**
* 获取价格值
* @param $value 价格值
* @param $num 小数位
* @return 计算后的值
*/
function dr_price_value($value, $num = 2) {
return $value ? number_format(floatval($value), (int)$num) : 0;
}
/**
* sku 获取属性值名称
* @param $value 字段值
* @param $sku sku数组
* @param $name 属性key
* @return 属性名称
*/
function dr_sku_value_name($value, $sku, $name) {
if (!$value) {
return '字段值不存在';
} elseif (!$sku) {
return 'sku不能为空';
} elseif (!$name) {
return 'name不能为空';
}
$value = dr_string2array($value);
if (!$value['value']) {
return 'sku格式不正确';
} elseif (!$value['value'][$sku]) {
return 'sku值不存在';
}
return $value['value'][$sku][$name];
}
/**
* sku 价格信息
* @param $value 字段值
* @param $number 小数位
* @param $join 连接符号
* @param $zhe 折扣值
* @return 最终计算值
*/
function dr_sku_price($value, $number = 2, $join = ' - ', $zhe = 0) {
$value = dr_string2array($value);
if (!$value || !is_array($value['value'])) {
return 0;
}
$price = [];
$number = (int)$number;
foreach ($value['value'] as $t) {
$price[] = (float)$t['price'];
}
$min = min($price);
$max = max($price);
if ($zhe) {
$min = dr_zhe_price($min, $zhe);
$max = dr_zhe_price($max, $zhe);
}
if ($min == $max) {
return number_format($min, $number);
} else {
return number_format($min, $number).$join.number_format($max, $number);
}
}
/**
* sku 获取名称
* @param $key sku字符串
* @param $data 主题数组
* @param $type 默认
* @return 属性名称
*/
function dr_sku_name($key, $data, $type = 0) {
if (!$key || !is_array($data)) {
return $type ? ['', ''] : '';
}
$sku = [];
$arr = explode('_', $key);
foreach ($arr as $i => $t) {
$i%2 == 0 && isset($arr[$i+1]) && $sku[] = $t.'_'.$arr[$i+1];
}
$value = [];
$string = [];
foreach ($data['group'] as $gid => $gname) {
foreach ($data['name'][$gid] as $vid => $vname) {
if ($sku && in_array("{$gid}_{$vid}", $sku)) {
$value[$gname] = $vname;
$string[] = $gname.':'.$vname;
}
}
}
return $type ? [$value, implode(' ', $string)] : implode(' ', $string);
}
/**
* 下一个升级值
* @param $array 用户组数组
* @param $id 组id号
* @return 下一个升级值
*/
function dr_level_next_value($array, $id) {
if (!$array) {
return [];
}
// 判断当前是否允许升级
if ($id && $array[$id] && !$array[$id]['apply']) {
return []; // 此等级不允许升级
}
$next = 0;
foreach ($array as $i => $v) {
if (!$id) {
return $v;
}
if ($i == $id) {
$next = 1;
continue;
}
if ($next && $v['apply']) {
return $v;
}
}
return [];
}
/**
* 静态生成时权限认证字符(加密)
* @param $ip 运行者ip地址
* @return 返回逻辑值
*/
function dr_html_auth($ip = 0) {
if (is_cli()) {
return 1;//
}
if ($ip) {
// 存储值
return \Phpcmf\Service::L('cache')->set_auth_data(md5('html_auth'.(strlen($ip) > 5 ? $ip : \Phpcmf\Service::L('input')->ip_address())), 1);
} else {
// 读取判断
$rt = \Phpcmf\Service::L('cache')->get_auth_data(md5('html_auth'.\Phpcmf\Service::L('input')->ip_address()));
if ($rt) {
return 1; // 有效
} else {
return 0;
}
}
}
/**
* 付款方式显示
* @param $name 支付名
* @return 返回数组
*/
function dr_pay_type_html($name) {
return dr_pay_name($name);
}
/**
* 付款方式显示
* @param $name 支付名
* @return 返回数组
*/
function dr_pay_name($name) {
if (!dr_is_app('pay')) {
return '没有安装「支付系统」插件';
}
return \Phpcmf\Service::M('Pay', 'pay')->payname($name);
}
/**
* 付款方式的名称
* @param $name 支付名
* @return 返回数组
*/
function dr_pay_type($name) {
if (!dr_is_app('pay')) {
return '没有安装「支付系统」插件';
}
return dr_clearhtml(\Phpcmf\Service::M('Pay', 'pay')->paytype($name));
}
/**
* 付款状态的名称
* @param $data 支付记录数据
* @return 返回状态
*/
function dr_pay_status($data) {
if (!dr_is_app('pay')) {
return '没有安装「支付系统」插件';
}
return dr_clearhtml(\Phpcmf\Service::M('Pay', 'pay')->paystatus($data));
}
/**
* 付款金额显示
* @param $data 价格值
* @param $v 小数位
* @return 返回带html的金额值标签
*/
function dr_pay_money_html($data, $v = 2) {
$html = '+ '.number_format($data, $v);
} else {
$html.= ' fc-pay-j">- '.number_format(abs($data), $v);
}
$html.= '';
return $html;
}
/**
* 清除空白字符
* @param $value 字符串
* @return 返回字符串
*/
function dr_clear_empty($value) {
if (!$value) {
return '';
}
return str_replace([' ', ' '], '', trim($value));
}
/**
* 列表字段进行排序筛选
* @param $field 字段列表数组
* @return 返回过滤后的数组
*/
function dr_list_field_order($field) {
if (!$field) {
return [];
}
$rt = [];
foreach ($field as $name => $m) {
$m['use'] && $rt[$name] = $m;
}
return $rt;
}
function dr_list_field_value($value, $sys_field, $field) {
foreach ($field as $t) {
$t && $sys_field[$t['fieldname']] = $t;
}
$rt = [];
foreach ($value as $name => $t) {
if ($t && $t['name']) {
$rt[$name] = $sys_field[$name];
unset($sys_field[$name]);
}
}
if (!$sys_field) {
return $rt;
}
foreach ($sys_field as $name => $t) {
$rt[$name] = $t;
}
return $rt;
}
/**
* 两数组追加合并
* @param $a1 数组1
* @param $a2 数组2
* @return 返回合并后的数组
*/
function dr_array2array($a1, $a2) {
return array_merge(
is_array($a1) ? $a1 : [],
is_array($a2) ? $a2 : []
);
}
/**
* 两数组覆盖合并
* @param $a1 1是老数据
* @param $a2 2是新数据
* @return 返回处理后的数组
*/
function dr_array22array($a1, $a2) {
// 确保 $a1 是数组
$a = is_array($a1) ? $a1 : [];
// 确保 $a2 是数组后再合并
if (is_array($a2) && !empty($a2)) {
foreach ($a2 as $i => $t) {
$a[$i] = $t;
}
}
return $a;
}
/**
* 判断是否启用了建站系统插件
*/
function dr_is_use_module() {
if (!IS_USE_MODULE) {
return 0;
}
return IS_USE_MODULE;
}
/**
* 站点表前缀
* @param $table 表名
* @param $siteid 站点id
* @return 返回当前站点对应的表名称
*/
function dr_site_table_prefix($table, $siteid = SITE_ID) {
return $siteid.'_'.$table;
}
/**
* 模块表前缀
* @param $dir 模块目录
* @param $siteid 站点id
* @return 返回当前站点对应的表名称
*/
function dr_module_table_prefix($dir, $siteid = SITE_ID) {
return $siteid.'_'.$dir;
}
/**
* 模块表单前缀
* @param $dir 模块目录
* @param $table 表名
* @param $siteid 站点id
* @return 返回当前站点对应的表名称
*/
function dr_mform_table_prefix($dir, $table, $siteid = SITE_ID) {
return $siteid.'_'.$dir.'_form_'.$table;
}
/**
* 网站表单表前缀
* @param $dir 表单名
* @param $siteid 站点id
* @return 返回当前站点对应的表名称
*/
function dr_form_table_prefix($dir, $siteid = SITE_ID) {
return $siteid.'_form_'.$dir;
}
/**
* 返回图标
* @param $value 原定的图标
* @return 如没有原地图标就返回默认图标
*/
function dr_icon($value) {
return $value ? $value : 'fa fa-table';
}
/**
* 完整的文件URL
* @param $url 文件参数
* @param $full 是否补全绝对域名
* @return 返回文件的完整url地址
*/
function dr_file($url, $full = 0) {
if (!$url || dr_strlen($url) == 1) {
return '';
} elseif (substr($url, 0, 7) == 'http://' || substr($url, 0, 8) == 'https://') {
return $full ? $url : dr_url_rel($url);
} elseif (substr($url, 0, 1) == '/') {
$url = ROOT_URL.substr($url, 1);
return $full ? $url : dr_url_rel($url);
}
$url = SYS_UPLOAD_URL.$url;
return $full ? $url : dr_url_rel($url);
}
/**
* 根据文件扩展名获取文件预览信息
* @param $value 文件路径参数
* @param $id 文件id值
* @return 返回文件可预览的img标签
*/
function dr_file_preview_html($value, $id = 0) {
if (!$value) {
return '';
}
$ext = trim(strtolower(strrchr($value, '.')), '.');
if (dr_is_image($ext)) {
$value = dr_file($value);
if ($id && ((isset($_POST['is_admin']) && intval($_POST['is_admin']) == 1) || IS_ADMIN)) {
return '
';
} elseif (is_file(ROOTPATH.'static/assets/images/ext/'.$ext.'.png')) {
$file = ROOT_THEME_PATH.'assets/images/ext/'.$ext.'.png';
return '
';
return ''.$img.'';
} elseif ($t['fileext'] == 'mp4') {
return '
';
} elseif (is_file(ROOTPATH.'static/assets/images/ext/'.$t['fileext'].'.png')) {
return '
';
} else {
return '
';
}
}
if (! function_exists('dr_is_image')) {
/**
* 文件是否是图片
* @param $value 文件路径参数
* @return 判断这个是否是一张图片
*/
function dr_is_image($value)
{
if (!$value) {
return false;
}
return in_array(
strpos($value, '.') !== false ? trim(strtolower(strrchr($value, '.')), '.') : $value,
['jpg', 'gif', 'png', 'jpeg', 'webp', 'avif']
);
}
}
/**
* 格式化复选框\单选框\选项值
* @param $value 参数
* @return 字符串转换为数组
*/
function dr_format_option_array($value) {
$data = [];
if (!$value) {
return $data;
}
$options = explode(PHP_EOL, str_replace(array(chr(13), chr(10)), PHP_EOL, $value));
foreach ($options as $t) {
if (strlen($t)) {
$n = $v = '';
if (strpos($t, '|') !== FALSE) {
list($n, $v) = explode('|', $t);
$v = is_null($v) || !strlen($v) ? '' : trim($v);
} else {
$v = $n = trim($t);
}
$data[htmlspecialchars($v)] = htmlspecialchars($n);
}
}
return $data;
}
/**
* 字段输出表单(废弃)
*/
function dr_field_input($name, $type, $option, $value = '', $id = 0) {
return '';
}
/**
* 目录列表获取
*
* @param $source_dir 源目录
* @param $directory_depth 目录纵深 0全目录 1当前目录
* @param $hidden 是否包含隐藏目录
* @return 整个目录名的数组格式
*/
function dr_dir_map($source_dir, $directory_depth = 0, $hidden = FALSE) {
if ($source_dir && $fp = opendir($source_dir)) {
$filedata = [];
$new_depth = $directory_depth - 1;
$source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
while (FALSE !== ($file = readdir($fp))) {
if ($file === '.' OR $file === '..'
OR ($hidden === FALSE && $file[0] === '.')
OR !is_dir($source_dir.$file)) {
continue;
}
if (($directory_depth < 1 OR $new_depth > 0)
&& is_dir($source_dir.$file)) {
$filedata[$file] = dr_dir_map($source_dir.DIRECTORY_SEPARATOR.$file, $new_depth, $hidden);
} else {
$filedata[] = $file;
}
}
closedir($fp);
return $filedata;
}
return [];
}
/**
* 文件列表获取
*
* @param $source_dir 源目录
* @param $directory_depth 目录纵深 0全目录 1当前目录
* @param $hidden 是否包含隐藏目录
* @return 整个文件名的数组格式
*/
function dr_file_map($source_dir) {
if ($source_dir && $fp = opendir($source_dir)) {
$filedata = [];
$source_dir = rtrim($source_dir, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR;
while (FALSE !== ($file = readdir($fp))) {
if ($file === '.' OR $file === '..'
OR $file[0] === '.'
OR !is_file($source_dir.$file)) {
continue;
}
$filedata[] = $file;
}
closedir($fp);
return $filedata;
}
return [];
}
/**
* 数据返回统一格式
* @param $code 状态码 0失败 >1表示成功
* @param $msg 提示文字
* @param $data 传输数组
* @param $extend 根附加数组
* @return 返回统一的数组格式
*/
function dr_return_data($code, $msg = '', $data = [], $extend = []) {
$rt = [
'code' => $code,
'msg' => $msg,
'data' => $data,
];
if ($extend) {
foreach ($extend as $i => $t) {
if (!isset($rt[$i])) {
$rt[$i] = $t;
}
}
}
return $rt;
}
/**
* 提交表单默认隐藏域
* @param $data 可填充的隐藏域数组格式
* @return 表单隐藏域控件代码
*/
function dr_form_hidden($data = []) {
$form = ''.PHP_EOL;
$form.= ''.PHP_EOL;
$form.= ''.PHP_EOL;
$form.= ''.PHP_EOL;
if ($data) {
foreach ($data as $name => $value) {
$form.= ''.PHP_EOL;
}
}
return $form;
}
/**
* 验证csrf字符串
*/
function dr_get_csrf_token() {
$code = \Phpcmf\Service::C()->session()->get('auth_csrf_token');
if (!$code) {
$code = bin2hex(random_bytes(16));
//\Phpcmf\Service::L('cache')->set_auth_data('csrf_token', $code, 1);
\Phpcmf\Service::C()->session()->set('auth_csrf_token', $code);
}
return $code;
}
/**
* 搜索表单隐藏域
* @param $p 可填充的隐藏域数组格式
* @return 表单隐藏域控件代码
*/
function dr_form_search_hidden($p = []) {
$form = '';
if ($_GET['app']) {
$form.= ''.PHP_EOL;
$form.= ''.PHP_EOL;
} elseif (IS_API && !APP_DIR) {
$form.= ''.PHP_EOL;
} else {
$form.= ''.PHP_EOL;
}
$form.= ''.PHP_EOL;
$form.= ''.PHP_EOL;
if ($p) {
foreach ($p as $name => $value) {
$form.= ''.PHP_EOL;
}
}
return $form;
}
/**
* Base64加密
*
* @param $string 参数
* @return 加密后的字符串
*/
function dr_base64_encode($string) {
if (!$string) {
return '';
}
$data = base64_encode($string);
$data = str_replace(['+', '/', '='], ['-', '_', ''], $data);
return $data;
}
/**
* Base64解密
*
* @param $string 参数
* @return 解密后的值
*/
function dr_base64_decode($string) {
if (!$string) {
return '';
}
$data = str_replace(['-', '_'], ['+', '/'], $string);
$mod4 = strlen($data) % 4;
$mod4 && $data.= substr('====', $mod4);
return base64_decode($data);
}
/**
* 网站风格目录
*
* @return 网站风格目录数组
*/
function dr_get_theme() {
if (!function_exists('dr_dir_map')) {
return ['default'];
}
$map = [];
$path = WEBPATH.'static/';
if (is_dir($path)) {
$map = array_diff(dr_dir_map($path, 1), ['assets']);
}
if (!$map) {
$map = array_diff(dr_dir_map(ROOTPATH.'static/', 1), ['assets']);
}
return $map;
}
/**
* 获取6位数字随机验证码
*/
function dr_randcode() {
return \Phpcmf\Service::L('Form')->get_rand_value();
}
/**
* 判断是否为数字类型
*
* @param $num 数字类型
* @param $lang 长度范围之外时直接范围false
* @return 如果成功则返回 TRUE,失败则返回 FALSE
*/
function dr_is_numeric($num, $lang = 10) {
if (dr_strlen($num) > $lang) {
return false;
}
if (is_numeric($num)) {
if (substr($num, 0, 1) == 0) {
// 0开头的不作为数字类处理
return false;
}
if (preg_match('/^[0-9]+$/', $num)) {
return true;
}
}
return false;
}
/**
* 删除目录及目录下面的所有文件
*
* @param $dir 路径
* @param $is_all 包括删除当前目录
* @return 如果成功则返回 TRUE,失败则返回 FALSE
*/
function dr_dir_delete($path, $del_dir = FALSE, $htdocs = FALSE, $_level = 0)
{
if (!$path) {
return false;
}
// Trim the trailing slash
$path = rtrim($path, '/\\');
if ( ! $current_dir = @opendir($path))
{
return FALSE;
}
while (FALSE !== ($filename = @readdir($current_dir)))
{
if ($filename !== '.' && $filename !== '..')
{
$filepath = $path.DIRECTORY_SEPARATOR.$filename;
if (is_dir($filepath) && $filename[0] !== '.' && ! is_link($filepath))
{
dr_dir_delete($filepath, $del_dir, $htdocs, $_level + 1);
} else {
unlink($filepath);
}
}
}
closedir($current_dir);
$_level > 0 && rmdir($path); // 删除子目录
return $del_dir && $_level == 0 ? rmdir($path) : TRUE;
}
/**
* 基于本地存储的加解密算法
* @param $string 传入字符串
* @param $operation DECODE是解密,否则是加密
* @return 返回加解密后的值
*/
function dr_authcode($string, $operation = 'DECODE') {
if (!$string) {
return '';
}
is_array($string) && $string = dr_array2string($string);
if ($operation == 'DECODE') {
// 解密
return \Phpcmf\Service::L('cache')->get_auth_data($string, 1);
} else {
// 加密
\Phpcmf\Service::L('cache')->set_auth_data(md5($string), $string, 1);
return md5($string);
}
}
/**
* 当前浏览器的URL
*/
function dr_now_url() {
return \Phpcmf\Service::L('input')->xss_clean(IS_ADMIN ? str_replace(FC_NOW_HOST, '/', FC_NOW_URL) : FC_NOW_URL);
}
/**
* 验证码图片获取
* @param $width 宽度
* @param $height 高度
* @param $url 废弃
* @return 返回验证码img标签的格式
*/
function dr_code($width, $height, $url = '') {
$url = dr_web_prefix('index.php?s=api&c=api&m=captcha&width='.$width.'&height='.$height);
return '
';
}
}
return $str;
}
/**
* 动态调用模板
* @param $id div控件的ID名
* @param $filename 模板文件名
* @param $param_str 附加URL参数
* @return 返回ajax调用代码
*/
function dr_ajax_template($id, $filename, $param_str = '') {
$error = IS_DEV && !defined('SC_HTML_FILE') ? ', error: function(HttpRequest, ajaxOptions, thrownError) { var msg = HttpRequest.responseText;layer.open({ type: 1, title: "'.dr_lang('系统故障').'", fix:true, shadeClose: true, shade: 0, area: [\'50%\', \'50%\'], content: "