入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

yii 分页案例

创建时间:2016-06-24 投稿人: 浏览次数:180

总结一下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。