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 '
'; return ''; } else { return ''; } } elseif ($ext == 'mp4') { $value = dr_file($value); return ''; } elseif (is_file(ROOTPATH.'static/assets/images/ext/'.$ext.'.png')) { $file = ROOT_THEME_PATH.'assets/images/ext/'.$ext.'.png'; return ''; } else { $file = ROOT_THEME_PATH.'assets/images/ext/url.png'; return ''; } } // 用于附件列表查看时 function dr_file_list_preview_html($t) { if (dr_is_image($t['fileext'])) { $img = ''; 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 ''; } /** * 排序字符串转换操作 * @param $name 字段名称 * @return 根据浏览器order参数返回对应的字符串 */ function dr_sorting($name) { $value = $_GET['order'] ? $_GET['order'] : ''; if (!$value || !$name) { return 'order_sorting'; } if (strpos($value, $name) === 0 && strpos($value, 'asc') !== FALSE) { return 'order_sorting_asc'; } elseif (strpos($value, $name) === 0 && strpos($value, 'desc') !== FALSE) { return 'order_sorting_desc'; } return 'order_sorting'; } /** * 移除order字符串 * @param $url 指定url地址 * @return 把url中的order参数移除 */ function dr_member_order($url) { if (!$url) { return ''; } $data = explode('&', $url); if ($data) { foreach ($data as $t) { if (strpos($t, 'order=') === 0) { $url = str_replace('&' . $t, '', $url); } elseif (strpos($t, 'action=') === 0) { $url = str_replace('&' . $t, '', $url); } } } return $url; } /** * 用户等级 显示星星 * * @param $num * @param $starthreshold 星星数在达到此阈值(设为 N)时,N 个星星显示为 1 个月亮、N 个月亮显示为 1 个太阳。 * @return img标签值 */ function dr_show_stars($num, $starthreshold = 4) { $str = ''; $alt = 'alt="Rank: '.$num.'"'; for ($i = 3; $i > 0; $i--) { $numlevel = intval($num / pow($starthreshold, ($i - 1))); $num = ($num % pow($starthreshold, ($i - 1))); for ($j = 0; $j < $numlevel; $j++) { $str.= ''; } } 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: "
"+msg+"
" }); } ' : ''; return ""; } /** * https进行post数据 * @param $url 请求地址 * @param $param 请求参数数组 * @return 返回信息 */ function dr_post_json_data($url, $param = []) { if (!$url) { return dr_return_data(0, 'url为空'); } $ch = curl_init (); curl_setopt ( $ch, CURLOPT_URL, $url ); curl_setopt ( $ch, CURLOPT_CUSTOMREQUEST, "POST" ); curl_setopt ( $ch, CURLOPT_SSL_VERIFYPEER, FALSE ); curl_setopt ( $ch, CURLOPT_SSL_VERIFYHOST, FALSE ); curl_setopt ( $ch, CURLOPT_USERAGENT, 'Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)' ); curl_setopt ( $ch, CURLOPT_FOLLOWLOCATION, 1 ); curl_setopt ( $ch, CURLOPT_AUTOREFERER, 1 ); curl_setopt ( $ch, CURLOPT_POSTFIELDS, $param); curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true ); $response = curl_exec ( $ch ); if ($error=curl_error($ch)){ return dr_return_data(0, $error); } curl_close($ch); $data = json_decode($response, true); if (!$data) { return dr_return_data(0, $response); } return dr_return_data(1, 'ok', $data); } /** * 调用远程数据 curl获取 * * @param $url * @param $timeout 超时时间,0不超时 * @param $is_log 0表示请求失败不记录到系统日志中 * @param $ct 0表示不尝试重试,1表示重试一次 * @return 请求结果值 */ function dr_catcher_data($url, $timeout = 0, $is_log = true, $ct = 0) { if (!$url) { return ''; } // 获取本地文件 if (strpos($url, 'file://') === 0) { return file_get_contents($url); } elseif (strpos($url, '/') === 0 && is_file(WEBPATH.$url)) { return file_get_contents(WEBPATH.$url); } elseif (!dr_is_url($url)) { if (CI_DEBUG && $is_log) { log_message('error', '获取远程数据失败['.$url.']:地址前缀要求是http开头'); } return ''; } // curl模式 if (function_exists('curl_init')) { $ch = curl_init($url); if (substr($url, 0, 8) == "https://") { curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); // 跳过证书检查 curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, true); // 从证书中检查SSL加密算法是否存在 } if ($ct) { curl_setopt($ch, CURLOPT_HTTPHEADER, array( 'User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:40.0)' . 'Gecko/20100101 Firefox/40.0', 'Accept: */*', 'X-Requested-With: XMLHttpRequest', 'Referer: '.$url, 'Accept-Language: pt-BR,en-US;q=0.7,en;q=0.3', )); curl_setopt($ch, CURLOPT_USERAGENT,'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.1.13) Gecko/20080311 Firefox/2.0.0.13'); } /// curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1 ); // 最大执行时间 $timeout && curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); $data = curl_exec($ch); $code = curl_getinfo($ch,CURLINFO_HTTP_CODE); $errno = curl_errno($ch); if (CI_DEBUG && $errno && $is_log) { log_message('error', '获取远程数据失败['.$url.']:('.$errno.')'.curl_error($ch)); } curl_close($ch); if ($code == 200) { return $data; } elseif ($errno == 35) { // 当服务器不支持时改为普通获取方式 } else { if (!$ct) { // 尝试重试 if (preg_match_all('/[\x{4e00}-\x{9fa5}]/u', $url, $mt)) { foreach ($mt[0] as $t) { $url = str_replace($t, urlencode($t), $url); } } if (strpos($url, ' ')) { $url = str_replace(' ', '%20', $url); } return dr_catcher_data($url, $timeout, $is_log, 1); } elseif (CI_DEBUG && $code && $is_log) { log_message('error', '获取远程数据失败['.$url.']http状态:'.$code); } return ''; } } //设置超时参数 if ($timeout && function_exists('stream_context_create')) { // 解析协议 $opt = [ 'http' => [ 'method' => 'GET', 'timeout' => $timeout, ], 'https' => [ 'method' => 'GET', 'timeout' => $timeout, ] ]; $ptl = substr($url, 0, 8) == "https://" ? 'https' : 'http'; $data = file_get_contents($url, 0, stream_context_create([ $ptl => $opt[$ptl] ])); } else { $data = file_get_contents($url); } return $data; } /** * 伪静态代码处理 * * @param $params 参数数组 * @param $search 搜索配置 * @return string */ function dr_search_rewrite_encode($params, $search) { if (!$params) { return ''; } $join = $search['param_join']; !$join && $join = '-'; if ($search['param_rule']) { // 固定模式 $url = ''; $default = $search['param_join_default_value'] ? $search['param_join_default_value'] : 0; foreach ($search['param_join_field'] as $i => $name) { if (!$name) { break; } $v = isset($params[$name]) ? $params[$name] : $default; if (is_array($v)) { continue; } $url.= $join.urlencode($v); } return trim($url, $join); } else { // 自由组合 return dr_rewrite_encode($params, $join, $search['param_field']); } } /** * 伪静态代码转换为数组 * * @param $params 参数字符串 * @return 参数数组 */ function dr_search_rewrite_decode($params, $search) { if (!$params) { return []; } $join = $search['param_join']; !$join && $join = '-'; if ($search['param_rule']) { // 固定模式 $rt = []; $array = explode($join, $params); $default = $search['param_join_default_value'] ? $search['param_join_default_value'] : 0; foreach ($search['param_join_field'] as $i => $name) { if (!$name) { break; } $rt[$name] = !strcasecmp($array[$i], $default) ? '' : urldecode($array[$i]); } return $rt; } else { // 自由组合 return dr_rewrite_decode($params, $join, $search['param_field']); } } /** * 伪静态代码处理 * * @param $params 参数数组 * @return 组合后的字符串 */ function dr_rewrite_encode($params, $join = '-', $field = []) { if (!$params) { return ''; } !$join && $join = '-'; $field = array_flip(dr_format_option_array($field)); $url = ''; foreach ($params as $i => $t) { if (is_array($t)) { continue; } $i = isset($field[$i]) && $field[$i] ? $field[$i] : $i; $url.= $join.$i.$join.urlencode($t); } return trim($url, $join); } /** * 伪静态代码转换为数组 * * @param $params 参数字符串 * @return 数组参数 */ function dr_rewrite_decode($params, $join = '-', $field = []) { if (!$params) { return []; } $field = dr_format_option_array($field); !$join && $join = '-'; $i = 0; $array = explode($join, $params); $return = []; foreach ($array as $k => $t) { $name = str_replace('$', '_', $t); $name = isset($field[$name]) && $field[$name] ? $field[$name] : $name; $i%2 == 0 && $return[$name] = isset($array[$k+1]) ? urldecode($array[$k+1]) : ''; $i ++; } return $return; } /** * 安全过滤格式化搜索关键词参数 * @param $s 参数 * @return 处理后的值 */ function dr_get_keyword($s) { return dr_safe_keyword($s); } if (!function_exists('dr_safe_keyword')) { /** * 安全过滤格式化搜索关键词参数 * @param $s 参数 * @return 处理后的值 */ function dr_safe_keyword($s) { if (dr_is_empty($s)) { return ''; } return str_replace('\%', '%', \Phpcmf\Service::M()->db->escapeLikeStringDirect(htmlspecialchars(trim(str_replace(['+', ' ', '_'], '%', urldecode((string)$s)), '%')))); } } /** * 安全过滤函数 * @param $string 参数 * @param $diy 自定义过滤数组配置 * @return 处理后的值 */ function dr_safe_replace($string, $diy = []) { if (dr_is_empty($string)) { return ''; } $replace = ['%20', '%27', '%2527', '*', "'", '"', ';', '<', '>', "{", '}', '../', '..\\']; $diy && is_array($diy) && $replace = dr_array2array($replace, $diy); $diy && !is_array($diy) && $replace[] = $diy; return str_replace($replace, '', (string)$string); } /** * 安全过滤文件及目录名称函数 * @param $string 参数 * @return 处理后的值 */ function dr_safe_filename($string) { if (dr_is_empty($string)) { return ''; } return str_replace( ["/", '\\', ' ', '<', '>', "{", '}', ';', ':', '[', ']', '\'', '"', '#', '*', '?', '..'], '', (string)$string ); } /** * 安全过滤用户名函数 * @param $string 参数 * @return 处理后的值 */ function dr_safe_username($string) { if (dr_is_empty($string)) { return ''; } return str_replace( ['..', "/", '\\', ' ', "#",'\'', '"'], '', (string)$string ); } /** * 安全过滤密码函数 * @param $string 参数 * @return 处理后的值 */ function dr_safe_password($string) { if (dr_is_empty($string)) { return ''; } elseif (strlen($string) > 100) { return substr($string, 0, 100); } return trim($string); } /** * 后台移除http和https协议 * @param $url 地址 * @return 处理后的值 */ function dr_rm_http($url) { if (!$url) { return ''; } return IS_ADMIN ? str_replace(['http:', 'https:'], '', $url) : $url; } /** * 将路径进行安全转换变量模式 * @param $path 目录名 * @return 处理后的值 */ function dr_safe_replace_path($path) { if (!$path) { return ''; } return str_replace( [ WRITEPATH, WEBPATH, APPSPATH, TPLPATH, FCPATH, MYPATH, ], [ '/cache/', '/', '/dayrui/App/', '/template/', '/dayrui/', '/dayrui/My/', ], $path ); } /** * 字符截取 * @param $string 字符串 * @param $limit 长度限制 * @param $dot 超出的填充字符串 * @return 处理后的值 */ function dr_strcut($string, $limit = '100', $dot = '...') { if (!$string) { return ''; } // 钩子处理 $rs = \Phpcmf\Hooks::trigger_callback('strcut', $string, $limit, $dot); if ($rs && isset($rs['code']) && $rs['code'] && $rs['msg']) { return $rs['msg']; } $a = 0; if ($limit && strpos((string)$limit, ',')) { list($a, $length) = explode(',', $limit); $length = (int)$length; } else { $length = (int)$limit; } if (strlen($string) <= $length || !$length) { return $string; } if (function_exists('mb_substr')) { $strcut = mb_substr($string, $a, $length); } else { $n = $tn = $noc = 0; $string = str_replace(['&', '"', '<', '>'], ['&', '"', '<', '>'], $string); while ($n < strlen($string)) { $t = ord($string[$n]); if ($t == 9 || $t == 10 || (32 <= $t && $t <= 126)) { $tn = 1; $n++; $noc++; } elseif (194 <= $t && $t <= 223) { $tn = 2; $n += 2; $noc += 2; } elseif (224 <= $t && $t <= 239) { $tn = 3; $n += 3; $noc += 2; } elseif (240 <= $t && $t <= 247) { $tn = 4; $n += 4; $noc += 2; } elseif (248 <= $t && $t <= 251) { $tn = 5; $n += 5; $noc += 2; } elseif ($t == 252 || $t == 253) { $tn = 6; $n += 6; $noc += 2; } else { $n++; } if ($noc >= $length) { break; } } if ($noc > $length) { $n -= $tn; } $strcut = substr($string, 0, $n); $strcut = str_replace(['&', '"', '<', '>'], ['&', '"', '<', '>'], $strcut); } $strcut == $string && $dot = ''; return $strcut . $dot; } /** * 单词截取 * @param $string 字符串 * @param $maxchar 长度限制 * @param $end 超出的填充字符串 * @return 处理后的值 */ function dr_wordcut($text, $maxchar, $end = '...') { if (!$text) { return ''; } if (mb_strlen($text) > $maxchar || $text == '') { $words = preg_split('/\s/', $text); $output = ''; $i = 0; while (1) { $length = mb_strlen($output) + mb_strlen($words[$i]); if ($length > $maxchar) { break; } else { $output .= " " . $words[$i]; ++$i; } } $output .= $end; } else { $output = $text; } return trim((string)$output); } /** * 随机颜色 * @return 随机后的颜色值 */ function dr_random_color() { $str = '#'; for ($i = 0; $i < 6; $i++) { $randNum = rand(0, 15); switch ($randNum) { case 10: $randNum = 'A'; break; case 11: $randNum = 'B'; break; case 12: $randNum = 'C'; break; case 13: $randNum = 'D'; break; case 14: $randNum = 'E'; break; case 15: $randNum = 'F'; break; } $str.= $randNum; } return $str; } /** * 友好时间显示函数 * * @param $time 时间戳 * @param $formt 时间太长时的格式输出 * @return string */ function dr_fdate($sTime, $formt = 'Y-m-d') { if (!$sTime) { return ''; } //sTime=源时间,cTime=当前时间,dTime=时间差 $cTime = time(); $dTime = $cTime - $sTime; $dDay = intval(date('z',$cTime)) - intval(date('z',$sTime)); $dYear = intval(date('Y',$cTime)) - intval(date('Y',$sTime)); if ($dYear > 0) { return date($formt, $sTime); } //n秒前,n分钟前,n小时前,日期 if ($dTime < 60 ) { if ($dTime < 10) { return dr_lang('刚刚'); } else { return dr_lang('%s秒前', intval(floor($dTime / 10) * 10)); } } elseif ($dTime < 3600 ) { return dr_lang('%s分钟前', intval($dTime/60)); } elseif( $dTime >= 3600 && $dDay == 0 ){ return dr_lang('%s小时前', intval($dTime/3600)); } elseif( $dDay > 0 && $dDay<=7 ){ return dr_lang('%s天前', intval($dDay)); } elseif( $dDay > 7 && $dDay <= 30 ){ return dr_lang('%s周前', intval($dDay/7)); } elseif( $dDay > 30 && $dDay < 180){ return dr_lang('%s个月前', intval($dDay/30)); } elseif( $dDay >= 180 && $dDay < 360){ return dr_lang('半年前'); } elseif ($dYear == 0) { return dr_date($sTime); } else { return date($formt, $sTime); } } /** * 时间显示函数 * * @param $time 时间戳 * @param $format 格式与date函数一致 * @param $color 当天显示颜色 * @return string */ function dr_date($time = '', $format = SITE_TIME_FORMAT, $color = '') { if (!$time) { return ''; } if (!is_numeric($time)) { $new = strtotime(dr_clearhtml($time)); if (is_numeric($new)) { $time = $new; } else { return IS_DEV ? '参数('.$time.')不是时间戳格式' : ''; } } if (!$time) { return ''; } !$format && $format = SITE_TIME_FORMAT; !$format && $format = 'Y-m-d H:i:s'; $string = date($format, $time); return $color && $time >= strtotime(date('Y-m-d 00:00:00')) && $time <= strtotime(date('Y-m-d 23:59:59')) ? '' . $string . '' : $string; } /** * 将对象转换为数组 * * @param $obj 数组对象 * @return array */ function dr_object2array($obj) { if (!$obj) { return []; } $_arr = is_object($obj) ? get_object_vars($obj) : $obj; if ($_arr && is_array($_arr)) { foreach ($_arr as $key => $val) { $val = (is_array($val) || is_object($val)) ? dr_object2array($val) : $val; $arr[$key] = $val; } } return $arr; } /** * 数组截取 * @param $arr 数组值 * @param $limit 长度限制 * @return 处理后的数组 */ function dr_arraycut($arr, $limit) { if (!$arr) { return []; } elseif (!is_array($arr)) { return []; } $limit = (string)$limit; if (strpos($limit, ',')) { list($a, $b) = explode(',', $limit); } else { $a = 0; $b = $limit; } return array_slice($arr, $a, $b, true); } /** * 将字符串转换为数组 * * @param $data 字符串 * @return array */ function dr_string2array($data, $limit = '') { if (!$data) { return []; } elseif (is_array($data)) { $rt = $data; } else { $rt = json_decode($data, true); //if (!$rt && IS_DEV) { // 存在安全隐患时改为开发模式下执行 //$rt = unserialize(stripslashes($data)); //} } if (is_array($rt) && $limit) { return dr_arraycut($rt, $limit); } return $rt; } /** * 将数组转换为字符串 * * @param $data 数组 * @return string */ function dr_array2string($data) { if (!$data) { return ''; } if (is_array($data)) { $str = json_encode($data, JSON_UNESCAPED_UNICODE | 320); if (!$str) { if (IS_DEV) { log_message('debug', 'json_encode转换失败:'.json_last_error_msg()); } return ''; } return $str; } else { return $data; } } /** * 递归创建目录 * * @param $dir 目录名称 * @return bool|void */ function dr_mkdirs($dir, $null = true) { if (!$dir) { return FALSE; } if (!is_dir($dir)) { dr_mkdirs(dirname($dir)); if (!is_dir($dir)) { mkdir($dir, 0777, true); } } } /** * 格式化输出文件大小 * * @param $fileSize 大小 * @param $round 保留小数位 * @return string */ function dr_format_file_size($fileSize, $round = 2) { if (!$fileSize) { return 0; } $i = 0; $inv = 1 / 1024; $unit = [' Bytes', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB']; while ($fileSize >= 1024 && $i < 8) { $fileSize *= $inv; ++$i; } $temp = sprintf("%.2f", $fileSize); $value = $temp - (int) $temp ? $temp : $fileSize; return round($value, $round) . $unit[$i]; } /** * 关键字高亮显示 * * @param $string 字符串 * @param $keyword 关键字,可数组 * @return string */ function dr_keyword_highlight($string, $keyword, $rule = '') { if (!$keyword || !$string) { return $string; } if (is_array($keyword)) { $arr = $keyword; } else { $arr = explode(' ', trim(str_replace('%', ' ', urldecode($keyword)), '%')); } if (!$arr) { return $string; } !$rule && $rule = '[value]'; foreach ($arr as $t) { $string = str_ireplace($t, str_replace('[value]', $t, $rule), $string); } return $string; } function dollar($value, $include_cents = TRUE) { if (!$include_cents) { return "$" . number_format($value); } else { return "$" . number_format($value, 2, '.', ','); } } /** * 正则替换和过滤内容 * * @param $html * @return 过滤后的字符串 */ function dr_preg_html($html){ if (!$html) { return ''; } $p = array("/<[a|A][^>]+(topic=\"true\")+[^>]*+>#([^<]+)#<\/[a|A]>/", "/<[a|A][^>]+(data=\")+([^\"]+)\"[^>]*+>[^<]*+<\/[a|A]>/", "/<[img|IMG][^>]+(src=\")+([^\"]+)\"[^>]*+>/"); $t = array('topic{data=$2}','$2','img{data=$2}'); $html = preg_replace($p, $t, $html); $html = strip_tags($html, "
"); return $html; } /** * 格式化微博内容中url内容的长度(废弃) */ function _format_feed_content_url_length($match) { return ''.$match[1].''; } /** * 二维码地址生成 * @param $text 二维码的文字 * @param $uid 中间用户头像的uid * @param $level 码块的大小等级 * @param $size 二维码的大小 * @return 返回二维码地址 */ function dr_qrcode_url($text, $uid = 0, $level = 'L', $size = 5) { return ROOT_URL.'index.php?s=api&c=api&m=qrcode&uid='.urlencode($uid).'&text='.urlencode($text).'&size='.$size.'&level='.$level; } /** * 过滤非排序参数的法字段 * @param $str 字符串 * @param $order 排序方式 * @return 过滤后的值 */ function dr_get_order_string($str, $order) { if ($str && (substr_count($str, ' ') >= 2 || strpos($str, '(') !== FALSE || strpos($str, 'undefined') === 0 || strpos($str, ')') !== FALSE )) { return $order; } return $str ? $str : ($order ? $order : 'id desc'); } /** * 两价格的折扣值 * @param $price 当前价格 * @param $nowprice 以前的价格 * @return 计算后的值 */ function dr_discount($price, $nowprice) { if ($nowprice <= 0) { return 0; } return round(10 / ($price / $nowprice), 1); } /** * 根据两点间的经纬度计算距离 * @param $new 当前坐标 * @param $to 目标坐标 * @param $mark 单位 * @return 返回距离 */ function dr_distance($new, $to, $mark = '米,千米') { list($lng1, $lat1) = explode(',', $new); list($lng2, $lat2) = explode(',', $to); list($lat1) = explode('|', $lat1); list($lat2) = explode('|', $lat2); $lat1 = ($lat1 * pi() ) / 180; $lng1 = ($lng1 * pi() ) / 180; $lat2 = ($lat2 * pi() ) / 180; $lng2 = ($lng2 * pi() ) / 180; $calcLongitude = $lng2 - $lng1; $calcLatitude = $lat2 - $lat1; $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2); $stepTwo = 2 * asin(min(1, sqrt($stepOne))); $earthRadius = 6367000; // approximate radius of earth in meters $calculatedDistance = $earthRadius * $stepTwo; $value = round($calculatedDistance); if (!$mark) { return $value; } $dw = ''; $mark = @explode(',', $mark); if ($value < 1000) { $dw = isset($mark[0]) ? $mark[0] : ''; } elseif ($value >= 1000) { $dw = isset($mark[1]) ? $mark[1] : ''; $dw && $value = $value / 1000; } return $value.$dw; } /** * 计算某个经纬度的周围某段距离的正方形的四个点 * @param $lng float 经度 * @param $lat float 纬度 * @param $distance float 该点所在圆的半径,该圆与此正方形内切,默认值为0.5千米 * @return array 正方形的四个点的经纬度坐标 */ function dr_square_point($lng, $lat, $distance = 0.5){ $r = 6371; //地球半径,平均半径为6371km $distance = $distance ? $distance : 1; $dlng = 2 * asin(sin($distance / (2 * $r)) / cos(deg2rad($lat))); $dlng = rad2deg($dlng); $dlat = $distance/$r; $dlat = rad2deg($dlat); return array( 'left-top'=>array('lat'=> round($lat + $dlat, 6),'lng'=> round($lng-$dlng, 6)), 'right-top'=>array('lat'=> round($lat + $dlat, 6), 'lng'=> round($lng + $dlng, 6)), 'left-bottom'=>array('lat'=> round($lat - $dlat, 6), 'lng'=> round($lng - $dlng, 6)), 'right-bottom'=>array('lat'=> round($lat - $dlat, 6), 'lng'=> round($lng + $dlng, 6)) ); } /** * 获取当前模板目录 */ function dr_tpl_path($is_member = IS_MEMBER) { $tpl = dr_get_app_tpl(APP_DIR && APP_DIR != 'member' ? APP_DIR : ''); $path = $is_member ? $tpl.(\Phpcmf\Service::IS_MOBILE_TPL() && is_dir($tpl.'mobile/'.SITE_TEMPLATE.'/') ? 'mobile' : 'pc').'/'.SITE_TEMPLATE.'/member/' : $tpl.(\Phpcmf\Service::V()->_is_mobile && is_dir($tpl.'mobile/'.SITE_TEMPLATE.'/') ? 'mobile' : 'pc').'/'.SITE_TEMPLATE.'/home/'; APP_DIR && APP_DIR != 'member' && $path.= APP_DIR.'/'; return $path; } /** * 数组随机排序,并截取数组 * @param $arr * @param $num 数量 * @return 新数组 */ function dr_array_rand($arr, $num = 0) { if (!$arr or !is_array($arr)) { return []; } shuffle($arr); return $num ? dr_arraycut($arr, $num) : $arr; } /** * 数组的指定元素大小排序 * @param $arr * @param $key KEY键名 * @param $type 排序方式 asc desc * @return 新数组 */ function dr_array_sort($arr, $key, $type = 'asc') { if (!is_array($arr)) { return []; } uasort($arr, function($a, $b) use ($key, $type) { if (!isset($a[$key])) { return 0; } elseif ($a[$key] == $b[$key]) { return 0; } if ($type == 'asc') { return ($a[$key] < $b[$key]) ? -1 : 1; } else { return ($a[$key] > $b[$key]) ? -1 : 1; } }); return $arr; } /** * 获取网站表单发布页面需要的变量值 */ function dr_get_form_post_value($table, $siteid = SITE_ID) { $rt = [ 'form' => dr_form_hidden(), 'debug' => 'debug返回正常', ]; $form = \Phpcmf\Service::L('cache')->get('form-'.$siteid, $table); if (!$form) { $rt['debug'] = '网站表单【'.$table.'】不存在'; return $rt; } $rt['form_name'] = $form['name']; $rt['form_table'] = $form['table']; $rt['form_cache'] = $form; // 是否有验证码 if ($form['setting']['post_code']) { $member = \Phpcmf\Service::C()->member; if (!$member) { $auth = [0]; } else { $auth = $member['groupid']; if (!$auth) { $auth = [0]; // 没有用户组的视为游客 } } $value = []; foreach ($auth as $k) { if (isset($form['setting']['post_code'][$k])) { $value[] = (int)$form['setting']['post_code'][$k]; } } $rt['is_post_code'] = $value ? max($value) : 0; } else { $rt['is_post_code'] = 0; } // 返回url $rt['rt_url'] = $form['setting']['rt_url'] ? $form['setting']['rt_url'] : (defined('SC_HTML_FILE') ? '' : dr_now_url()); // 初始化自定义字段类 $field = $form['field']; $my_field = $sys_field = $diy_field = []; $field = dr_array_sort($field, 'displayorder'); foreach ($field as $i => $t) { if ($t['setting']['is_right'] == 1) { // 右边字段归类为系统字段 if (IS_ADMIN) { $sys_field[$i] = $t; } else { $my_field[$i] = $t; } } elseif ($t['setting']['is_right'] == 2) { // diy字段 $diy_field[$i] = $t; } else { $my_field[$i] = $t; } } $rt['myfield'] = \Phpcmf\Service::L('Field')->toform(0, $my_field, []); $rt['sysfield'] = \Phpcmf\Service::L('Field')->toform(0, $sys_field, []); $rt['diyfield'] = \Phpcmf\Service::L('Field')->toform(0, $diy_field, []); $rt['post_url'] = dr_web_prefix('index.php?s=form&c='.$table.'&m=post'); return $rt; } /** * 获取模块表单发布页面需要的变量值 */ function dr_get_mform_post_value($mid, $table, $cid, $siteid = SITE_ID) { $rt = [ 'form' => dr_form_hidden(), 'debug' => 'debug返回正常', ]; $module = \Phpcmf\Service::L('cache')->get('module-'.$siteid.'-'.$mid); if (!$module) { $rt['debug'] = '模块【'.$mid.'】不存在'; return $rt; } $form = $module['form'][$table]; if (!$form) { $rt['debug'] = '模块【'.$mid.'】表单【'.$table.'】不存在'; return $rt; } $rt['form_name'] = $form['name']; $rt['form_table'] = $form['table']; $rt['form_cache'] = $form; $rt['module_cache'] = $module; // 是否有验证码 $rt['is_post_code'] = $form['setting']['is_post_code'] ? 0 : 1; // 返回url $rt['rt_url'] = $form['setting']['rt_url'] ? $form['setting']['rt_url'] : (defined('SC_HTML_FILE') ? '' : dr_now_url()); // 初始化自定义字段类 $field = $form['field']; $my_field = $sys_field = $diy_field = []; $field = dr_array_sort($field, 'displayorder'); foreach ($field as $i => $t) { if ($t['setting']['is_right'] == 1) { // 右边字段归类为系统字段 if (IS_ADMIN) { $sys_field[$i] = $t; } else { $my_field[$i] = $t; } } elseif ($t['setting']['is_right'] == 2) { // diy字段 $diy_field[$i] = $t; } else { $my_field[$i] = $t; } } $rt['myfield'] = \Phpcmf\Service::L('Field')->toform(0, $my_field, []); $rt['sysfield'] = \Phpcmf\Service::L('Field')->toform(0, $sys_field, []); $rt['diyfield'] = \Phpcmf\Service::L('Field')->toform(0, $diy_field, []); $rt['post_url'] = dr_web_prefix('index.php?s='.$mid.'&c='.$table.'&m=post&cid='.$cid); return $rt; } /** * 获取用户注册页面需要的变量值 */ function dr_get_register_value($groupid = 0, $url = '') { $rt = [ 'form' => dr_form_hidden(['back' => $url]), 'debug' => 'debug返回正常', ]; !$groupid && $groupid = (int)\Phpcmf\Service::C()->member_cache['register']['groupid']; if (!$groupid) { $rt['debug'] = dr_lang('无效的用户组'); return $rt; } elseif (!\Phpcmf\Service::C()->member_cache['group'][$groupid]['register']) { $rt['debug'] = dr_lang('用户组[%s]不允许注册', \Phpcmf\Service::C()->member_cache['group'][$groupid]['name']); return $rt; } // 初始化自定义字段类 \Phpcmf\Service::L('Field')->app('member'); // 获取该组可用注册字段 $field = []; if (\Phpcmf\Service::C()->member_cache['group'][$groupid]['register_field']) { foreach (\Phpcmf\Service::C()->member_cache['group'][$groupid]['register_field'] as $fname) { $field[$fname] = \Phpcmf\Service::C()->member_cache['field'][$fname]; $field[$fname]['ismember'] = 1; } } // 初始化自定义字段类 $my_field = $sys_field = $diy_field = []; $field = dr_array_sort($field, 'displayorder'); foreach ($field as $i => $t) { if ($t['setting']['is_right'] == 1) { // 右边字段归类为系统字段 if (IS_ADMIN) { $sys_field[$i] = $t; } else { $my_field[$i] = $t; } } elseif ($t['setting']['is_right'] == 2) { // diy字段 $diy_field[$i] = $t; } else { $my_field[$i] = $t; } } $rt['myfield'] = \Phpcmf\Service::L('Field')->toform(0, $my_field, []); $rt['sysfield'] = \Phpcmf\Service::L('Field')->toform(0, $sys_field, []); $rt['diyfield'] = \Phpcmf\Service::L('Field')->toform(0, $diy_field, []); $rt['register'] = \Phpcmf\Service::C()->member_cache['register']; return $rt; } /** * 获取当前模板文件路径 * @param $file 模板名 * @return 返回完整名 */ function dr_tpl_file($file) { return dr_tpl_path().$file; } /** * 兼容统计count函数 */ function dr_count($array_or_countable, $mode = COUNT_NORMAL){ return is_array($array_or_countable) || is_object($array_or_countable) ? count($array_or_countable, $mode) : 0; } /** * 给地址补全https或者http前缀 */ function dr_http_prefix($url) { return (defined('SYS_HTTPS') && SYS_HTTPS ? 'https://' : 'http://').$url; } /** * 转换url * @param $Url 指定地址 * @param $domian 指定域名 或者 模块目录 * @param int|string $siteid 站点id号 * @return 新的url */ function dr_to_url($url, $domian = '', $siteid = SITE_ID) { $url = dr_url_prefix($url, '', $siteid, 1); if ($domian) { $url = str_replace(SITE_URL, dr_http_prefix($domian), $url); } return $url; } /** * 获取对应的手机端地址 * @param $url 任意域名 * @return 新的url */ function dr_mobile_url($url = SITE_MURL) { $url = dr_url_prefix($url); $arr = parse_url($url); $host = $arr['host']; $domain = require WRITEPATH.'config/domain_client.php'; if (!$domain) { return IS_DEV ? '【开发者模式下】未找到域名的终端配置文件' : $url; } elseif (!isset($domain[$host])) { return IS_DEV ? '【开发者模式下】未找到PC域名['.$host.']所对应的移动端域名' : $url; } return dr_url_prefix(str_replace($host, $domain[$host], $url)); } /** * 是否是完整的url * @param $url * @return boolean */ function dr_is_url($url) { if (!$url) { return false; } elseif (strpos((string)$url, 'http://') === 0) { return true; } elseif (strpos((string)$url, 'https://') === 0) { return true; } return false; } /** * 补全url * @param $url * @param string $domain 指定域名或者模块目录 * @param int|string $siteid 站点ID * @param string $is_mobile 是否指定为移动端 * @return 新的url */ function dr_url_prefix($url, $domain = '', $siteid = SITE_ID, $is_mobile = '') { !$url && $url = ''; if ($url && dr_is_url($url)) { // 本身就是绝对域名 } else { // 相对域名 strlen($is_mobile) == 0 && $is_mobile = \Phpcmf\Service::IS_MOBILE(); if (is_array($domain) && isset($domain['setting']['html_domain']) && $domain['setting']['html_domain']) { $domain = dr_http_prefix($is_mobile && $domain['setting']['html_domain'] ? $domain['setting']['html_domain'] : $domain['setting']['html_domain']); } in_array($domain, ['MOD_DIR', 'share']) && $domain = ''; // 判断是否是模块,如果domain不是http开头 if ($domain && !dr_is_url($url)) { if (is_dir(dr_get_app_dir($domain))) { $mod = \Phpcmf\Service::L('cache')->get('module-'.$siteid.'-'.$domain); if ($mod && $mod['domain']) { $domain = \Phpcmf\Service::IS_MOBILE() && $mod['mobile_domain'] ? $mod['mobile_domain'] : $mod['domain']; } } // 域名是不是http开通 if (!dr_is_url($domain)) { $domain = ''; } } // 指定域名判断 if (!$domain) { if (defined('IS_CLIENT') && IS_CLIENT) { // 来自客户端 $domain = CLIENT_URL; } elseif (\Phpcmf\Service::C()->site_info[$siteid]['SITE_URL']) { // 存在多站点时 $domain = $is_mobile ? \Phpcmf\Service::C()->site_info[$siteid]['SITE_MURL'] : \Phpcmf\Service::C()->site_info[$siteid]['SITE_URL']; if (WEB_DIR && strpos($domain, WEB_DIR) !== false && strpos($url, WEB_DIR) !== false) { // 目录模式防止目录重复出现 $url = str_replace(WEB_DIR, '/', $url); } } else { $domain = $is_mobile ? SITE_MURL : SITE_URL; } } $url = dr_is_url($url) ? $url : rtrim($domain, '/').'/'.ltrim($url, '/'); } // url地址替换动作 if (defined('SYS_URL_REPLACE') && SYS_URL_REPLACE) { $arr = explode(',', SYS_URL_REPLACE); if ($arr) { foreach ($arr as $t) { list($a, $b) = explode('|', $t); if ($a) { $url = str_replace($a, $b, $url); } } } } return $url; } /** * 补全相对路径 * @param $url * @return 新的url */ function dr_web_prefix($url) { if ($url && dr_is_url($url)) { return dr_url_rel($url); } else { $url = (string)$url; return WEB_DIR.($url ? ltrim($url, '/') : ''); } } /** * url转为完整路径 URL补全 * @param $url * @param $prefix 指定替换域名/ * @return 新的url */ function dr_url_full($url, $prefix = '') { return dr_url_prefix($url, $prefix); } /** * url转为相对路径 * @param $url * @param $prefix 将指定字符串替换成/ * @return 新的url */ function dr_url_rel($url, $prefix = '') { if ((IS_API_HTTP && (!defined('SYS_API_REL') || !SYS_API_REL)) || IS_ADMIN) { return $url; } elseif (defined('SYS_URL_REL') && SYS_URL_REL) { $surl = FC_NOW_HOST; if (defined('SC_HTML_FILE') && SITE_IS_MOBILE_HTML && \Phpcmf\Service::V()->_is_mobile && strpos(SITE_MURL, SITE_URL) === false ) { // 静态生成,移动端域名模式下 $surl = SITE_MURL; } $url = str_replace([$surl, SITE_URL], '/', $url); if (IS_DEV && dr_is_url($url)) { $url.= '#系统开启了相对路径模式,本地址是站外域名,不能转为相对路径(在关闭开发者模式后不显示这句话)'; } $prefix && $url = str_replace($prefix, '/', $url); } return $url; } /** * 内容中的转为相对路径 * @param $text * @param $prefix 将指定字符串替换成/ * @param $attr 将指定替换哪些标签 ['href', 'src'] * @return 新的内容 */ function dr_text_rel($text, $prefix = '', $attr = ['href', 'src']) { if ((IS_API_HTTP && (!defined('SYS_API_REL') || !SYS_API_REL)) || IS_ADMIN) { return $text; } elseif (defined('SYS_URL_REL') && SYS_URL_REL) { $surl = FC_NOW_HOST; if (defined('SC_HTML_FILE') && SITE_IS_MOBILE_HTML && \Phpcmf\Service::V()->_is_mobile && strpos(SITE_MURL, SITE_URL) === false ) { // 静态生成,移动端域名模式下 $surl = SITE_MURL; } foreach ($attr as $a) { $text = str_replace($a.'="'.$surl, $a.'="/', $text); $text = str_replace($a.'=\''.$surl, $a.'="/', $text); $text = str_replace($a.'="'.SITE_URL, $a.'="/', $text); $text = str_replace($a.'=\''.SITE_URL, $a.'="/', $text); } if ($prefix) { $surl = $prefix; foreach ($attr as $a) { $text = str_replace($a.'="'.$surl, $a.'="/', $text); $text = str_replace($a.'=\''.$surl, $a.'="/', $text); } } } return $text; } /** * 内容中的转为完整路径,地址补全绝对路径 * @param $text * @param $url 将/替换成哪个地址 * @param $attr 将指定替换哪些标签 ['href', 'src'] * @return 新的内容 */ function dr_text_full($text, $url = SITE_URL, $attr = ['href', 'src']) { foreach ($attr as $a) { $text = str_replace($a.'="/', $a.'="'.$url, $text); $text = str_replace($a.'="/', $a.'=\''.$url, $text); } return $text; } /** * 计算用户组到期时间 * @param $days 天数 * @param $dtype 到期换算单位 * @param $ntime 时间基数,默认为当前时间 * @return 是否到期 */ function dr_member_group_etime($days, $dtype, $ntime = 0) { if (!$days) { return 0; } if (!$ntime) { $ntime = SYS_TIME; } if ($dtype == 1) { return strtotime('+'.$days.' month', $ntime); } elseif ($dtype == 2) { return strtotime('+'.$days.' year', $ntime); } else { return strtotime('+'.$days.' day', $ntime); } } /** * 用户组到期时间单位 * @param $dtype 到期换算单位 * @return 单位 */ function dr_member_group_dtype($dtype) { if ($dtype == 1) { return dr_lang('月'); } elseif ($dtype == 2) { return dr_lang('年'); } else { return dr_lang('天'); } } /** * 处理带Emoji的数据,HTML转为emoji码 * @param $msg 转换字符串 * @return 新的字符串 */ function dr_html2emoji($msg){ if (!$msg) { return ''; } if (substr($msg, 0, 1) == '"' && substr($msg, -1, 1) == '"') { $txt = json_decode(str_replace('|', '\\', $msg)); if ($txt !== NULL) { $msg = $txt; } return trim($msg, '"'); } else { return $msg; } } /** * 处理带Emoji的数据,写入数据库前的emoji转为HTML(废除) */ function dr_emoji2html($msg) { return $msg; // utf8mb4模式下原样输出 } /** * 过滤emoji表情 * @param type $str * @return 新的字符串 */ function dr_clear_emoji($str){ if (!$str) { return ''; } return dr_clear_empty(dr_html2emoji(preg_replace_callback('/[\xf0-\xf7].{3}/', function($r) { return '';}, $str))); } /** * 将同步代码转为数组(废除) * @param string 同步代码字符串 */ function dr_member_sync_url($string) { if (!$string) { return []; } if (preg_match_all('/src="(.+)"/iU', $string, $match)) { return $match[1]; } return []; } /** * 文字转换拼音 * @param $str * @return 新的字符串 */ function dr_text2py($str) { return \Phpcmf\Service::L('pinyin')->result((string)$str); } /** * 将html转化为纯文字 * @param $str * @param $cn 是否纯中文 * @return 新的字符串 */ function dr_html2text($str, $cn = false) { $str = dr_clearhtml($str); if ($cn && preg_match_all('/[\x{4e00}-\x{9fff}]+/u', $str, $mt)) { return join('', $mt[0]); } $text = ""; $start = 1; for ($i=0;$i") { $start = 1; } elseif($start==1) { if ($str[$i]=="<") { $start = 0; $text.= " "; } elseif(ord($str[$i])>31) { $text.= $str[$i]; } } } return $text; } /** * 批量 htmlspecialchars */ function dr_htmlspecialchars($param) { if (!$param) { return is_array($param) ? [] : ''; } elseif (is_array($param)) { foreach ($param as $a => $t) { if ($t && !is_array($t)) { $param[$a] = htmlspecialchars($t); } } } else { $param = htmlspecialchars($param); } return $param; } /** * 当前是否是根目录 */ function dr_is_root_path() { if (!isset($_SERVER['SCRIPT_FILENAME'])) { return false; } $path = dirname($_SERVER['SCRIPT_FILENAME']); return is_file($path.'/static/assets/global/css/admin.min.css') && is_file($path.'/static/assets/js/cms.js'); } /** * 检查目录权限 * @param $dir 目录地址 * @return 逻辑值 */ function dr_check_put_path($dir) { if (!$dir) { return 0; } elseif (!is_dir($dir)) { return 0; } $size = file_put_contents($dir.'test.html', 'test'); if ($size === false) { return 0; } else { unlink($dir.'test.html'); return 1; } } /** * 存储调试信息 * @param file 存储文件 * @param data 打印变量 * @return 无 */ function dr_debug($file, $data) { dr_mkdirs(WRITEPATH.'debuglog/'); $debug = debug_backtrace(); file_put_contents(WRITEPATH.'debuglog/'.dr_safe_filename($file).'.txt', var_export([ '时间' => dr_date(SYS_TIME, 'Y-m-d H:i:s'), '终端' => (string)$_SERVER['HTTP_USER_AGENT'], '文件' => $debug[0]['file'], '行号' => $debug[0]['line'], '地址' => FC_NOW_URL, '变量' => $data, ], true).PHP_EOL.'=========================================================='.PHP_EOL, FILE_APPEND); } // 正则替换方法 class php5replace { private $data; function __construct($data) { $this->data = $data; } // 替换常量值 function php55_replace_var($value) { if (defined($value[1])) { // 常量 return constant($value[1]); } else { // 数组 $val = \Phpcmf\Service::C()->get_cache('site', SITE_ID, 'config', $value[1]); return call_user_func(function($arg) { return $arg; }, ($val ? $val : '""')); } } // 替换数组变量值 function php55_replace_data($value) { if (isset($value[2]) && $value[2] && isset($this->data[$value[1]]) && is_array($this->data[$value[1]]) && isset($this->data[$value[1]][$value[2]])) { return $this->data[$value[1]][$value[2]]; } return $this->data[$value[1]]; } // 替换数组变量值 function php55_replace_or_data($value) { if (isset($value[1]) && $value[1] && isset($this->data[$value[1]]) && $this->data[$value[1]]) { return $this->data[$value[1]]; } elseif (isset($value[2]) && $value[2] && isset($this->data[$value[2]]) && $this->data[$value[2]]) { return $this->data[$value[2]]; } return ''; } // 替换函数值 function php55_replace_function($value) { if (!dr_is_safe_function($value[1])) { return '函数['.$value[1].']不安全,禁止在此处使用'; } elseif (function_exists($value[1])) { // 执行函数体 $param = ''; if ($value[2]) { $p = $value[2] == '$data' ? $this->data : $value[2]; $param = is_array($p) ? ['data' => $p] : explode(',', $p); foreach ($param as $i => $t) { if (!is_array($t) && strpos($t, '$') === 0) { $param[$i] = $this->data[substr($t, 1)]; } } } return $param ? call_user_func_array($value[1], $param) : call_user_func($value[1]); } else { return '函数['.$value[1].']未定义'; } return $value[0]; } // 替换全部 function replace($value) { $value = preg_replace_callback('#{\$([a-z_0-9]+)}#U', [$this, 'php55_replace_data'], $value); $value = preg_replace_callback('#{\$([a-z_0-9]+)\.([a-z_0-9]+)}#U', [$this, 'php55_replace_data'], $value); $value = preg_replace_callback('#{([a-z_0-9]+)\((.*)\)}#Ui', [$this, 'php55_replace_function'], $value); $value = preg_replace_callback('#{([A-Z_]+)}#U', [$this, 'php55_replace_var'], $value); $value = preg_replace_callback('#{([a-z_0-9]+)}#U', [$this, 'php55_replace_data'], $value); $value = preg_replace_callback('#{([a-z_0-9]+)\|\|([a-z_0-9]+)}#U', [$this, 'php55_replace_or_data'], $value); $value = preg_replace_callback('#{([a-z_0-9]+)\.([a-z_0-9]+)}#U', [$this, 'php55_replace_data'], $value); return $value; } } /** * 转为utf8编码格式 * @param $str 来源字符串 */ function dr_code2utf8($str) { if (function_exists('mb_convert_encoding')) { return mb_convert_encoding($str, 'UTF-8', 'GBK'); } elseif (function_exists('iconv')) { return iconv('GBK', 'UTF-8', $str);; } return $str; } //////////////////////////////////////////////////////////// // 函数安全性判断 if (!function_exists('dr_is_safe_function')) { function dr_is_safe_function($func) { $dangerous = [ 'apache_child_terminate', 'apache_setenv', 'define_syslog_variables', 'escapeshellarg', 'escapeshellcmd', 'eval', 'exec', 'fp', 'fput', 'ftp_connect', 'ftp_exec', 'ftp_get', 'ftp_login', 'ftp_nb_fput', 'ftp_put', 'ftp_raw', 'ftp_rawlist', 'highlight_file', 'ini_alter', 'ini_get_all', 'ini_restore', 'inject_code', 'mysql_pconnect', 'openlog', 'passthru', 'php_uname', 'phpAds_remoteInfo', 'phpAds_XmlRpc', 'phpAds_xmlrpcDecode', 'phpAds_xmlrpcEncode', 'popen', 'posix_getpwuid', 'posix_kill', 'posix_mkfifo', 'posix_setpgid', 'posix_setsid', 'posix_setuid', 'posix_uname', 'proc_close', 'proc_get_status', 'proc_nice', 'proc_open', 'proc_terminate', 'shell_exec', 'syslog', 'system', 'xmlrpc_entity_decode', ]; if (in_array(strtolower((string)$func), $dangerous, true)) { return false; } return true; } } // 回调函数安全性判断 if (!function_exists('dr_is_call_function')) { function dr_is_call_function($func) { if (strpos($func, 'dr_') === 0 or strpos($func, 'my_') === 0 or strpos($func, 'cloud_') === 0) { if (function_exists($func)) { return true; } } else { log_message('error', '回调函数【'.$func.'】必须以dr_或者my_开头!'); } return false; } } // 兼容性判断 if (!function_exists('gethostbyname')) { function gethostbyname($domain) { return $domain; } } // 兼容性判断 if (!function_exists('ctype_digit')) { function ctype_digit($num) { if (strpos($num, '.') !== FALSE) { return false; } return is_numeric($num); } } // 兼容性判断 if (!function_exists('ctype_alpha')) { function ctype_alpha($num) { if (strpos($num, '.') !== FALSE) { return false; } return is_numeric($num); } } // 兼容性判断 if (!function_exists('is_php')) { function is_php($version) { static $_is_php; $version = (string) $version; if ( ! isset($_is_php[$version])) { $_is_php[$version] = version_compare(PHP_VERSION, $version, '>='); } return $_is_php[$version]; } } if (! function_exists('dr_clearhtml')) { /** * 清除HTML标记 * * @param string $str * @return string */ function dr_clearhtml($str) { if (is_array($str) || !$str) { return ''; } $str = strip_tags((string)$str); $str = dr_code2html($str); $str = str_replace( [' ', '&', '"', ''', '“', '”', '—', '<', '>', '·', '…'], [' ', '&', '"', "'", '“', '”', '—', '<', '>', '·', '…'], $str ); $str = preg_replace("/\<[a-z]+(.*)\>/iU", "", (string)$str); $str = preg_replace("/\<\/[a-z]+\>/iU", "", (string)$str); $str = str_replace(array(PHP_EOL, chr(13), chr(10), ' '), '', $str); return trim($str); } } if (! function_exists('dr_redirect')) { /** * 跳转地址 */ function dr_redirect($url = '', $method = 'auto', $code = 0) { if ($url == FC_NOW_URL) { return; // 防止重复定向 } switch ($method) { case 'refresh': header('Refresh:0;url='.$url); break; default: header('Location: '.$url, TRUE, $code); break; } exit; } } if (! function_exists('dr_redirect_safe_check')) { /** * 跳转地址安全检测 */ function dr_redirect_safe_check($url) { return $url; } } if ( ! function_exists('dr_directory_map')) { /** * 目录列表获取(废除) * @param $source_dir 源目录 * @param $directory_depth 目录纵深 0全目录 1当前目录 * @param $hidden 是否包含隐藏目录 * @return 整个目录名的数组格式 */ function dr_directory_map($source_dir, $directory_depth = 0, $hidden = FALSE) { return dr_dir_map($source_dir, $directory_depth, $hidden); } } if (! function_exists('remove_invisible_characters')) { /** * 移除不规则的字符串 */ function remove_invisible_characters($str, $urlEncoded = true) { $nonDisplayables = []; // every control character except newline (dec 10), // carriage return (dec 13) and horizontal tab (dec 09) if ($urlEncoded) { $nonDisplayables[] = '/%0[0-8bcef]/'; // url encoded 00-08, 11, 12, 14, 15 $nonDisplayables[] = '/%1[0-9a-f]/'; // url encoded 16-31 } $nonDisplayables[] = '/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S'; // 00-08, 11, 12, 14-31, 127 do { $str = preg_replace($nonDisplayables, '', $str, -1, $count); } while ($count); return $str; } } // 快速下单 判断是否购买// 0 没有购买 1 购买了 if (!function_exists('dr_is_buy')) { function dr_is_buy($fid, $id, $uid = 0, $sku = '') { $field = \Phpcmf\Service::C()->get_cache('table-field', $fid); if (!$field) { return 0; } $data = \Phpcmf\Service::C()->get_cache('table-pay-'.SITE_ID, $field['relatedname'].'-'.$field['relatedid']); if (!$data) { return 0; } !$uid && $uid = (int)\Phpcmf\Service::C()->uid; // buy-表名-主键id-字段id*** 模糊匹配 $mid = $sku ? 'buy-'.$data['table'].'-'.$id.'-'.$field['id'].'-%-'.$sku : 'buy-'.$data['table'].'-'.$id.'-'.$field['id'].'%'; return \Phpcmf\Service::M()->db->table('member_paylog')->where('uid', $uid)->where('status', 1)->like('mid', $mid)->countAllResults(); } } if(!function_exists('mime_content_type')) { function mime_content_type($filename) { $mime_types = array( 'txt' => 'text/plain', 'htm' => 'text/html', 'html' => 'text/html', 'php' => 'text/html', 'css' => 'text/css', 'js' => 'application/javascript', 'json' => 'application/json', 'xml' => 'application/xml', 'swf' => 'application/x-shockwave-flash', 'flv' => 'video/x-flv', // images 'png' => 'image/png', 'jpe' => 'image/jpeg', 'jpeg' => 'image/jpeg', 'jpg' => 'image/jpeg', 'gif' => 'image/gif', 'bmp' => 'image/bmp', 'ico' => 'image/vnd.microsoft.icon', 'tiff' => 'image/tiff', 'tif' => 'image/tiff', 'svg' => 'image/svg+xml', 'svgz' => 'image/svg+xml', // archives 'zip' => 'application/zip', 'rar' => 'application/x-rar-compressed', 'exe' => 'application/x-msdownload', 'msi' => 'application/x-msdownload', 'cab' => 'application/vnd.ms-cab-compressed', // audio/video 'mp3' => 'audio/mpeg', 'qt' => 'video/quicktime', 'mov' => 'video/quicktime', // adobe 'pdf' => 'application/pdf', 'psd' => 'image/vnd.adobe.photoshop', 'ai' => 'application/postscript', 'eps' => 'application/postscript', 'ps' => 'application/postscript', // ms office 'doc' => 'application/msword', 'rtf' => 'application/rtf', 'xls' => 'application/vnd.ms-excel', 'ppt' => 'application/vnd.ms-powerpoint', // open office 'odt' => 'application/vnd.oasis.opendocument.text', 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', ); $ext = strtolower(array_pop(explode('.',$filename))); if (array_key_exists($ext, $mime_types)) { return $mime_types[$ext]; } elseif (function_exists('finfo_open')) { $finfo = finfo_open(FILEINFO_MIME); $mimetype = finfo_file($finfo, $filename); finfo_close($finfo); return $mimetype; } else { return 'application/octet-stream'; } } } if (!function_exists('mb_strlen')) { function mb_strlen($str) { return strlen($str); } } if (!function_exists('array_key_first')) { function array_key_first(array $arr) { foreach($arr as $key => $unused) { return $key; } return NULL; } } //////////////////////////////////////////////////////////// function dr_url($url, $query = [], $self = SELF) { return \Phpcmf\Service::L('router')->url($url, $query, $self); } function dr_furl($name) { return \Phpcmf\Service::L('router')->furl($name); } function dr_get_tag_url($name, $mid = '') { return \Phpcmf\Service::L('router')->get_tag_url($name, $mid); } function dr_comment_url($id, $moddir = '') { return \Phpcmf\Service::L('router')->comment_url($id, $moddir); } function dr_form_show_url($table, $id, $page = 0) { return \Phpcmf\Service::L('router')->form_show_url($table, $id, $page); } function dr_oauth_url($name, $type, $gourl = '') { return \Phpcmf\Service::L('router')->oauth_url($name, $type, $gourl); } function dr_member_url($url, $query = [], $self = 'index.php') { return \Phpcmf\Service::L('router')->member_url($url, $query, $self); } function dr_search_url($params = [], $name = '', $value = '', $moddir = '') { return \Phpcmf\Service::L('router')->search_url($params, $name, $value, $moddir); } //////////////////////////简化函数/////////////////////////// function XR_L($name, $namespace = '') { return \Phpcmf\Service::L($name, $namespace); } function XR_M($name = '', $namespace = '') { return \Phpcmf\Service::M($name, $namespace); } function XR_H($name, $namespace) { return \Phpcmf\Service::H($name, $namespace); } function XR_R($name, $clear = false) { return \Phpcmf\Service::R($name, $clear); } function XR_C() { return \Phpcmf\Service::C(); } function XR_V() { return \Phpcmf\Service::V(); } function XR_DB() { return \Phpcmf\Service::M()->db; }