|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395 |
- <?php
- if (!defined('DEDEINC')) exit('dedebiz');
- /**
- * 动态分页类
- * 说明:数据量不大的数据分页,使得数据分页处理变得更加简单化
- * 使用方法:
- * $dl = new DataListCP(); //初始化动态列表类
- * $dl->pageSize = 25; //设定每页显示记录数(默认25条)
- * $dl->SetParameter($key,$value); //设定get字符串的变量
- * //这两句的顺序不能更换
- * $dl->SetTemplate($tplfile); //载入模板
- * $dl->SetSource($sql); //设定查询SQL
- * $dl->Display(); //显示
- *
- * @version $Id: datalistcp.class.php 3 17:02 2010年7月9日Z tianya $
- * @package DedeBIZ.Libraries
- * @copyright Copyright (c) 2022, DedeBIZ.COM
- * @license https://www.dedebiz.com/license
- * @link https://www.dedebiz.com
- */
- require_once(DEDEINC.'/dedetemplate.class.php');
- $codefile = (isset($needCode) ? $needCode : $cfg_soft_lang);
- $codefile = preg_replace("#[^\w-]#", '', $codefile);
- if (file_exists(DEDEINC.'/code/datalist.'.$codefile.'.inc')) {
- require_once(DEDEINC.'/code/datalist.'.$codefile.'.inc');
- } else {
- $lang_pre_page = '上页';
- $lang_next_page = '下页';
- $lang_index_page = '首页';
- $lang_end_page = '末页';
- $lang_record_number = '条记录';
- $lang_page = '页';
- $lang_total = '共';
- }
-
- /**
- * DataListCP
- *
- * @package DedeBIZ.Libraries
- */
- class DataListCP
- {
- var $dsql;
- var $tpl;
- var $pageNO;
- var $totalPage;
- var $totalResult;
- var $pageSize;
- var $getValues;
- var $sourceSql;
- var $isQuery;
- var $queryTime;
-
- /**
- * 用指定的文档ID进行初始化
- *
- * @access public
- * @param string $tplfile 模板文件
- * @return string
- */
- function __construct($tplfile = '')
- {
- if ($GLOBALS['cfg_dbtype'] == 'mysql') {
- if ($GLOBALS['cfg_mysql_type'] == 'mysqli' && function_exists("mysqli_init")) {
- $dsql = $GLOBALS['dsqli'];
- } else {
- $dsql = $GLOBALS['dsql'];
- }
- } else {
- $dsql = $GLOBALS['dsqlitete'];
- }
-
- $this->sourceSql = '';
- $this->pageSize = 25;
- $this->queryTime = 0;
- $this->getValues = array();
- $this->isQuery = false;
- $this->totalResult = 0;
- $this->totalPage = 0;
- $this->pageNO = 0;
- $this->dsql = $dsql;
- $this->SetVar('ParseEnv', 'datalist');
- $this->tpl = new DedeTemplate();
- if ($GLOBALS['cfg_tplcache'] == 'N') {
- $this->tpl->isCache = false;
- }
- if ($tplfile != '') {
- $this->tpl->LoadTemplate($tplfile);
- }
- }
-
- /**
- * 兼容PHP4版本
- *
- * @access private
- * @param string $tplfile 模板文件
- * @return void
- */
- function DataListCP($tplfile = '')
- {
- $this->__construct($tplfile);
- }
-
- //设置SQL语句
- function SetSource($sql)
- {
- $this->sourceSql = $sql;
- }
-
- //设置模板
- //如果想要使用模板中指定的pagesize,必须在调用模板后才调用 SetSource($sql)
- function SetTemplate($tplfile)
- {
- $this->tpl->LoadTemplate($tplfile);
- }
- function SetTemplet($tplfile)
- {
- $this->tpl->LoadTemplate($tplfile);
- }
-
- /**
- * 对config参数及get参数等进行预处理
- *
- * @access public
- * @return void
- */
- function PreLoad()
- {
- global $totalresult, $pageno;
- if (empty($pageno) || preg_match("#[^0-9]#", $pageno)) {
- $pageno = 1;
- }
- if (empty($totalresult) || preg_match("#[^0-9]#", $totalresult)) {
- $totalresult = 0;
- }
- $this->pageNO = $pageno;
- $this->totalResult = $totalresult;
-
- if (isset($this->tpl->tpCfgs['pagesize'])) {
- $this->pageSize = $this->tpl->tpCfgs['pagesize'];
- }
- $this->totalPage = ceil($this->totalResult / $this->pageSize);
- if ($this->totalResult == 0) {
- $countQuery = preg_replace("#SELECT[ \r\n\t](.*)[ \r\n\t]FROM#is", 'SELECT COUNT(*) AS dd FROM', $this->sourceSql);
- $countQuery = preg_replace("#ORDER[ \r\n\t]{1,}BY(.*)#is", '', $countQuery);
-
- $row = $this->dsql->GetOne($countQuery);
- if (!is_array($row)) $row['dd'] = 0;
- $this->totalResult = isset($row['dd']) ? $row['dd'] : 0;
- $this->sourceSql .= " LIMIT 0,".$this->pageSize;
- } else {
- $this->sourceSql .= " LIMIT ".(($this->pageNO - 1) * $this->pageSize).",".$this->pageSize;
- }
- }
-
- //设置网址的Get参数键值
- function SetParameter($key, $value)
- {
- $this->getValues[$key] = $value;
- }
-
- //设置/获取文档相关的各种变量
- function SetVar($k, $v)
- {
- global $_vars;
- if (!isset($_vars[$k])) {
- $_vars[$k] = $v;
- }
- }
-
- function GetVar($k)
- {
- global $_vars;
- return isset($_vars[$k]) ? $_vars[$k] : '';
- }
-
- function XSSClean($val)
- {
- if (is_array($val)) {
- foreach ($val as $key => $v) {
- $val[$key] = $this->XSSClean($v);
- }
- return $val;
- }
- return $this->RemoveXss($val);
- }
-
- function RemoveXss($val)
- {
- global $cfg_soft_lang;
- if ($cfg_soft_lang == 'gb2312') $val = gb2utf8($val);
- $val = preg_replace('/([\x00-\x08,\x0b-\x0c,\x0e-\x19])/', '', $val);
- $search = 'abcdefghijklmnopqrstuvwxyz';
- $search .= 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
- $search .= '1234567890!@#$%^&*()';
- $search .= '~`";:?+/={}[]-_|\'\\';
- for ($i = 0; $i < strlen($search); $i++) {
- $val = preg_replace('/(&#[xX]0{0,8}'.dechex(ord($search[$i])).';?)/i', $search[$i], $val); //with a ;
- $val = preg_replace('/(�{0,8}'.ord($search[$i]).';?)/', $search[$i], $val); //with a ;
- }
-
- $val = str_replace("`", "‘", $val);
- $val = str_replace("'", "‘", $val);
- $val = str_replace("\"", "“", $val);
- $val = str_replace(",", ",", $val);
- $val = str_replace("(", "(", $val);
- $val = str_replace(")", ")", $val);
-
- $ra1 = array('javascript', 'vbscript', 'expression', 'applet', 'meta', 'xml', 'blink', 'link', 'style', 'script', 'embed', 'object', 'iframe', 'frame', 'frameset', 'ilayer', 'layer', 'bgsound', 'title', 'base');
- $ra2 = array('onabort', 'onactivate', 'onafterprint', 'onafterupdate', 'onbeforeactivate', 'onbeforecopy', 'onbeforecut', 'onbeforedeactivate', 'onbeforeeditfocus', 'onbeforepaste', 'onbeforeprint', 'onbeforeunload', 'onbeforeupdate', 'onblur', 'onbounce', 'oncellchange', 'onchange', 'onclick', 'oncontextmenu', 'oncontrolselect', 'oncopy', 'oncut', 'ondataavailable', 'ondatasetchanged', 'ondatasetcomplete', 'ondblclick', 'ondeactivate', 'ondrag', 'ondragend', 'ondragenter', 'ondragleave', 'ondragover', 'ondragstart', 'ondrop', 'onerror', 'onerrorupdate', 'onfilterchange', 'onfinish', 'onfocus', 'onfocusin', 'onfocusout', 'onhelp', 'onkeydown', 'onkeypress', 'onkeyup', 'onlayoutcomplete', 'onload', 'onlosecapture', 'onmousedown', 'onmouseenter', 'onmouseleave', 'onmousemove', 'onmouseout', 'onmouseover', 'onmouseup', 'onmousewheel', 'onmove', 'onmoveend', 'onmovestart', 'onpaste', 'onpropertychange', 'onreadystatechange', 'onreset', 'onresize', 'onresizeend', 'onresizestart', 'onrowenter', 'onrowexit', 'onrowsdelete', 'onrowsinserted', 'onscroll', 'onselect', 'onselectionchange', 'onselectstart', 'onstart', 'onstop', 'onsubmit', 'onunload');
- $ra = array_merge($ra1, $ra2);
-
- $found = true;
- while ($found == true) {
- $val_before = $val;
- for ($i = 0; $i < sizeof($ra); $i++) {
- $pattern = '/';
- for ($j = 0; $j < strlen($ra[$i]); $j++) {
- if ($j > 0) {
- $pattern .= '(';
- $pattern .= '(&#[xX]0{0,8}([9ab]);)';
- $pattern .= '|';
- $pattern .= '|(�{0,8}([9|10|13]);)';
- $pattern .= ')*';
- }
- $pattern .= $ra[$i][$j];
- }
- $pattern .= '/i';
- $replacement = substr($ra[$i], 0, 2).'<x>'.substr($ra[$i], 2);
- $val = preg_replace($pattern, $replacement, $val);
- if ($val_before == $val) {
- $found = false;
- }
- }
- }
- if ($cfg_soft_lang == 'gb2312') $val = utf82gb($val);
- return $val;
- }
-
- //获取当前页数据列表
- function GetArcList($atts, $refObj = '', $fields = array())
- {
- $rsArray = array();
- $t1 = Exectime();
- if (!$this->isQuery) $this->dsql->Execute('dlist', $this->sourceSql);
- $i = 0;
- while ($arr = $this->dsql->GetArray('dlist')) {
- $i++;
- $rsArray[$i] = $this->XSSClean($arr);
- if ($i >= $this->pageSize) {
- break;
- }
- }
- $this->dsql->FreeResult('dlist');
- $this->queryTime = (Exectime() - $t1);
- return $rsArray;
- }
-
- //获取分页导航列表
- function GetPageList($atts, $refObj = '', $fields = array())
- {
- global $lang_pre_page, $lang_next_page, $lang_index_page, $lang_end_page, $lang_record_number, $lang_page, $lang_total;
- $prepage = $nextpage = $geturl = $hidenform = '';
- $purl = $this->GetCurUrl();
- $prepagenum = $this->pageNO - 1;
- $nextpagenum = $this->pageNO + 1;
- if (!isset($atts['listsize']) || preg_match("#[^0-9]#", $atts['listsize'])) {
- $atts['listsize'] = 5;
- }
- if (!isset($atts['listitem'])) {
- $atts['listitem'] = "info,index,end,pre,next,pageno";
- }
- $totalpage = ceil($this->totalResult / $this->pageSize);
-
- //echo " {$totalpage}=={$this->totalResult}=={$this->pageSize}";
- //无结果或只有一页的情况
- if ($totalpage <= 1 && $this->totalResult > 0) {
- return "<ul class='pagination justify-content-center'>\n<li class='page-item d-none d-sm-block disabled'><span class=\"page-link\">{$lang_total} 1 {$lang_page}/".$this->totalResult.$lang_record_number."</span></li></ul>";
- }
- if ($this->totalResult == 0) {
- return "<ul class='pagination justify-content-center'>\n<li class='page-item d-none d-sm-block disabled'><span class=\"page-link\">{$lang_total} 0 {$lang_page}/".$this->totalResult.$lang_record_number."</span></li></ul>";
- }
- $infos = "<li class='page-item d-none d-sm-block disabled'><span class=\"page-link\">{$lang_total} {$totalpage} {$lang_page}/{$this->totalResult}{$lang_record_number} </span></li>";
- if ($this->totalResult != 0) {
- $this->getValues['totalresult'] = $this->totalResult;
- }
- if (count($this->getValues) > 0) {
- foreach ($this->getValues as $key => $value) {
- $value = urlencode($value);
- $geturl .= "$key=$value"."&";
- $hidenform .= "<input type='hidden' name='$key' value='$value' />\n";
- }
- }
- $purl .= "?".$geturl;
-
- //获得上一页和下一页的链接
- if ($this->pageNO != 1) {
- $prepage .= "<li class='page-item'><a class='page-link' href='".$purl."pageno=$prepagenum'>$lang_pre_page</a></li> \n";
- $indexpage = "<li class='page-item'><a class='page-link' href='".$purl."pageno=1'>$lang_index_page</a></li> \n";
- } else {
- $indexpage = "<li class='page-item d-none d-sm-block disabled'><span class=\"page-link\">"."$lang_index_page \n"."</span></li>";
- }
- if ($this->pageNO != $totalpage && $totalpage > 1) {
- $nextpage .= "<li class='page-item'><a class='page-link' href='".$purl."pageno=$nextpagenum'>$lang_next_page</a></li> \n";
- $endpage = "<li class='page-item'><a class='page-link' href='".$purl."pageno=$totalpage'>$lang_end_page</a></li> \n";
- } else {
- $endpage = " <li class='page-item d-none d-sm-block disabled'><span class=\"page-link\">$lang_end_page</span></li> \n";
- }
-
- //获得数字链接
- $listdd = "";
- $total_list = $atts['listsize'] * 2 + 1;
- if ($this->pageNO >= $total_list) {
- $j = $this->pageNO - $atts['listsize'];
- $total_list = $this->pageNO + $atts['listsize'];
- if ($total_list > $totalpage) {
- $total_list = $totalpage;
- }
- } else {
- $j = 1;
- if ($total_list > $totalpage) {
- $total_list = $totalpage;
- }
- }
- for ($j; $j <= $total_list; $j++) {
- $listdd .= $j == $this->pageNO ? "<li class='page-item'><span class='page-link'>$j</span></li>\r\n" : "<li class='page-item'><a class='page-link' href='".$purl."pageno=$j'>".$j."</a></li>\n";
- }
-
- $plist = "<ul class='pagination justify-content-center'>\n";
-
- //info,index,end,pre,next,pageno,form
- if (preg_match("#info#i", $atts['listitem'])) {
- $plist .= $infos;
- }
- if (preg_match("#index#i", $atts['listitem'])) {
- $plist .= $indexpage;
- }
- if (preg_match("#pre#i", $atts['listitem'])) {
- $plist .= $prepage;
- }
- if (preg_match("#pageno#i", $atts['listitem'])) {
- $plist .= $listdd;
- }
- if (preg_match("#next#i", $atts['listitem'])) {
- $plist .= $nextpage;
- }
- if (preg_match("#end#i", $atts['listitem'])) {
- $plist .= $endpage;
- }
- if (preg_match("#form#i", $atts['listitem'])) {
- $plist .= " <form name='pagelist' action='".$this->GetCurUrl()."' style='float:left;' class='pagelistform'>$hidenform";
- if ($totalpage > $total_list) {
- $plist .= "<input type='text' name='pageno' style='padding:0px;width:30px;height:18px;font-size:11px' />\r\n";
- $plist .= "<input type='submit' name='plistgo' value='GO' style='padding:0px;width:30px;height:22px;font-size:11px' />\r\n";
- }
- $plist .= "</form>\n";
- }
- $plist .= "</ul>\n";
- return $plist;
- }
-
- //获得当前网址
- function GetCurUrl()
- {
- if (!empty($_SERVER["REQUEST_URI"])) {
- $nowurl = $_SERVER["REQUEST_URI"];
- $nowurls = explode("?", $nowurl);
- $nowurl = $nowurls[0];
- } else {
- $nowurl = $_SERVER["PHP_SELF"];
- }
- return $nowurl;
- }
-
- //关闭
- function Close()
- {
- }
-
- //显示数据
- function Display()
- {
- $this->PreLoad();
-
- //在PHP4中,对象引用必须放在display之前,放在其它位置中无效
- $this->tpl->SetObject($this);
- $this->tpl->Display();
- }
-
- //保存为HTML
- function SaveTo($filename)
- {
- $this->tpl->SaveTo($filename);
- }
- }
|