#javascript #php #jquery #laravel
Вопрос:
У меня есть проблема, которую я не понимаю должным образом. Позвольте мне попытаться объяснить. Когда я вызываю маршрут, href="{{route=('name_of_route')}}"
он действительно работает. Когда я вызываю один и тот же маршрут, jQuery on sumbit
он тоже работает, но ведет себя по-другому. Некоторые фрагменты кода не выполняются, как dd();
(сейчас их нет в коде) и compact
часть return view('CV_Test.excel',compact('like_values'));
. Переменная не передается в представление. Часть базы данных и передача запроса контроллеру-все в порядке. Может кто-нибудь объяснить, почему? Вот мой код. Я попытался привести 2 примера. Надеюсь, теперь все в порядке, я задаю свой вопрос. Заранее спасибо.
Посмотреть пример 1
@extends('layouts.app')
@section('content')
<center>
<div class="col-md-12">
<h3>xlsx, xls, ods, csv to Text</h3>
<form id="xlsForm" enctype="multipart/form-data">
@csrf
<input type="file" name="excelfile" />
<input id="excelSubmit" type="submit"/>
</form>
</div>
</center>
<div class ="row">
<div class ="col-md-3">
<div class="container mt-5">
<h2 id="words" class="mb-4">Skills found</h2>
</div>
@if(isset($like_values))
<form id="xlsFormUpdate" enctype="multipart/form-data">
@csrf
@foreach($like_values as $values)
<input type="checkbox" id="skillChoice" name="skills" checked>
<label for="skillChoice">{{$values}}</label><br>
@endforeach
<input id="skillSubmit" type="submit"/>
</form>
@endif
</div>
<div class ="col-md-9">
@include('layouts.partials.datatable')
</div>
</div>
@endsection
JS относится к примеру 1
$('#xlsForm').submit(function uploadFile(event){
event.preventDefault();
$.ajax({
url: "{{route('ExcelToArray')}}",
method: "POST",
data: new FormData(this),
dataType: 'JSON',
contentType: false,
cache: false,
processData: false,
complete: function () {
load_data()
},
});
});
Просмотрите пример 2 без Jquery
extends('layouts.app')
@section('content')
<center>
<div class="col-md-12">
<h3>xlsx, xls, ods, csv to Text</h3>
<form href={{route('ExcelToArray')}} method ="post" id="xlsForm" enctype="multipart/form-data">
@csrf
<input type="file" name="excelfile" />
<input id="excelSubmit" type="submit"/>
</form>
</div>
</center>
<div class ="row">
<div class ="col-md-3">
<div class="container mt-5">
<h2 id="words" class="mb-4">Skills found</h2>
</div>
@if(isset($like_values))
<form id="xlsFormUpdate" enctype="multipart/form-data">
@csrf
@foreach($like_values as $values)
<input type="checkbox" id="skillChoice" name="skills" checked>
<label for="skillChoice">{{$values}}</label><br>
@endforeach
<input id="skillSubmit" type="submit"/>
</form>
@endif
</div>
<div class ="col-md-9">
@include('layouts.partials.datatable')
</div>
</div>
@endsection
Маршрут
Route::post('/excel', [ExcelController::class , 'ExcelToArray'])->name('ExcelToArray');
Контроллер
public function ExcelToArray (Request $excelFile) {
$excelFile->validate([
'excelfile' => 'required|mimes:xlsx,xls,csv,html,ods',
]);
$excelimport = new ExcelImport();
Excel::import($excelimport, $excelFile->file('excelfile'));
$clean_text = $excelimport->clean_text;
$like_values = $this->get_matched_words_as_array($clean_text);
DB::table('results')->truncate();
foreach ($like_values as $key => $like_value) {
$out = DB::Table('employees')->where('skills', 'like', '%' . $like_value . '%')->get();
foreach ($out as $out_value) {
$hit = $this->check_frequency($like_value,$out_value->skills);
DB::Table('results')->insert([
'skills' => $out_value->skills,
'team' => $out_value->team,
'email' => $out_value->email,
'first_name' => $out_value->first_name,
'last_name' =>$out_value->last_name,
'hit' => $hit,
'word' => $like_value,
]);
}
}
return view('CV_Test.excel',compact('like_values'));
}
Комментарии:
1. Является ли javascript в файле js или в вашем блейде? Посмотрите на источник в вашем браузере и убедитесь, что URL-адрес печатается правильно.
2. Привет @айнбер. Это в моем клинке. Как я уже сказал, это называется маршрутом. Я почти уверен, что с источником все в порядке.
3. Проверьте, какие параметры и значения на самом деле отправляются в каждом экземпляре, вы можете легко сделать это, проверив запрос в инструментах разработки браузера, на панели «Сеть».
4. Что же
load_data()
делать?5. Привет @CBroe, хорошо, я внимательно посмотрю. Спасибо за ваш совет.
Ответ №1:
Таким образом, проблема была связана с тем фактом, что вызов маршрута через jquery требует, чтобы ответ контроллера обрабатывался «успешной» частью Ajax. Контроллер должен отправить данные в формате json в представление. Чтобы отобразить html желаемым образом, мне пришлось использовать метод .prepend для управления моим html. Вот мой код на случай, если кто-то заинтересуется.
JS
$('#xlsForm').submit(function uploadFile(event){
event.preventDefault();
$.ajax({
url: "{{route('ExcelToArray')}}",
method: "POST",
data: new FormData(this),
dataType: 'JSON',
contentType: false,
cache: false,
processData: false,
success:function (response) //<<<<<<<<added part begin
{
$("#inner").empty();
$.each(response,function(index,value){
$("#inner").prepend('<input type="checkbox" id="skillChoice" name="skills" checked> <label for="skillChoice">' value '</label><br> ');
});
}, //<<<<<<<<added part end
complete:function ()
{
load_data()
},
});
контроллер
public function ExcelToArray (Request $excelFile)
{
$excelFile->validate([
'excelfile' => 'required|mimes:xlsx,xls,csv,html,ods',
]);
$excelimport = new ExcelImport();
Excel::import($excelimport, $excelFile->file('excelfile'));
$clean_text = $excelimport->clean_text; // Anforderung
$like_values = $this->get_matched_words_as_array($clean_text); // Wörter die in Anfoderngsdokument gefunden wurden.
DB::table('results')->truncate();
//dd($like_values);
foreach ($like_values as $key => $like_value) {
$out = DB::Table('employees')->where('skills', 'like', '%' . $like_value . '%')->get();
foreach ($out as $out_value)
{
$hit = $this->check_frequency($like_value,$out_value->skills);
DB::Table('results')->insert([
'skills' => $out_value->skills,
'team' => $out_value->team,
'email' => $out_value->email,
'first_name' => $out_value->first_name,
'last_name' =>$out_value->last_name,
'hit' => $hit,
'word' => $like_value,
]);
}
}
return response()->json($like_values); //<<<<<< changed part
}
лезвие
@extends('layouts.app')
@section('content')
<center>
<div class="col-md-12">
<h3>xlsx, xls, ods, csv to Text</h3>
<form id="xlsForm" enctype="multipart/form-data">
@csrf
<input type="file" name="excelfile" />
<input id="excelSubmit" type="submit"/>
</form>
</div>
</center>
<div class ="row">
<div class ="col-md-3">
<div class="container mt-5">
<h2 id="words" class="mb-4">Skills found</h2>
</div>
<form id="xlsFormUpdate" enctype="multipart/form-data">
@csrf
<div id="inner"> <!--div to manipulate-->
</div>
<input id="skillSubmit" type="submit"/>
</form>
</div>
<div class ="col-md-9">
@include('layouts.partials.datatable')
</div>
</div>
@endsection