web-dev-qa-db-fra.com

Comment puis-je retourner une vue d'un AJAX appeler Laravel 5?

J'essaie d'obtenir une table HTML pour revenir sur un appel ajax. 

route: 

Route::post('job/userjobs', 'JobController@userjobs');  

ajax sur la page d'appel: 

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 }}");

manette: 

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) );

        }
    }   
}

vue: 

@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

Je ne reçois rien dans les données json.html. rien. Si dans le contrôleur je dis: 

return response()->json( array('success' => true, 'html'=>'<span>html here</html>') );

Cela fonctionne très bien. 

Comment puis-je retourner une vue d'un appel ajax dans Laravel 5.

12
Chris Jackson

La fonction view() crée simplement une instance de la classe View. Pas simplement une chaîne HTML. Pour cela, vous devez appeler render():

$returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->render();
return response()->json(array('success' => true, 'html'=>$returnHTML));
30
lukasgeiter

utiliser la fonction de chaîne avant le nom du fichier de vue comme

return (String) view('Company.allUserAjax');
4
Imtiaz Pabel

si votre ajax est correct et que vous obtenez des résultats de votre base de données

 $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) );
3
Maky
$returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->renderSections()['content'];

Donc, cette question est ancienne et la réponse la plus votée ne résout pas le problème pour le demandeur et pour moi non plus. J'ai rencontré le même problème et il m'a fallu deux jours pour trouver la solution. Partout où je suis venu chercher des réponses à cette utilisation ->render(). Mais rien n'est revenu. J'ai une vue partielle que je voulais inclure. Je n'avais pas étendu ma vue partielle ou donné un nom de section. Comme cela n’est pas nécessaire lors de l’inclusion dans un fichier de lame avec la directive include.

La solution consiste donc à inclure votre code HTML dans une section et à la place de render(), utilisez renderSections()['sectionname']. Utiliser render() ne fonctionnera pas. 

J'espère que cela protégera quelqu'un du temps et de la frustration!

2
Jorn

Ne renvoyez pas votre vue au format JSON, mais renvoyez-la simplement à partir de votre contrôleur Par exemple:

$view = view("<your url>",compact('data'))->render();
return $view;

Cela fonctionnera à coup sûr.

1
Reva

Ok - J'ai constaté par essais et erreurs que vous n'incluez pas les commandes de modèle de lame dans le fichier d'affichage pour que cela fonctionne.

J'ai eu:

@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

et maintenant son travail avec:

<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>

Bien que j'ai cherché - je n'ai jamais trouvé de documentation indiquant cela.

1
Chris Jackson

idk si vous êtes toujours à la recherche d’une réponse mais que j’ai rencontré le même problème que vous, il restait vierge. la clé du succès était de supprimer la partie @section @endsection de votre vue partielle

0
Vishal Desai

supprimer cette condition et voir si cela fonctionne

if(Request::isMethod('post') && Request::ajax()) {
0
Paris Paraskeva

Cela m'a aidé:

echo view('ajaxView')->with(['value' => 'some value']);

J'ai utiliséecho view ('ajaxView') à la placereturn view ('ajaxView').

0
Nole