Я пытаюсь создать dataTable с настраиваемой фильтрацией с помощью yajra datatable из здесь:
Таблица HTML в поле зрения:
<form id = "search-form" class = "form-inline" method = "POST" role = "form" action = "#">
<select id = "batch" name = "batch">
<option value = "">Select</option>
<option value = "22">Skill Level CBE Dec 2018</option>
<option value = "2">Batch 2</option>
</select>
<button class = "btn btn-primary" type = "submit">Search</button>
</form>
<table class = "table table-striped table-bordered datatable" cellspacing = "0" width = "100%">
<thead>
<tr>
<th>{{ getPhrase('S/N')}}</th>
<th>{{ getPhrase('Batch')}}</th>
<th>{{ getPhrase('Course')}}</th>
<th>{{ getPhrase('Subject')}}</th>
<th>{{ getPhrase('title')}}</th>
<th>{{ getPhrase('otq_marks')}}</th>
<th>{{ getPhrase('cr_marks')}}</th>
<th>{{ getPhrase('total')}}</th>
<th>{{ getPhrase('average')}}</th>
</tr>
</thead>
</table>
@section('footer_scripts')
@include('common.datatables', array('route'=>URL_STUDENT_EXAM_GETATTEMPTS.$user->slug, 'route_as_url' => 'TRUE'))
@stop
Что касается common.datatables, то datatables.blade.php имеет:
$.ajaxSetup({
headers: {
'X-CSRF-TOKEN': $('meta[name = "csrf-token"]').attr('content')
}
});
tableObj = $('.datatable').DataTable({
processing: true,
serverSide: true,
retrieve :true,
// cache: true,
type: 'GET',
ajax: {
url: '{{ $routeValue }}',
data: function (d) {
d.batch = $('#batch').val();
}
}
});
$('#search-form').on('submit', function(e) {
tableObj.draw();
e.preventDefault();
});
Значение url-адреса ajax $ routeValue относится к константе URL_STUDENT_EXAM_GETATTEMPTS (поясняется позже), используемой в представлении каким-либо образом.
Когда я выбираю значение из раскрывающегося списка "batch" и нажимаю кнопку submit, для маршрута выполняется вызов ajax. В инструменте проверки браузера я вижу, что в URL-адрес ajax добавлено множество параметров запроса, а также наш параметр batch. Теперь мне нужно получить этот параметр batch внутри контроллера.
Теперь о коде на стороне сервера:
Константа URL_STUDENT_EXAM_GETATTEMPTS, используемая в лезвии, имеет значение PREFIX.'exams/student/get-exam-attempts/'.
А в route.php маршрут определяется как:
Route::get('exams/student/get-exam-attempts/{user_slug}/{exam_slug?}', 'StudentQuizController@getExamAttemptsData');
В контроллере у меня есть:
public function getExamAttemptsData(Request $request,$slug, $exam_slug = '')
{
//body goes here
}
Я использовал все следующие методы, чтобы получить параметр batch в контроллере, но напрасно:
$request->get('batch')
$request->query('batch')
Input::get('batch')
Как я могу получить значение batch внутри контроллера?
Обновлено: Кстати, я использую use Illuminate\Http\Request; для переменной Request $request в параметре функции контроллера.
РЕДАКТИРОВАТЬ2: Инструмент проверки браузера показывает URL-адрес запроса ajax как:
http: // localhost / lcbs / excs / student / get-exam-plays / myuser123? draw = 2 & columns% 5B0% 5D% 5Bdata% 5D = 0 ...... search% 5Bregex% 5D = false & партия = 22 & _ = 1541684388689.
Итак, вы видите, что batch присутствует в параметрах запроса.
Но внутри контроллера код $request->getQueryString() показывает только
%2Fexams%2Fstudent%2Fget-exam-attempts%2Fmyuser123
И \URL::current() показывает http: // localhost / lcbs / excs / student / get-exam-plays / myuser123
Это означает, что $request пропускает всю строку запроса.
РЕДАКТИРОВАТЬ3: @ Адриан Эрнандес-Лопес, я вставляю ПОЛНОЕ содержимое Kernel.php сюда:
namespace App\Http;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
{
/**
* The application's global HTTP middleware stack.
*
* These middleware are run during every request to your application.
*
* @var array
*/
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
];
/**
* The application's route middleware groups.
*
* @var array
*/
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\App\Http\Middleware\VerifyCsrfToken::class,
],
'api' => [
'throttle:60,1',
],
];
/**
* The application's route middleware.
*
* These middleware may be assigned to groups or used individually.
*
* @var array
*/
protected $routeMiddleware = [
'auth' => \App\Http\Middleware\Authenticate::class,
'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
'can' => \Illuminate\Foundation\Http\Middleware\Authorize::class,
'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
'role' => \Zizaco\Entrust\Middleware\EntrustRole::class,
'permission' => \Zizaco\Entrust\Middleware\EntrustPermission::class,
'ability' => \Zizaco\Entrust\Middleware\EntrustAbility::class,
// 'adminOrGuest' => \App\Http\Middleware\AdminOrGuestMiddleware::class,
];
}
@ISTI, пустой вывод






Похоже на? в Route не используется для определения необязательного параметра, а вместо этого используется строка:
Route::get('exams/student/get-exam-attempts/{user_slug}/{exam_slug?}', 'StudentQuizController@getExamAttemptsData');
Не могли бы вы изменить его и посмотреть, что у вас получится?
Route::get('exams/student/get-exam-attempts/{user_slug}/{exam_slug}', 'StudentQuizController@getExamAttemptsData');
Кроме того, в отправленной вами строке запроса есть пробел после myyser123, это также может объяснить проблему.
http:// localhost/lcbs/exams/student/get-exam-attempts/myuser123 ?draw=2&columns%5B0%5D%5Bdata%5D=0......search%5Bregex%5D=false&batch=22&_=1541684388689.
Поэтому я предлагаю проверить, как значение определяется в коде javascript.
url: '{{ $routeValue }}',
exam_slug - необязательный параметр, поэтому нельзя сделать его обязательным. Что касается пространства после myuser123, я намеренно добавил его при написании в SO, чтобы ссылка просто превратилась в текст, не являясь какой-либо реальной ссылкой, потому что ссылка указывает на localhost, а не на какой-либо онлайн-сайт.
Можете ли вы проверить, нет ли перенаправления, которое может перенаправлять? Появляются ли другие параметры получения, перетаскивания, столбцов и т. д. В объекте запроса?
если бы там было перенаправление, то таблица яджры не отображалась бы. Остальные параметры также недоступны. Но я обнаружил, что с \Request::getRequestUri(); я могу получить весь URL-адрес, кроме части «localhost». С этого момента я могу explode строку URL-адреса, используя & в качестве разделителя, и получить все параметры в массиве, и из этого массива я могу посмотреть, есть ли определенный параметр (например, `` пакет ''), и могу ли его использовать.
$request->input('batch') также возвращает пустой? А также, какой вывод вы получаете от $request->all();?
$request->input('batch') пуст, а var_dump($request->all()); дает array(1) { ["/exams/student/get-exam-attempts/myuser123"]=> string(0) "" }Это интересно. Таким образом, URI запроса полностью преобразуется в параметр запроса. Я бы предложил проверить промежуточное программное обеспечение, а также отладить значения $ _GET перед контроллером, например, чтобы проверить значения в первом промежуточном программном обеспечении, вызванном в запросе.
Как мне проверить значения в первом промежуточном программном обеспечении, вызванном в запросе?
В Kernel.php у вас может быть массив $middleware с этими промежуточными программами, вызываемыми в каждом запросе; и вы можете проверить свои файлы маршрутов, чтобы найти другие промежуточные программы, называемые. Проверьте laravel.com/docs/5.7/middleware для получения дополнительной информации
Я добавил «EDIT3», чтобы показать все содержимое Kernel.php. Есть ли там промежуточное ПО, которое перехватывает HTTP-запрос на изменение входящих параметров?
Что происходит, когда вы проверяете суперглобал $ _GET ['batch'] в вашем контроллере? Я знаю, что это не лучшее решение, но вы должны проверить это только для отладки.