Ich versuche, eine HTML-Tabelle zu erhalten, um bei einem Ajax-Aufruf zurückzukehren.
route:
Route::post('job/userjobs', '[email protected]');
ajax auf aufrufende Seite:
function getUserJobs(userid) {
$_token = "{{ csrf_token() }}";
var userid = userid;
$.ajax({
headers: { 'X-CSRF-Token' : $('meta[name=_token]').attr('content') },
url: "{{ url('/job/userjobs') }}",
type: 'POST',
cache: false,
data: { 'userid': userid, '_token': $_token }, //see the $_token
datatype: 'html',
beforeSend: function() {
//something before send
},
success: function(data) {
console.log('success');
console.log(data);
//success
//var data = $.parseJSON(data);
if(data.success == true) {
//user_jobs div defined on page
$('#user_jobs').html(data.html);
} else {
$('#user_jobs').html(data.html + '{{ $user->username }}');
}
},
error: function(xhr,textStatus,thrownError) {
alert(xhr + "\n" + textStatus + "\n" + thrownError);
}
});
}
//on page load
getUserJobs("{{ $user->id }}");
regler:
public function userjobs() {
$input = Request::all();
if(Request::isMethod('post') && Request::ajax()) {
if($input['userid']) {
$userjobs = Userjob::select('select * from user_jobs where user_id = ?', array($input['userid']));
if(! $userjobs) {
return response()->json( array('success' => false, 'html'=>'No Jobs assigned to ') );
}
$returnHTML = view('job.userjobs')->with('userjobs', $userjobs);
return response()->json( array('success' => true, 'html'=>$returnHTML) );
}
}
}
aussicht:
@section('content')
<table class="table table-striped">
<tbody>
@foreach ($userjobs as $userjob)
<tr>
<td><strong>{{ $userjob->title }}</strong><br />
{{ $userjob->description }}
</td>
</tr>
@endforeach
</table>
@stop
Ich bekomme nichts in den json.html-Daten. nichts. Wenn ich im Controller sage:
return response()->json( array('success' => true, 'html'=>'<span>html here</html>') );
Das funktioniert gut.
Wie kann ich eine Ansicht von einem Ajax-Anruf in Laravel 5 wiedergeben?.
Die Funktion view()
erstellt lediglich eine Instanz der Klasse View
. Nicht nur ein HTML-String. Dafür sollten Sie render()
anrufen:
$returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->render();
return response()->json(array('success' => true, 'html'=>$returnHTML));
verwenden Sie die Zeichenfolgenfunktion vor dem Anzeigen des Dateinamens als
return (String) view('Company.allUserAjax');
wenn Ihr Ajax korrekt ist und Sie Ergebnisse von Ihrer Datenbank erhalten
$returnHTML = view('job.userjobs',[' userjobs'=> $userjobs])->render();// or method that you prefere to return data + RENDER is the key here
return response()->json( array('success' => true, 'html'=>$returnHTML) );
$returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->renderSections()['content'];
Diese Frage ist also alt und die am meisten beantwortete Antwort löste das Problem für den Fragesteller und für mich auch nicht. Ich hatte das gleiche Problem und brauchte zwei Tage, um die Lösung zu finden. Überall kam ich auf der Suche nach Antworten der besagten Verwendung ->render()
. Aber nichts ist zurückgekehrt. Ich habe eine Teilansicht, die ich einschließen wollte. Ich hatte meine Teilansicht nicht erweitert oder ihr einen Abschnittsnamen gegeben. Da dies nicht erforderlich ist, wenn es in einer Blade-Datei in der Include-Direktive enthalten ist.
Die Lösung lautet also: Schließen Sie Ihre HTML-Datei in einen Abschnitt ein und verwenden Sie statt render()
renderSections()['sectionname']
. Nur die Verwendung von render()
wird nicht funktionieren.
Ich hoffe, dass dies jemandem Zeit und Frustration erspart!
Geben Sie Ihre Ansicht nicht als JSON zurück, sondern geben Sie die Ansicht von Ihrem Controller zurück Beispiel:
$view = view("<your url>",compact('data'))->render();
return $view;
Das wird sicher funktionieren.
Ok - Ich habe durch Ausprobieren festgestellt, dass Sie die Blatevorlagenbefehle nicht in die Ansichtsdatei aufnehmen, damit dies funktioniert.
Ich hatte:
@section('content')
<table class="table table-striped">
<tbody>
@foreach ($userjobs as $userjob)
<tr>
<td><strong>{{ $userjob->title }}</strong><br />
{{ $userjob->description }}
</td>
</tr>
@endforeach
</table>
@stop
und jetzt arbeitet es mit:
<table class="table table-striped">
<tbody>
<?php foreach ($userjobs as $userjob){?>
<tr>
<td><strong><?php echo $userjob->title; ?></strong><br />
<?php echo $userjob->description; ?>
</td>
</tr>
<?php } ?>
</table>
Trotzdem habe ich gesucht - ich habe nie eine Dokumentation gefunden, die dies besagt.
idk Wenn Sie immer noch nach einer Antwort suchen, aber ich bin auf dasselbe Problem gestoßen wie Sie. Der Schlüssel zum Erfolg war das Entfernen des @section @endsection-Teils in Ihrer Teilansicht
entfernen Sie diese if-Bedingung und prüfen Sie, ob sie funktioniert
if(Request::isMethod('post') && Request::ajax()) {
Ich habe es ohne diese funktioniert: @section & @stop
<table class="table table-striped">
<tbody>
@foreach ($userjobs as $userjob)
<tr>
<td><strong>{{ $userjob->title }}</strong><br />
{{ $userjob->description }}
</td>
</tr>
@endforeach
</table>
entweder
$returnHTML = view('job.userjobs',[' userjobs'=> $userjobs])->render();// or method that you prefere to return data + RENDER is the key here
oder dieses
$returnHTML = view('job.userjobs',compact($userjobs))->render();// or method that you prefere to return data + RENDER is the key here`
beide arbeiteten
Das hat mir geholfen:
echo view('ajaxView')->with(['value' => 'some value']);
Ich habe echo view ('ajaxView') stattdessen return view ('ajaxView') verwendet.
$view = view("job.userjobs",compact($userjobs))->render();
return response()->json(['html'=>$view]);