继第一篇文章发布之后laravel框架学习之路(一)前后台用户认证分离,忙着项目上的事情,一直没有时间写文章。进入到新公司后,忙里偷闲,继续我的laravel框架学习之路。如需参考代码请移步kaihongChan@github.com(ps:项目还在逐步完善中,还有许多不足,如遇bug,请在评论区告知笔者)
关于什么是pjax,请读者自行百度。
准备工作:
1、下载jquery.pjax.js文件点击下载
2、下载NProgress
3、将所需文件放入项目中,并在布局文件中引用。(框架public目录下)
开始:
这里笔者使用的是adminLTE后台模板,具体使用可参考在Laravel5.* 中使用 AdminLTE
安装pjax的composer包(laravel中间件):
$ composer require spatie/laravel-pjax
在kernel.php文件中加入代码:
// app/Http/Kernel.php
...
protected $middleware = [
...
\Spatie\Pjax\Middleware\FilterIfPjax::class,
];
配置pjax完成页面交互:(ps:笔者整站使用pjax加载页面,故在全局js文件中配置pjax,读者可根据需要另行配置)
$.pjax.defaults.timeout = 5000;
$.pjax.defaults.maxCacheLength = 0;
//配置可点击的<a>标签使用pjax
$(document).pjax('a:not(a[target="_blank"])', {
container: '#pjax-container'//配置pjax刷新容器
});
NProgress.configure({parent: '#pjax-container'});
//超时执行函数
$(document).on('pjax:timeout', function (event) {
event.preventDefault();
});
至此,laravel结合pjax已完成。
附件:
笔者的布局(layout.blade.php):
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<title>AdminLTE</title>
<!-- Tell the browser to be responsive to screen width -->
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<link rel="stylesheet" href="{{ asset('AdminLTE/bower_components/bootstrap/dist/css/bootstrap.min.css')}}">
<!-- Font Awesome -->
<link rel="stylesheet" href="{{ asset('AdminLTE/bower_components/font-awesome/css/font-awesome.min.css') }}">
<!-- Ionicons -->
<link rel="stylesheet" href="{{ asset('AdminLTE/bower_components/Ionicons/css/ionicons.min.css') }}">
<!-- select2 -->
<link rel="stylesheet" href="{{ asset('AdminLTE/bower_components/select2/dist/css/select2.min.css') }}">
<!-- DataTables -->
<link rel="stylesheet" href="{{ asset('AdminLTE/bower_components/datatables.net-bs/css/dataTables.bootstrap.min.css') }}">
<link rel="stylesheet" href="{{ asset('js_expand/dataTables.buttons/buttons.dataTables.min.css') }}">
<!-- Theme style -->
<link rel="stylesheet" href="{{ asset('AdminLTE/dist/css/AdminLTE.min.css') }}">
<!-- AdminLTE Skins -->
<link rel="stylesheet" href="{{ asset('AdminLTE/dist/css/skins/skin-blue.min.css') }}">
<!-- nprogress -->
<link rel="stylesheet" href="{{ asset('js_expand/nprogress/nprogress.css') }}">
<!-- toastr -->
<link rel="stylesheet" href="{{ asset('js_expand/toastr/build/toastr.min.css') }}">
<!-- sweetalert -->
<link rel="stylesheet" href="{{ asset('js_expand/sweetalert/dist/sweetalert.css') }}">
<!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
<![endif]-->
<!-- Google Font -->
<link rel="stylesheet"
href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,600,700,300italic,400italic,600italic">
<!-- REQUIRED JS SCRIPTS -->
<!-- jQuery 3 -->
<script src="{{ asset('AdminLTE/bower_components/jquery/dist/jquery.min.js') }}"></script>
<!-- jQuery 2 -->
<script src="{{ asset('js_expand/jQuery/jQuery-2.1.4.min.js') }}"></script>
<!-- Bootstrap 3.3.7 -->
<script src="{{ asset('AdminLTE/bower_components/bootstrap/dist/js/bootstrap.min.js') }}"></script>
<!-- Select2 -->
<script src="{{ asset('AdminLTE/bower_components/select2/dist/js/select2.full.min.js') }}"></script>
<!-- AdminLTE App -->
<script src="{{ asset('AdminLTE/dist/js/adminlte.min.js') }}"></script>
<!-- dataTables -->
<script src="{{ asset('AdminLTE/bower_components/datatables.net/js/jquery.dataTables.min.js') }}"></script>
<script src="{{ asset('AdminLTE/bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js') }}"></script>
<script src="{{ asset('js_expand/dataTables.lan.js') }}"></script>
<script src="{{ asset('js_expand/dataTables.buttons/dataTables.buttons.min.js') }}"></script>
<script src="{{ asset('vendor/datatables/buttons.server-side.js') }}"></script>
</head>
<body class="hold-transition skin-blue sidebar-mini">
<div class="wrapper">
<!-- Main Header -->
@include('admin::partials.header')
<!-- Left side column. contains the logo and sidebar -->
@include('admin::partials.sidebar')
<!-- Content Wrapper. Contains page content -->
<div class="content-wrapper">
<!-- Main content -->
<section class="content container-fluid" id="pjax-container">
@yield('content')
</section>
<!-- /.content -->
</div>
<!-- /.content-wrapper -->
<!-- Control Sidebar -->
@include('admin::partials.control')
<!-- /.control-sidebar -->
<!-- Main Footer -->
@include('admin::partials.footer')
</div>
<!-- ./wrapper -->
<script>
var csrf_token = '{{ csrf_token() }}';
</script>
<!-- nprogress -->
<script src="{{ asset('js_expand/nprogress/nprogress.js') }}"></script>
<!-- pjax -->
<script src="{{ asset('js_expand/jquery-pjax/jquery.pjax.js') }}"></script>
<!-- toastr -->
<script src="{{ asset('js_expand/toastr/build/toastr.min.js') }}"></script>
<!-- sweetalert -->
<script src="{{ asset('js_expand/sweetalert/dist/sweetalert.min.js') }}"></script>
<!-- admin.base -->
<script src="{{ asset('js_expand/laravel-admin/admin.base.js') }}"></script>
<!-- custom script-->
<script>
var selectedMenu = "{!! $requestUri !!}";
</script>
</body>
</html>
全局js文件(admin-base.js):
toastr.options = {
closeButton: true,
progressBar: true,
showMethod: 'slideDown',
positionClass: 'toast-top-right',
timeOut: 4000
};
$.pjax.defaults.timeout = 5000;
$.pjax.defaults.maxCacheLength = 0;
$(document).pjax('a:not(a[target="_blank"])', {
container: '#pjax-container'
});
NProgress.configure({parent: '#pjax-container'});
$(document).on('pjax:timeout', function (event) {
event.preventDefault();
});
$(document).on('submit', 'form[pjax-container]', function (event) {
$.pjax.submit(event, '#pjax-container')
});
$(document).on("pjax:popstate", function () {
$(document).one("pjax:end", function (event) {
$(event.target).find("script[data-exec-on-popstate]").each(function () {
$.globalEval(this.text || this.textContent || this.innerHTML || '');
});
});
});
$(document).on('pjax:send', function (xhr) {
if (xhr.relatedTarget && xhr.relatedTarget.tagName && xhr.relatedTarget.tagName.toLowerCase() === 'form') {
$submit_btn = $('form[pjax-container] :submit');
if ($submit_btn) {
$submit_btn.button('loading')
}
}
NProgress.start();
});
$(document).on('pjax:complete', function (xhr) {
if (xhr.relatedTarget && xhr.relatedTarget.tagName && xhr.relatedTarget.tagName.toLowerCase() === 'form') {
$submit_btn = $('form[pjax-container] :submit');
if ($submit_btn) {
$submit_btn.button('reset')
}
}
NProgress.done();
});
$(function () {
$('.sidebar-menu li:not(.treeview) > a').on('click', function () {
var $parent = $(this).parent().addClass('active');
$parent.siblings('.treeview.active').find('> a').trigger('click');
$parent.siblings().removeClass('active').find('li').removeClass('active');
});
$('[data-toggle="popover"]').popover();
//整页刷新时,菜单显示
var selector = $('.sidebar-menu').find('a[href="/'+ selectedMenu +'"]');
selector.parent().addClass('active');
selector.parents('ul.treeview-menu').css('display', 'block');
selector.parents('li.treeview').addClass('menu-open');
//datatables删除按钮
$('#pjax-container').on('click', '.row-delete', function () {
var del_url = $(this).data('url');
swal({
title: "确定删除此项?",
type: "warning",
showCancelButton: true,
confirmButtonColor: "#DD6B55",
confirmButtonText: "确 定",
closeOnConfirm: false,
cancelButtonText: "取 消"
}, function(){
$.ajax({
method: 'post',
url: del_url,
data: {
_method:'delete',
_token:csrf_token,
},
success: function (data) {
if (typeof data === 'object') {
if (data.status) {
swal(data.message, '', 'success');
$.pjax.reload('#pjax-container');
} else {
swal(data.message, '', 'error');
}
}
}
});
});
});
});