yii 分页案例
总结一下yii分页的小案例和小知识
数据库设计:
CREATE TABLE IF NOT EXISTS `statistics` ( `id` int(11) NOT NULL AUTO_INCREMENT, `game_id` int(11) NOT NULL COMMENT "游戏编号", `type` smallint(1) NOT NULL COMMENT "登录或注册类型(0:登录;1:注册)", `content` varchar(500) NOT NULL COMMENT "数据内容", `tt` varchar(10) NOT NULL COMMENT "时间", PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT="统计登录或注册数据" AUTO_INCREMENT=110 ;
数据格式:
INSERT INTO `statistics` (`id`, `game_id`, `type`, `content`, `tt`) VALUES (1, 111, 1, "[{"type":2,"num":496},{"type":6,"num":8848},{"type":41,"num":3451},{"type":42,"num":46},{"type":43,"num":1733}]", "20160617");
按照tt和game_id分组查询
public function actionAdmin() //读取最近一周的记录 { $startTime = date("Ymd", strtotime("-7 days")); //开始时间 $endTime = date("Ymd", time()); //结束时间 $redisKey = "statistic_login:login_type:1:tt:weekday_7_days:startTime:".$startTime."endTime".$endTime; $info = json_decode(Yii::app()->redis->get($redisKey), true); //从缓存中读取 if (empty($info)) { //缓存中不存在数据从数据库中读取 $sql = "SELECT * FROM `statistics` WHERE `tt` > "" . $startTime . "" AND `tt` < "" . $endTime . "" AND `type`=1 GROUP BY `tt`, `game_id`"; $info = Yii::app()->db->createCommand($sql)->queryAll(); Yii::app()->redis->set($redisKey, json_encode($info)); } $newInfo = array(); $loginTypeArray = array(); if (count($info) > 0) { foreach ($info as $infokey => &$infovalue) { $newInfo[$infovalue["tt"]][] = $infovalue; //按时间分组 } } $gameInfo = StatisticsHelper::gameInfo(); $title = "近一周的注册统计"; $this->render("admin", array("info" => $newInfo, "loginType" => $loginTypeArray, "title" => $title, "gameInfo" => $gameInfo)); }分页方法和sql的写法
private function page($pageSize = 15) //分页方法 { $loginType = trim(Yii::app()->request->getParam("loginType")); $startTime = date("Ymd", strtotime(trim(Yii::app()->request->getParam("startTime")))); $endTime = date("Ymd", strtotime(trim(Yii::app()->request->getParam("endTime")))); $gameId = trim(Yii::app()->request->getParam("gameId")); $sql = $this->getSql($startTime, $endTime, $gameId, $loginType, 1); $info = Yii::app()->db->createCommand($sql)->queryAll(); $pageNum = intval($_GET["pageNum"]); $total = $info[0]["num"]; $totalPage = ceil($total / $pageSize); $startPage = $pageNum * $pageSize; $arr["total"] = $total; $arr["pageSize"] = $pageSize; $arr["totalPage"] = $totalPage; $loginTypeName = $loginType == 0 ? "登录" : "注册"; $title = "title"; $arr["title"] = $title; $query = $this->getSql($startTime, $endTime, $gameId, $loginType); $query .= " limit " . $startPage . "," . $pageSize; $results = Yii::app()->db->createCommand($query)->queryAll(); $arr["result"] = $results; return $arr; }分页数据读取
public function actionStatisticsPage() { $array = $this->page(); $result = $array["result"]; $newInfo = array(); $loginTypeArray = array(); if (count($result) > 0) { foreach ($result as $infokey => &$infovalue) { $newInfo[$infovalue["tt"]][] = $infovalue; } } $array["info"] = $newInfo; $array["loginType"] = $loginTypeArray; echo json_encode($array); }
html中的写法
<div class="portlet"> <div class="portlet-title"> <div class="caption" id="title"> <span><?php echo $title; ?> </div> </div> <div class="portlet-body"> <div class="table-responsive" id="table"> <span></span> <table class="table table-bordered table-hover"> <thead> <tr> <th>日期</th> <th>游戏名称</th> <th>总计</th> <?php foreach ($loginType as $typeKey => $typeValue) { $typeValue = empty($typeKey) ? "empty" : $typeValue; echo "<th>" . StatisticsHelper::loginOrRegType($typeValue) . "</th>"; } ?> </tr> </thead> <tbody> <?php foreach ($info as $key => $value1) { $count = count($value1); echo "<tr><td rowspan="{$count}" valign="middle" align="center">$key</td>"; foreach ($value1 as $key2 => $value) { $content = json_decode($value["content"], true); $sum = 0; foreach ($content as &$contentvalue) { $sum += $contentvalue["num"]; } echo "<td>" . $value["game_name"] . "</td><td>" . $sum . "</td>"; foreach ($loginType as $loginkey => $loginvalue) { $tmpnum = 0; foreach ($content as $childkey => $childvalue) { if ($loginvalue == $childvalue["type"]) { $tmpnum = $childvalue["num"]; } } $percent = round(($tmpnum / $sum) * 100) . "%"; echo "<td>" . $tmpnum . "(" . $percent . ")" . "</td>"; } echo "</tr>"; } } ?> </tbody> </table> </div> <div id="pageBar" style="width: auto;height:30px;"> <div id="pagecount" style="font-size:110%;width: auto;float: right;margin-right: 50px;margin-top: 8px"><span><a></a></span> </div> </div> </div> </div>
js写法
$(document).ready(function () { $("#statisticsSubmit").click(function () { var search_starttime = $.trim($("#startTime").val()); var el = jQuery(this).closest(".portlet").children(".portlet-body"); blockUI(el); doAjax(1, el); }); }); function checkEndTime() { var startTime = $("#startTime").val(); var start = new Date(startTime.replace("-", "/").replace("-", "/")); var endTime = $("#endTime").val(); var end = new Date(endTime.replace("-", "/").replace("-", "/")); if (end < start) { return false; } return true; } function getJsonLength(jsonData) { var jsonLength = 0; for (var item in jsonData) { jsonLength++; } return jsonLength; } function getPageBar() { var $pager = $("#pagecount"); $("#pagecount span").remove(); $("#pagecount a").remove(); //页码大于最大页数 if (curPage > totalPage) curPage = totalPage; //页码小于1 if (curPage < 1) curPage = 1; $pager.append("<span style="margin-right: 3px">共" + total + "条</span><span style="margin-right: 3px">" + curPage + "/" + totalPage + "</span>"); var divin = document.createElement("a"); //如果是第一页 if (curPage == 1) { $pager.append("<span style="margin-right: 5px">首页</span><span style="margin-right: 5px">上一页</span>"); } else { var first = $("<span style="margin-right: 3px"><a href="javascript:void(0)">首页</a></span>").click(function () { var el = jQuery(this).closest(".portlet").children(".portlet-body"); blockUI(el); doAjax(1, el); return false; }); $pager.append(first); var first1 = $("<span style="margin-right: 3px"><a href="javascript:void(0)">上一页</a></span>").click(function () { var el = jQuery(this).closest(".portlet").children(".portlet-body"); blockUI(el); doAjax(curPage - 1, el); return false; }); $pager.append(first1); } var viewedIndex = 6; if (totalPage < viewedIndex) { viewedIndex = totalPage; } var firstIndex = (curPage <= parseInt(viewedIndex / 2) + 1 ? 1 : ( curPage - parseInt(viewedIndex / 2) )); var lastIndex = (firstIndex + viewedIndex - 1 >= totalPage ? totalPage : firstIndex + viewedIndex - 1); if (lastIndex >= totalPage) firstIndex = lastIndex - viewedIndex + 1; for (var j = firstIndex; j < lastIndex + 1; j++) { var a = $("<a style="margin-right: 5px" rel=" + j + " href="javascript:void(0)">" + j + "</a>").click(function () { var value = $(this).attr("rel"); var el = jQuery(this).closest(".portlet").children(".portlet-body"); blockUI(el); doAjax(value, el); return false; }); $pager.append(a); } //如果是最后页 if (curPage >= totalPage) { $pager.append("<span style="margin-right: 3px">下一页</span><span>尾页</span>"); } else { var first = $("<span style="margin-right: 3px"><a href="javascript:void(0)">下一页</a></span>").click(function () { var el = jQuery(this).closest(".portlet").children(".portlet-body"); blockUI(el); doAjax(curPage + 1, el); return false; }); $pager.append(first); var first1 = $("<span style="margin-right: 3px"><a href="javascript:void(0)">尾页</a></span>").click(function () { var el = jQuery(this).closest(".portlet").children(".portlet-body"); blockUI(el); doAjax(totalPage, el); return false; }); $pager.append(first1); } } function doAjax(page, el) { var startTime = $("input[name="from"]").val(); var endTime = $("input[name="to"]").val(); var loginType1 = $("#loginType").val(); var gameId = $("#selectedGameId").val(); if (startTime == "" || endTime == "") { alert("起止时间不能为空"); return; } if (!checkEndTime()) { alert("结束时间必须晚于开始时间!"); return; } page = parseInt(page); $.ajax ({ type: "GET", dataType: "json", data: { startTime: startTime, endTime: endTime, loginType: loginType1, gameId: gameId, pageNum:page-1 }, url: "/admin/statistics/StatisticsPage", dataType: "json", error: function (XMLHttpRequest, textStatus, errorThrown) { unblockUI(el); $("#table").find("span").html("失败!" + textStatus + ";" + errorThrown); }, success: function (datas) { unblockUI(el); $("#table tbody").empty(); //var myobj=eval(datas); total = datas.total; //总记录数 pageSize = datas.pageSize; //每页显示条数 curPage = page; //当前页 totalPage = datas.totalPage; //总页数 var li = ""; var infoArray = datas.info; var loginType = datas.loginType; $("#title").find("span").html(datas.title); $("#table").find("span").html(""); if (total <= 0) { unblockUI(el); $("#table").find("table").remove(); $("#table").find("span").html("没有符合该条件的信息"); return; } if (getJsonLength(infoArray) > 0) { $("#table").find("table").remove(); var html = ""; html += "<table class="table table-bordered table-hover"><tr><th>日期</th><th>游戏名称<th>总计</th></th>"; $.each(loginType, function (typeKey, typeValue) { html += "<th>" + loginOrRegType(typeValue) + "</th>"; }); html += "</tr></thead><tbody>"; $.each(infoArray, function (infokey, infoValue) { count = infoValue.length; html += "<tr><td rowspan="" + count + "" valign="middle" align="center">" + infokey + "</td>"; $.each(infoValue, function (key, value) { var sum = 0; content = jQuery.parseJSON(value.content); $.each(content, function (key2, value2) { sum += value2["num"]; }); html += "<td>" + value.game_name + "</td><td>" + sum + "</td>"; $.each(loginType, function (loginkey, loginvalue) { var tmpnum = 0; $.each(content, function (childkey, childvalue) { if (loginvalue == childvalue.type) { tmpnum = childvalue.num; } }); var percent = (Math.round((tmpnum / sum) * 100)) + "%"; var string = tmpnum + "(" + percent + ")"; html += "<td>" + string + "</td>"; }); html += "</tr>"; }); }); html += "</tbody></table>"; $("#table").append(html); } else { $("#table").find("table").remove(); $("#table").find("span").html("没有符合该条件的信息"); } if (!datas.admin) { $(".repeat").css("display", "none"); $(".repeat_admin").css("display", "none"); } }, complete: function () { //生成分页条 if (total > 10) { getPageBar(); } else { $("#pagecount span").remove(); $("#pagecount a").remove(); } } }); } function getRootPath1() { var strFullPath = window.document.location.href; var strPath = window.document.location.pathname; var pos = strFullPath.indexOf(strPath); var prePath = strFullPath.substring(0, pos); return prePath; } function blockUI(el, centerY) { var el = jQuery(el); if (el.height() <= 400) { centerY = true; } el.block({ message: "<img src= " + getRootPath1() + "/assets/img/ajax-loading.gif" + " align="">", centerY: centerY != undefined ? centerY : true, css: { top: "10%", border: "none", padding: "2px", backgroundColor: "none" }, overlayCSS: { backgroundColor: "#000", opacity: 0.05, cursor: "wait" } }); } function unblockUI(el) { jQuery(el).unblock({ onUnblock: function () { jQuery(el).removeAttr("style"); } }); }
声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。