web-dev-qa-db-ja.com

AJAX call in Laravel 5?

私は、ajax呼び出しで返すHTMLテーブルを取得しようとしています。

ルート:

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

呼び出しページのajax:

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

コントローラ:

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

        }
    }   
}

表示:

@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

Json.htmlデータに何も入っていません。何もない。コントローラで私が言う場合:

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

これはうまく機能します。

Laravel 5.のajax呼び出しからビューを返すにはどうすればよいですか。

14
Chris Jackson

view()関数は、Viewクラスのインスタンスを作成するだけです。 HTML文字列だけではありません。そのためには、render()を呼び出す必要があります。

$returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->render();
return response()->json(array('success' => true, 'html'=>$returnHTML));
37
lukasgeiter
_$returnHTML = view('job.userjobs')->with('userjobs', $userjobs)->renderSections()['content'];
_

したがって、この質問は古く、最も支持された答えは、質問者にとっても私にとっても問題を解決しませんでした。同じ問題にぶつかり、解決策を見つけるのに2日かかりました。あらゆる場所で、上記の->render()を使用する回答を探しに来ました。しかし、何も返されませんでした。含めたい部分的なビューがあります。部分ビューを拡張したり、セクション名を付けたりしていませんでした。 includeディレクティブを使用してブレードファイル内に含める場合、これは必要ないためです。

解決策は、htmlをセクション内に囲み、render()の代わりにrenderSections()['sectionname']を使用することです。 render()を使用するだけでは機能しません。

これが誰かの時間と欲求不満を安全にしてくれることを願っています!

4
Jorn

次のようにファイル名を表示する前に文字列関数を使用します

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

あなたのajaxが正しく、DBから結果を得ている場合

 $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

ビューをJSONとして返さずに、コントローラーからビューを返すだけです。例:

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

これは確実に機能します。

2
Reva

[OK]-試行錯誤して、ビューファイルにブレードテンプレートコマンドを含めないことで、これが機能することがわかりました。

私が持っていた:

@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

そして今、その動作:

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

私は検索しました-これを記載したドキュメントは見つかりませんでした。

1
Chris Jackson

あなたがまだ答えを探しているが、私はあなたと同じ問題に遭遇した場合、idkは空白を返し続けました。成功の鍵は、パーシャルビューの@section @endsection部分を削除することでした

0
Vishal Desai

このif条件を削除し、機能するかどうかを確認します

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

これらなしで動作しました:@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>

どちらか

$returnHTML = view('job.userjobs',[' userjobs'=> $userjobs])->render();// or method that you prefere to return data + RENDER is the key here

またはこれ

$returnHTML = view('job.userjobs',compact($userjobs))->render();// or method that you prefere to return data + RENDER is the key here`

両方とも働いた

0
Wahsei

これは私を助けました:

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

echoview( 'ajaxView')代わりにreturnview( 'ajaxView')

0
Nole
$view = view("job.userjobs",compact($userjobs))->render();
return response()->json(['html'=>$view]);
0
mohamed