Laravel: как отображать только один раздел шаблона? - программирование
Подтвердить что ты не робот

Laravel: как отображать только один раздел шаблона?

Я пытаюсь использовать pjax на моем сайте, а это означает, что для полного запроса страницы я обрабатываю весь шаблон (это нормальное поведение), но в pjax-запросах я хотел бы отобразить только один раздел. Мои шаблоны расширяют шаблон шаблона.

Как я могу изящно сделать это?

4b9b3361

Ответ 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

Просто простой базовый шаблон для начала. В вашем контроллере, если вы вернете 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.

Ответ 2

Почему бы вам просто не заменить фактический контент на отображаемой странице с помощью элемента div или html?

Я делаю это все время с помощью jQuery. Я просто создаю свою первую страницу и отправляю контент в свои представления, которые отображают разделы в моем макете.

Скажем, у меня была левая навигационная колонка, а затем статья в правом столбце. Пользователь нажимает кнопку, чтобы отобразить следующую статью, так что я хочу заменить.

Сначала создайте исходный вид с вашего контроллера.

public function index()
{  
  $article = Article::first();
  Return View::make('homepage', compact('article'));
}

Теперь на домашней странице

@extends('layouts.master')

@section('leftNavigation')
     @include('homepageLeftNavigation')
@stop

@section('article')
   <div id="articleContent">
     @include('article') <!-- see below, you'll update this include with the js below -->
   </div>
@stop

@section('script')
@parent
{{-- <script> --}}
//in JQuery I would do something like this
$('a.nextArticle').click(function(){
   var next = $('.nextArticle').attr("id");
   var next = next + 1;
   $('#articleContent').load({{ URL::to('articles/' + next ) }};
});
@stop

Предполагая, что вы используете находчивый контроллер, вы можете использовать функцию show(), но если вам просто нужен тизер на домашней странице, вы также можете легко создать новую функцию для этого.

В вашем show() или newFunctionWhateverYouCallIt() вы можете просто получить статью по id

Article::find($id);

Затем отправьте это на представление, которое будет отображаться.

return View::make('article');

И, наконец, просмотр статьи, который вы назвали, включал в себя, когда вы впервые создали страницу, и снова после обновления через Jquery или pjax

     {{ $article->title }}
     {{ $article->body  }}
     {{ $article->date }}
     <a href="#" class="nextArticle" id="{{ $article->id }}">Next Article ></a>

Обратите внимание: я не тестировал этот код, поэтому я уверен, что есть несколько ошибок, но вы получаете общее представление о логике обновления одного раздела своей страницы.

Ответ 3

Мой лучший ответ прямо сейчас будет состоять в том, чтобы указать, что он должен расширять только основной шаблон (макет), если запрос не вызывается через AJAX:

@if(!Request::ajax())
    @extends('master.template')
@endif

Обратите внимание, однако, что это решение может быть не лучшим для ваших конкретных шаблонов (я могу только догадываться об этом). Вам нужно убедиться, что каждый шаблон/просмотр содержит только те вещи, которые не повторяются, например, боковые панели и т.д. Например, если у вас есть область содержимого, которая должна быть обновлена ​​с помощью pjax, тогда ваше представление должно содержать только то, что следует изменить.

Ответ 4

Внутри действия вашего контроллера явно возвращайте частичный вид, который вы хотите отобразить:

public function action_someajax()
{
    ...
    return View::make('mypartial', $data);
}

Это приведет к частичному, а не к расположению контроллера.

Ответ 5

Пожалуйста, кто-нибудь скажет мне, как я могу отобразить $view->renderSections() в части @yield('content') используя ajax. Здесь нет ajax-части, как отобразить страницу просмотра на странице main.blade.php. Спасибо.