/** 输出代码 @param string $title 标题 @param string $left 左侧按钮 @param string $right 右侧按钮 @param string $inside 主体内容 @return string */ public function output($title, $leftmenu = array(), $rightmenu = array(), $inside = null) { global $king, $action; $module = $this->getPath(); //获得当前的模块地址 $skinpath = $king->admin ? $king->admin['adminskins'] : 'default'; $outTmp = 'system/skins/' . $skinpath . '/' . $module; !file_exists(ROOT . $outTmp) && ($outTmp = 'system/skins/' . $skinpath . '/default.htm'); //设置默认的模板 $tmp = new KC_template_class($outTmp); //左侧按钮数组格式化 if (is_array($leftmenu)) { foreach ($leftmenu as $key => $val) { if ($key === $action) { //当键值和$action相同时,增加class值sel $leftmenu[$key]['class'] = isset($val['class']) ? $val['class'] . ' sel' : 'sel'; } $leftmenu[$key]['title'] = htmlspecialchars($val['title']); //当href为空的时候,设置值为javascript:; $leftmenu[$key]['href'] = isset($val['href']) ? $val['href'] : 'javascript:;'; } } //右侧按钮数组格式化 if (is_array($rightmenu)) { foreach ($rightmenu as $key => $val) { $rightmenu[$key]['title'] = htmlspecialchars($val['title']); $rightmenu[$key]['href'] = isset($val['href']) ? $val['href'] : 'javascript:;'; } } $tmp->assign('title', $title); $tmp->assign('leftmenu', $leftmenu); $tmp->assign('rightmenu', $rightmenu); $tmp->assign('inside', $inside); if ($king->admin) { $tmp->assign('logout', '<a href="javascript:;" class="k_ajax" rel="{CMD:\'logout\',URL:\'../system/login.php\'}">' . $king->lang->get('system/login/logout') . '</a>'); $tmp->assign('resetpwd', '<a href="javascript:;" class="k_ajax" rel="{URL:\'../system/manage.php\',CMD:\'pass\',METHOD:\'GET\'}" title="' . $king->lang->get('system/admin/pass') . '">' . $king->lang->get('system/admin/pass') . '</a>'); $tmp->assign('adminname', $king->admin['adminname']); $tmp->assign('adminskins', $king->admin['adminskins']); $tmp->assign('faq', '<a href="javascript:;" class="k_ajax" rel="{CMD:\'faq\',URL:\'../system/manage.php\'}" title="' . $king->lang->get('system/common/faq') . '">' . kc_icon('l9') . '</a>'); } $tmp->assign('copyright', 'Copyright © <a href="http://www.kingcms.com/" target="_blank"><strong>King</strong>CMS<i>.com</i></a> All Rights Reserved.'); $tmp->assign('runtime', kc_formattime(kc_script_runtime())); $output = $tmp->output() . "\n<!--\n"; foreach ($GLOBALS['KC_RUNTIME'] as $key => $val) { $output .= "{$key}\t[{$val['number']}][" . kc_formattime($val['runtime']) . "]\n"; //.print_r($GLOBALS['KC_RUNTIME'],1). } $output .= "-->"; if ($king->config('gzencode') && $king->admin) { //启用gzip压缩 header("Content-Encoding: gzip"); exit(gzencode($output, 9)); } else { //不使用 exit($output); } }
/** 进度条界面 进度条 @param string $id 进度条的ID @param string $title 进度条中显示的内容 @param int $num 当前项目数 @param int $count 项目总数 @param string $body moreinfo中输出的内容 @$_GET['time'] 函数外参数,页面开始执行时间,必须值 */ function kc_progress($id = 'progress', $title = null, $num = 0, $count = 1, $body = '') { global $king; if (!$title) { $title = $king->lang->get('system/progress/loading'); } list($_msec, $_sec) = explode(' ', microtime()); $thistime = $_sec + $_msec; switch ($num) { case 0: $count === 0 ? $s = '<script>window.parent.$.kc_progress(\'' . $id . '\',\'' . $king->lang->get('system/progress/ok') . ' (' . $king->lang->get('system/progress/not') . ')\',300)</script>' : ($s = '<p class="k_progress" id="' . $id . '"><label>' . $title . '</label><span><em style="width:0px;"></em></span><var>0%</var></p>'); break; /* case $num>=$count: $diffstart=$thistime-$_GET['time'];//开始时间差 $str=$king->lang->get('system/progress/alltime').': '.kc_formattime($diffstart); $s='<script>window.parent.$.kc_progress(\''.$id.'\',\''.$king->lang->get('system/progress/ok').'\',\''.$count.'/'.$count.' '.$str.'\',500);$(\'body\').prepend(\''.addslashes($body).'\')</script>'; break; */ /* case $num>=$count: $diffstart=$thistime-$_GET['time'];//开始时间差 $str=$king->lang->get('system/progress/alltime').': '.kc_formattime($diffstart); $s='<script>window.parent.$.kc_progress(\''.$id.'\',\''.$king->lang->get('system/progress/ok').'\',\''.$count.'/'.$count.' '.$str.'\',500);$(\'body\').prepend(\''.addslashes($body).'\')</script>'; break; */ default: //判断客户端的链接状态 if (connection_aborted()) { exit; } $prop = $num / $count; $percent = round($prop * 100, 1); //百分比 list($_msec, $_sec) = explode(' ', microtime()); $time = $_sec + $_msec; //当前时间 if (empty($GLOBALS['KC_PROGRESS_TIME'])) { //有上次执行时间 $GLOBALS['KC_PROGRESS_TIME'] = $GLOBALS['KC_START_SCRIPT_RUNTIME']; } $timediff = $time - $GLOBALS['KC_PROGRESS_TIME']; //单次运行时差 $GLOBALS['KC_PROGRESS_TIME'] = $time; //设置时间 $diff_this = $time - $_GET['time']; //当前到最初的时间差 $str = $king->lang->get('system/progress/remainder') . ': ' . kc_formattime($diff_this / $num * ($count - $num)); $s = '<script>window.parent.$.kc_progress(\'' . $id . '\',\'' . addslashes($title) . '\',\'' . $num . '/' . $count . ' ' . $str . ' - ' . $percent . '%\',' . round($prop * 500) . ');$(\'body\').prepend(\'' . addslashes($body) . '\')</script>'; usleep((int) ($king->config('proptime') * $timediff * 1000000)); list($_msec, $_sec) = explode(' ', microtime()); $GLOBALS['KC_PROGRESS_TIME'] = $_sec + $_msec; //重新设置时间 } $GLOBALS['KC_LAST_PROGRESS_RUNTIME'] = $thistime; //设置当前时间 return $s . NL; }
/** 生成页面 对页面进行判断并分割页面 */ function king_iframe_create() { global $king; echo '<html><head><script type="text/javascript" charset="UTF-8" src="../system/js/jquery.js"></script><style type="text/css">p{font-size:12px;padding:0px;margin:0px;line-height:14px;width:450px;white-space:nowrap;}</style><meta http-equiv="Content-Type" content="text/html; charset=' . PAGE_CHARSET . '" /></head><body></body></html>'; /* 生成方式分类 page 只生成页面 NULL 列表及页面 list 只生成列表 not 只生成未生成内容 all 全部 传递继续项目的时候URL参数 action=iframe list=列表页的ID listid 当前正在生成中的列表id pid 如果是正在生成列表页的时候,则带pid参数 kid pagid pid 列表生成完成,正在生成中的kid,pagid 分页id,pid 每页20条数据的时候所属的段 */ $max_execution_time = ini_get('max_execution_time'); //安全的执行时间 if ($max_execution_time >= 20) { $safetime = $max_execution_time - 10; //10秒的余地是比较保险的时间 } else { $safetime = round($max_execution_time / 3, 4); } $create = $_GET['create']; $Listid = isset($_GET['listid']) ? $_GET['listid'] : ''; //url中获得的listid,和下面的listid不要混淆 if ($create == 'all') { $lists = $king->portal->getListids(); } else { $list = kc_get('list', 3, 1); $lists = explode(',', $list); } sort($lists, SORT_NUMERIC); //对listid值进行排序 if ($Listid) { $lists_key = array_search($Listid, $lists); //返回lists数组和listid对应的键值 $lists = array_slice($lists, $lists_key); //删除小于$Listid的值 } $lists_count = count($lists); foreach ($lists as $listid) { $info = $king->portal->infoList($listid); //生成列表 if (!(isset($_GET['kid']) && $Listid == $listid) && ($Listid == $listid && isset($_GET['pid']) || $Listid != $listid) && ($info['nlist'] == 0 && $info['klistpath']) && ($info['modelid'] > 0 || (int) $info['modelid'] === 0) && in_array($create, array('', 'list', 'all'))) { $pid = $listid == $Listid && isset($_GET['pid']) ? $_GET['pid'] : 1; // kc_error('<pre>'.print_r($info,1)); $pcount = $info['modelid'] > 0 ? $info['pcount'] : 0; if ((int) $pcount === 0) { //没有分页的情况,可能是空的列表首页或者单页 list($msecSta, $secSta) = explode(' ', microtime()); //计算 开始生成用时 $king->portal->createList($listid); list($msecEnd, $secEnd) = explode(' ', microtime()); //计算 结束生成用时 $timeDiff = kc_formattime($msecEnd + $secEnd - $msecSta - $secSta); //生成用时 $timeSleep = kc_formattime(($msecEnd + $secEnd - $msecSta - $secSta) * $king->config('proptime')); //休眠时间 echo kc_progress('progress', $king->lang->get('portal/progress/create/list') . ' (' . $king->lang->get('portal/progress/remainder') . ':' . ($lists_count - 1) . ')', 1, 1, "<p>" . $king->lang->get('portal/progress/success') . " [{$info['klistname']}|{$listid}] [1/1] " . $king->lang->get('portal/progress/when') . ":{$timeDiff} " . $king->lang->get('portal/progress/sleep') . ":{$timeSleep}</p>"); king_inc_location($safetime, "manage.content.php?action=iframe&CMD=create&create=" . ($create == 'all' ? 'all' : $create . "&list=" . kc_get('list', 3, 1)) . "&listid={$listid}"); flush(); } else { for ($i = $pid; $i <= $pcount; $i++) { list($msecSta, $secSta) = explode(' ', microtime()); //计算 开始生成用时 $king->portal->createList($listid, $i); list($msecEnd, $secEnd) = explode(' ', microtime()); //计算 结束生成用时 $timeDiff = kc_formattime($msecEnd + $secEnd - $msecSta - $secSta); //生成用时 $timeSleep = kc_formattime(($msecEnd + $secEnd - $msecSta - $secSta) * $king->config('proptime')); //休眠时间 echo kc_progress('progress', $king->lang->get('portal/progress/create/list') . ' (' . $king->lang->get('portal/progress/remainder') . ':' . ($lists_count - 1) . ')', $i, $pcount, "<p>" . $king->lang->get('portal/progress/success') . " [{$info['klistname']}|{$listid}] [{$i}/{$pcount}] " . $king->lang->get('portal/progress/when') . ":{$timeDiff} " . $king->lang->get('portal/progress/sleep') . ":{$timeSleep}</p>"); /* listid 生成中的listid pid 生成到pid页 */ king_inc_location($safetime, "manage.content.php?action=iframe&CMD=create&create=" . ($create == 'all' ? 'all' : $create . "&list=" . kc_get('list', 3, 1)) . "&listid={$listid}&pid=" . ($pcount > $i ? $i + 1 : '')); flush(); } } } //生成页面 if ($info['npage'] == 0 && in_array($create, array('', 'page', 'all', 'not')) && ($Listid == $listid && isset($_GET['kid']) || $Listid != $listid)) { $model = $king->portal->infoModel($info['modelid']); $kid = $listid == $Listid && $_GET['kid'] ? $_GET['kid'] : 1; $sql = $create == 'not' ? 'kid,kpath,ktitle' : 'kid,ktitle'; $pid = ceil($info['ncount'] / 20); //每次读取20条数据,否则读取太多会出现无法打开的情况,特别是数据库和php服务器分开的情况下 $pid_start = isset($_GET['pid']) ? $_GET['pid'] : 1; $k = 1 + ($pid_start - 1) * 20; for ($j = $pid_start; $j <= $pid; $j++) { //分页 if ($res = $king->db->getRows("select {$sql} from %s__{$model['modeltable']} where listid={$listid} and kid1=0 and nshow=1 order by kid desc", 1, $j, 20)) { foreach ($res as $rs) { if (isset($_GET['kid'])) { if ($_GET['kid'] < $rs['kid'] || $_GET['pagid'] == 'next' && $_GET['kid'] == $rs['kid']) { //如果pagid $k++; continue; } } $id = $king->portal->infoID($listid, $rs['kid']); //生成分页面 if ($info['npagenumber'] == 1) { //每页显示数为1的时候 $subkids = explode(',', $id['subkid'] ? $rs['kid'] . ',' . $id['subkid'] : $rs['kid']); //生成次页 $pagid = $rs['kid'] == isset($_GET['kid']) && isset($_GET['pagid']) ? $_GET['pagid'] : 1; $pcount = count($subkids); for ($i = $pagid; $i <= $pcount; $i++) { list($msecSta, $secSta) = explode(' ', microtime()); //计算 开始生成用时 if ($create == 'not') { //生成未生成内容 if ($i == 1) { //第一个为主题页 $filepath = $id['kfilepath']; } else { $id1 = $king->portal->infoID($listid, $subkids[$i - 1]); $filepath = $id1['kfilepath']; } if (is_file(ROOT . $filepath)) { //如果文件存在,则跳出这次循环 echo kc_progress('progress', $king->lang->get('portal/progress/create/page') . ' (' . $king->lang->get('portal/progress/remainder') . ':' . ($lists_count - 1) . ')', $k, $info['ncount'], "<p>" . $king->lang->get('portal/progress/success') . " ID:" . $rs['kid'] . '(' . $i . "/" . $pcount . ") " . $king->lang->get('portal/progress/exist') . ": " . htmlspecialchars($rs['ktitle']) . "</p>"); flush(); king_inc_location($safetime, "manage.content.php?action=iframe&CMD=create&create=" . ($create == 'all' ? 'all' : $create . "&list=" . kc_get('list', 3, 1)) . "&listid={$listid}&pid={$j}&kid=" . ($pcount > $i ? $rs['kid'] . "&pagid=" . ($i + 1) : $rs['kid'] . "&pagid=next")); continue; } } $king->portal->createPage($listid, $subkids[$i - 1]); list($msecEnd, $secEnd) = explode(' ', microtime()); //计算 结束生成用时 $timeDiff = kc_formattime($msecEnd + $secEnd - $msecSta - $secSta); //生成用时 $timeSleep = kc_formattime(($msecEnd + $secEnd - $msecSta - $secSta) * $king->config('proptime')); //休眠时间 echo kc_progress('progress', $king->lang->get('portal/progress/create/page') . ' (' . $king->lang->get('portal/progress/remainder') . ':' . ($lists_count - 1) . ')', $k, $info['ncount'], "<p>" . $king->lang->get('portal/progress/success') . " ID:" . $rs['kid'] . '(' . $i . "/" . $pcount . ") " . $king->lang->get('portal/progress/when') . ":{$timeDiff} " . $king->lang->get('portal/progress/sleep') . ":{$timeSleep} " . htmlspecialchars($rs['ktitle']) . "</p>"); flush(); king_inc_location($safetime, "manage.content.php?action=iframe&CMD=create&create=" . ($create == 'all' ? 'all' : $create . "&list=" . kc_get('list', 3, 1)) . "&listid={$listid}&pid={$j}&kid=" . ($pcount > $i ? $rs['kid'] . "&pagid=" . ($i + 1) : $rs['kid'] . "&pagid=next")); } } else { //当文件分页每页显示数不为1的时候 $pcount = ceil($id['ncount'] / $info['npagenumber']); for ($i = 1; $i <= $pcount; $i++) { if ($create == 'not') { //生成未生成内容 $filepath = $king->portal->pathPage($info, $rs['kid'], $rs['kpath'], 1, 1); if (is_file(ROOT . $filepath)) { //如果文件存在,则跳出这次循环 echo kc_progress('progress', $king->lang->get('portal/progress/create/page') . ' (' . $king->lang->get('portal/progress/remainder') . ':' . ($lists_count - 1) . ')', $k, $info['ncount'], "<p>" . $king->lang->get('portal/progress/success') . " ID:" . $rs['kid'] . '(' . $i . "/" . $pcount . ") " . $king->lang->get('portal/progress/exist') . ": " . htmlspecialchars($rs['ktitle']) . "</p>"); flush(); king_inc_location($safetime, "manage.content.php?action=iframe&CMD=create&create=" . ($create == 'all' ? 'all' : $create . "&list=" . kc_get('list', 3, 1)) . "&listid={$listid}&pid={$j}&kid=" . ($pcount > $i ? $rs['kid'] . "&pagid=" . ($i + 1) : $rs['kid'] . "&pagid=next")); continue; } } list($msecSta, $secSta) = explode(' ', microtime()); //计算 开始生成用时 $king->portal->createPage($listid, $rs['kid'], $i); list($msecEnd, $secEnd) = explode(' ', microtime()); //计算 结束生成用时 $timeDiff = kc_formattime($msecEnd + $secEnd - $msecSta - $secSta); //生成用时 $timeSleep = kc_formattime(($msecEnd + $secEnd - $msecSta - $secSta) * $king->config('proptime')); //休眠时间 echo kc_progress('progress', $king->lang->get('portal/progress/create/page') . ' (' . $king->lang->get('portal/progress/remainder') . ':' . ($lists_count - 1) . ')', $k, $info['ncount'], "<p>" . $king->lang->get('portal/progress/success') . " ID:" . $rs['kid'] . '(' . $i . "/" . $pcount . ") " . $king->lang->get('portal/progress/when') . ":{$timeDiff} " . $king->lang->get('portal/progress/sleep') . ":{$timeSleep} " . htmlspecialchars($rs['ktitle']) . "</p>"); flush(); /* listid 当前生成中的listid pid 生成到第pid页,这个pid分页和list里的pid不同,每次读取20条内容数据 kid 当前生成中的页面id,是否生成列表的区别在于这个kid,若没有kid值,则是生成列表 */ king_inc_location($safetime, "manage.content.php?action=iframe&CMD=create&create=" . ($create == 'all' ? 'all' : $create . "&list=" . kc_get('list', 3, 1)) . "&listid={$listid}&pid={$j}&kid=" . ($pcount > $i ? $rs['kid'] . "&pagid=" . ($i + 1) : $rs['kid'] . "&pagid=next")); } } $k++; } } } } $lists_count--; } list($_msec, $_sec) = explode(' ', microtime()); $thistime = $_sec + $_msec; $diffstart = $thistime - $_GET['time']; //开始时间差 $str = $king->lang->get('system/progress/alltime') . ': ' . kc_formattime($diffstart); echo '<script>window.parent.$.kc_progress(\'progress\',\'' . $king->lang->get('system/progress/ok') . '\',\'' . $str . '\',500)</script>'; }
/** 读取文件缓存信息 @param string $path 路径 @return string */ public function info($path) { global $king; $s = '<table class="k_cache"><tr><td class="l">' . kc_icon('n1') . ' ' . $king->lang->get('system/time/cache') . ': '; $filename = ROOT . PATH_CACHE . '/' . $path . $this->ext; $filemtime = is_file($filename) ? filemtime($filename) : 0; $s .= kc_formatdate($filemtime); $s .= ' -> (' . kc_formattime(time() - $filemtime); $s .= ')</td><td class="c w100"><a class="k_ajax" rel="{URL:\'../system/manage.php\',CMD:\'close_cachetip\'}">'; $s .= $king->lang->get('system/time/cacheclose'); $s .= '</a></td></tr></table>'; return $s; }