laravel框架學習之路(二)pjax的使用

kaihongChan發表於2019-02-16

繼第一篇文章釋出之後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 = [

...

SpatiePjaxMiddlewareFilterIfPjax::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`);
                        }
                    }
                }
            });
        });
    });
});

相關文章