Paginate не работает, как ожидалось, uisng laravel и jq - PullRequest
3 голосов
/ 18 января 2020

Я работаю над фильтрацией данных. Поскольку есть <input> и если кто-то начинает печатать, я вызываю функцию jq, чтобы отправить запрос моему контроллеру. Работает нормально. Даже я получаю отфильтрованные данные, а также. Но если я нажму на страницу 2, это повлияет на дизайн. Итак, после того, как я узнал, это изменило мой url.

Как пример - после фильтрации данных (это работает нормально)

code.test/?page=1

Но если вы нажмете на странице 2, он перенаправляет на

code.test/filter?page=2

Вот мой код для main.blade -

<div class="container">
        <div class="row">
            <div class="col-md-9 col-sm-12">
                <div class="form-group">
                    <input type="text" class="form-control" id="search" placeholder="Enter email" name="email">
                </div>
            </div>
            <div class="col-md-3 col-sm-12">
                <div class="form-group">
                    <select id="department">
                        <option value="0">All Departments</option>
                        @foreach($department as $d)
                        <option value="{{$d->id}}">{{$d->name}}</option>
                        @endforeach
                    </select>
                </div>
            </div>
        </div>
        <div id="filter">
            <div class="row">
                <?php
                    $count = count($data);//dd($data[0]->fname);
                ?>
                @if($count > 0)
                    @foreach($data as $d)
                        <div class="col-md-12">
                            {{$d->fname}}, {{$d->lname}}<br>
                            {{$d->profile}}<br>
                            <b>{{$d->departments->name}}</b>
                        </div>
                    @endforeach
                @else
                    No data found
                @endif
            </div>
        </div>
        {{ $data->appends($data)->links() }}
    </div>

Это моя функция jq -

function filter(){
    var str = $("#search").val();
    var dep = $('#department option:selected').val();
    // /alert(dep);
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
        }
    });
    $.ajax({
        type: "GET",
        url: '/filter',
        data: {
            str: str,
            dep: dep,
        },
        success: function(data){
            console.log(data);
            $('#filter').html(data);
        },
    });
}

$(document).ready(function(){
    $("#search").on('input', function(){
        filter();
    });
    $("#department").change(function () {
        filter();
    });
});

Сейчас в controller Я возвращаю view после фильтра -

public function filter(Request $request){
        $str    =   $request->str;
        $dep    =   $request->dep;//dd($dep);

        $s  =   new Staff;
        $d  =   new Department;

        //If input and dropdown values are available
        if($str != null && $dep != 0){
            $data = $s::with('departments')
                        ->where('department', $dep)
                        ->where(function($q) use ($str) {
                            $q->where('fname', 'like', '%'.$str.'%')
                            ->orWhere('lname', 'like', '%'.$str.'%');
                        })
                        ->paginate(10)
                        ->appends(['dep'=> $dep, 'str'=> $str]);

            $data_count = count($data);

            return view('search', compact('data', 'data_count'));

        } else if($str != null && $dep == 0){ //If input value is set and dropdown value set to all departments
            $data = $s::with('departments')
                        ->where(function($q) use ($str) {
                            $q->where('fname', 'like', '%'.$str.'%')
                            ->orWhere('lname', 'like', '%'.$str.'%');
                        })
                        ->paginate(10)
                        ->appends(['dep'=> $dep, 'str'=> $str]);

            $data_count = count($data);

            return view('search', compact('data', 'data_count'));

        } else if($str == null && $dep != 0){ //If dropdown value is not null and input is null
            $data = $s::with('departments')
                        ->where('department', $dep)
                        ->paginate(10)
                        ->appends(['dep'=> $dep, 'str'=> $str]);

            $data_count = count($data);

            return view('search', compact('data', 'data_count'));

        } else if($str == null && $dep == 0){ //If dropdown value is null and input is null
            $data = $s::with('departments')->paginate(10)->appends(['dep'=> $dep, 'str'=> $str]);

            $data_count = count($data);

            return view('filter', compact('data', 'data_count'));
        }
    }

Пожалуйста, помогите мне с этим.

Спасибо заранее.

1 Ответ

0 голосов
/ 20 января 2020

Уже поздно отвечать, но это может помочь вам -

  1. В вашем main.blade вместо прямой загрузки данных вы можете передать эти данные другим view, а затем @include, которые новый blade файл в main.blade. Вот так -
<div class="ui-block">
            <div class="ui-block-content">
                <div class="row">
                    <div class="col col-xl-9 col-lg-9 col-md-9 col-sm-12 col-12">
                        <div class="form-group">
                            <input type="text" class="form-control" id="search" placeholder="Start typing keywords.." name="search">
                        </div>
                    </div>
                    <div class="col col-xl-3 col-lg-3 col-md-3 col-sm-12 col-12">
                        <div class="form-group">
                            <select id="department" class="form-control">
                                <option value="0">All Departments</option>
                                @foreach($department as $d)
                                <option value="{{$d->id}}">{{$d->name}}</option>
                                @endforeach
                            </select>
                        </div>
                    </div>
                </div>        
            </div>
        </div>

        <div id="filter">
            @include('search')
        </div>

Создайте новый клинок в качестве примера search.blade и вставьте все, что у вас есть в <div id="filter"> /* ---- This lines ---*/ в search.blade.

В вас js функция изменения URL-адреса main.blade -

$.ajax({
        type: "GET",
        url: '/',//change this to main.blade's url
        data: {
            str: str,
            dep: dep,
        },
        success: function(data){
            console.log(data);
            $('#filter').html(data);
        },
    });
Внести изменения в controller. Просто проверьте, является ли запрос от ajax или нет, и затем обработайте эти данные.
public function main(Request $request)
    {
        $data = Staff::with('departments')->orderBy('created_at', 'DESC')->paginate(10);
        $department = Department::all();

        //If request is from ajax, then processing to filter data
        if($request->ajax()) {
            $str    =   $request->str;
            $dep    =   $request->dep;//dd($dep);

            $s  =   new Staff;
            $d  =   new Department;

            if($str != null && $dep != 0){ //If input and dropdown values are available
                $data = $s::with('departments')
                        ->where('department', $dep)
                        ->where(function($q) use ($str) {
                            $q->where('fname', 'like', '%'.$str.'%')
                            ->orWhere('lname', 'like', '%'.$str.'%')
                            ->orWhere('profile', 'like', '%'.$str.'%');
                        })
                        ->orderBy('created_at', 'DESC')
                        ->paginate(10);


            } else if($str != null && $dep == 0){ //If input value is set and dropdown value set to all departments
                $data = $s::with('departments')
                            ->where(function($q) use ($str) {
                                $q->where('fname', 'like', '%'.$str.'%')
                                ->orWhere('lname', 'like', '%'.$str.'%')
                                ->orWhere('profile', 'like', '%'.$str.'%');
                            })
                            ->orderBy('created_at', 'DESC')
                            ->paginate(10);

                $data_count = count($data);

                return view('search', compact('data', 'data_count'));

            } else if($str == null && $dep != 0){ //If dropdown value is not null and input is null
                $data = $s::with('departments')
                            ->where('department', $dep)
                            ->orderBy('created_at', 'DESC')
                            ->paginate(10);

            } else if($str == null && $dep == 0){ //If dropdown value is null and input is null
                $data = $s::with('departments')->orderBy('created_at', 'DESC')->paginate(10);
            }

            // returning data to view
            return view('search', ['data' => $data])->render();
        }

        //returning data if request is not from ajax
        return view('main', compact('data', 'department'));
    }

Надеюсь, это будет работать для вас. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...