包子

木森技术分享

路漫漫其修远兮,吾将上下而求索。

您现在的位置是:网站首页 > THINKPHP

【ThinkPHP5】【tp5】通过Ajax实现分页的局部刷新

2024-04-04 10:43:26282

核心代码

服务端,Index控制器中:

public function showflower(/*Request $request*/) {
        /*
         * 参考文档中的“链式操作”
         */
        $flowers = Db::table('flower')
                    ->order(['SelledNum'=>'desc', 'price'=>'asc'])
                    //->select()
                    ->paginate(5, false, [
                        'path'=>'javascript:AjaxPage([PAGE]);']); 
 
        $pageHtml = $flowers->render();
 
        $this->assign('flowers', $flowers);
        $this->assign('pageHtml', $pageHtml);
        
        // 如果绑定了参数的,用 $this->fetch()。如果没有绑定参数,可以用return view()
        return $this->fetch(); // fetch方法在Controller中,需要extends
    }
    
    // ajax请求分页内容的方法
    public function showflowerajax(Request $request) {
        // 在url中取出当前的页码
        $page = $request->param('page');
        if (!empty($page)) {
            // 当前页显示的数据
            $flowers = Db::table('flower')
                        ->order(['SelledNum'=>'desc', 'price'=>'asc'])
                        ->paginate(5, false, [
                            'path'=>'javascript:AjaxPage([PAGE]);']); 
                        // 修改按钮的路径,点击按钮执行JS函数AjaxPage()。page(页码)由tp5赋值
            
            // 按钮组的的Html代码
            $pageHtml = $flowers->render();
            
            $data['flowers'] = $flowers;
            $data['pageHtml'] = $pageHtml;
            
            // 向前端返回Json字符串
            return json($data);
        }
    }



前端的JS代码:

        2022/6/10更新:在字符串中引用变量也可以不需要通过+拼接字符串实现。可以使用ES6中的模板字符串,Chrome也支持ES6新特性。例子如下,具体可自行百度。

var name = 'zhangsan';
var str = `我是华师软工的${name}`;
console.log(str); // '我是华师软工的zhangsan'
<script type="text/javascript">
	function AjaxPage(page) {
		$.ajax({
            url:'showflowerajax',
            type:'post',
            dataType:'json',
            data: {page:page}, // 第一个参数是url中的变量名,'page'
            success:function(data){
                //console.log(data)
                //$(".page").html(data.pageHtml);
            	refreshPage(data);
            }
        });
	}
	
	function refreshPage(res) {
		// 替换按钮组的Html代码
		$(".page").html(res['pageHtml']);
		
		var flowers = res['flowers'];
		//console.log(flowers);
		var html = "";
		//$("#content").html(html);
		// 通过打印flowers可知它是个对象,而不是数组,flowers.data才是需要显示的数据
		$.each(flowers.data, function (index, flower) {
			//console.log(flower);
			// 组织Html代码。php中字符串中的变量可以用{$}来表示,js中只能通过“+”拼接
            var str = "<table style='width:700px;border-width:1px;border-style:dotted;' align=center>"
+ "<tr>"
+ "<td rowspan=7 width=170>"
+ "<a href='flowerDetail.php?flowerID=" + flower['flowerID'] + "'><img src='__ROOT__/public/static/picture/" + flower['picturem'] + "' border=0/>"
+ "</a></td>"
+ "<td colspan=2 align=center><div style='font-weight:bold;font-size:medium;height:40px;line-height:40px;color:#000066;text-align:center;border-width:1px;  border-style:solid;border-color:red;'>" + flower['fname'] + "</div></td>"
+ "</tr><tr>"
 
+ "<td width=50><font size=2>材料:</font></td>"
+ "<td><font size=2>" + flower['cailiao'] + "</font></td>"
+ "</tr><tr>"     
+ "<td width=50><font size=2>包装:</font></td>"
+ "<td><font size=2>" + flower['baozhuang'] + "</font></td>"
+ "</tr><tr>"
+ "<td width=50><font size=2>花语:</font></td>"
+ "<td><font size=2>" + flower['huayu'] + "</font></td>"
+ "</tr><tr>"
+ "<td width=50><font size=2>说明:</font></td>"
+ "<td><font size=2>" + flower['shuoming'] + "</font></td>"
+ "</tr><tr>"
+ "<td colspan=2><div style='text-align:left;font-size: medium; color: #000066;'>"
+ "<div style='text-decoration:line-through;margin-top:8px;'>原价:¥" + flower['price'] + "</div>现价:<font size=4 color=red><b>¥" + flower['yourprice'] + "</b></font></div></td>"
+ "</tr><tr>"
+ "<td colspan=2><a href='__ROOT__/index.php/index/cart/addcart.html?flowerID=" + flower.flowerID + "'><img src='__ROOT__/public/static/image/ingwc_ico.jpg' border=0/></a></td>"
 
+ "</tr></table>";     
			
			html += str;
        });
		//$("#content").html("");
		$("#content").html(html);
		
	}
</script>