サイトで pjax を使用しようとしています。つまり、ページ全体のリクエストではテンプレート全体をレンダリングしますが (これは通常の動作です)、pjax リクエストでは 1 つのセクションだけをレンダリングしたいと考えています。私のテンプレートはすべてマスター テンプレートを拡張します。
どうすれば最もエレガントにそれを行うことができますか?
これは一種の古い質問ですが、別の解決策を捨てたいと思います。
main.blade.phpというビュー レイアウトと、page.blade.phpというメインを拡張する別のビューがあるとします。
main.blade.php
<!DOCTYPE html>
<html lang="en-GB">
<head>
<title>My Title</title>
@section('head')
<link rel="stylesheet" href="{{ URL::asset('css/style.css') }}">
@show
</head>
<body>
@yield('content')
@section('footer')
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<script type="text/javascript" src="{{ URL::asset('js/main.js') }}"></script>
@show
</body>
</html>
page.blade.php
@extends('main')
@section('content')
<div class="container">
This is a rendered page
</div>
@stop
作業を開始するための単純な基本テンプレートです。コントローラーで a を返すView::make('page')
と完全な HTML が得られますが、Laravel は特定のセクションを返す方法を提供します。コントローラー内からの ajax 呼び出しかどうかに基づいて、必要なコンテンツを表示する方法の例を次に示します。
my_controller.php
function get_index() {
$view = View::make('page');
if(Request::ajax()) {
$sections = $view->renderSections(); // returns an associative array of 'content', 'head' and 'footer'
return $sections['content']; // this will only return whats in the content section
}
// just a regular request so return the whole view
return $view;
}
ページに対して ajax 呼び出しを行うと、HTML 全体ではなく、コンテンツ セクションのみが返されます。
私の現時点での最良の答えは、リクエストがAJAX経由で呼び出されていない場合にのみマスターテンプレート(レイアウト)を拡張する必要があることをあなたの見解で述べることです。
@if(!Request::ajax())
@extends('master.template')
@endif
ただし、この解決策は特定のテンプレートには最適ではない可能性があることに注意してください (私はそれを推測することしかできません)。各テンプレート/ビューには、サイドバーなど、繰り返されないもののみが含まれていることを確認する必要があります。たとえば、pjax で更新する必要があるコンテンツ領域がある場合、ビューには何でも含める必要があります。変更する必要があります。
コントローラのアクション内で、レンダリングする部分ビューを明示的に返します。
public function action_someajax()
{
...
return View::make('mypartial', $data);
}
これにより、コントローラーのレイアウトではなく部分的なレイアウトがレンダリングされます。