/**
 	输出代码
 	@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 &copy; <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);
     }
 }
Exemple #2
0
/**

	进度条界面

	进度条
	@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 .= ' -&gt; (' . 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;
 }