2013-02-26 7 views
14

Ich versuche pjax auf meiner Website zu verwenden, was bedeutet, dass ich für eine vollständige Seitenanforderung die gesamte Vorlage rendere (das ist normales Verhalten), aber auf Pjax-Anfragen möchte ich nur einen Abschnitt rendern. Meine Vorlagen erweitern alle eine Vorlage.Laravel: Wie man nur einen Abschnitt einer Vorlage rendert?

Wie kann ich das am elegantesten tun?

Antwort

3

Meine beste Antwort jetzt wäre Ihrer Ansicht nach behaupten, dass es nur das Master-Template erweitern müssen (Layout), wenn die Anforderung nicht über AJAX aufgerufen wird:

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

Beachten Sie jedoch, dass diese Lösung ist möglicherweise nicht für Ihre spezifischen Vorlagen am besten (ich kann nur vermuten, dass). Sie müssen sicherstellen, dass jede Vorlage/Ansicht nur Dinge enthält, die sich nicht wiederholen, wie Seitenleisten usw. Wenn Sie beispielsweise einen Inhaltsbereich haben, der mit pjax aktualisiert werden muss, sollte Ihre Ansicht nur was enthalten sollte geändert werden.

+0

Es ist nicht perfekt, aber es ist ziemlich nah. Wenn das funktioniert (habe es noch nicht versucht) und niemand kommt mit einer besseren Lösung, werde ich diese Antwort akzeptieren. –

0

Innen Aktion Ihrer Steuerung, explizit die Teilansicht zurückkehren Sie machen wollten:

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

Diese Einstellung die teilweisen machen würde statt dem Controllers Layout.

+0

Wie würde das funktionieren? Das ist (fast) so, wie ich es jetzt benutze: 'return View :: make ('page', $ data);' und diese Seite dann '@exends ('master')'. –

+0

@duality_ Sie müssten Ihre Vorlage in Ihrem Controller angeben, nicht in jeder Ihrer Ansichten, damit dies funktioniert. – Michelle

+0

Nein gehen. Welches Design eine Vorlage ausdehnt, ist Designsache, nicht Code/Controller-Angelegenheit. Daher sollte diese Entscheidung in der Sicht getroffen werden. –

9

Warum ersetzen Sie nicht einfach den tatsächlichen Inhalt der gerenderten Seite mit einem div- oder html-Element?

Ich mache dies die ganze Zeit mit jQuery. Ich baue einfach meine erste Seite und sende Inhalt an meine Ansichten, die Abschnitte in meinem Hauptlayout rendern.

Nehmen wir an, ich hatte eine linke Navigationsspalte und dann einen Artikel in der rechten Spalte. Der Benutzer klickt auf eine Schaltfläche, um den nächsten Artikel anzuzeigen. Das möchte ich also ersetzen.

Zunächst bauen die erste Ansicht von Ihrem Controller

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

Jetzt in Ihrem Homepage-Ansicht

@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 

Angenommen, Sie sind ein einfalls Controller verwenden Sie Ihre Show() Funktion verwenden können, aber wenn Du wolltest nur einen Teaser auf der Homepage, du könntest auch dafür eine neue Funktion erstellen.

In Ihrer Show() oder newFunctionWhateverYouCallIt() können Sie einfach den Artikel von

id erhalten
Article::find($id); 

dass dann auf eine Ansicht abzuschicken gerendert werden.

return View::make('article'); 

Und schließlich der Artikelansicht Sie die gerufene enthalten, wenn Sie zuerst die Seite gebaut und wieder nach über Jquery Aktualisierung oder pjax

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

Bitte beachten Sie, ich diesen Code nicht so getestet habe ich bin Sicher, es gibt ein paar Fehler, aber Sie erhalten die allgemeine Idee der Logik für die Aktualisierung eines einzelnen Abschnitts Ihrer Seite.

30

Dies ist eine Art alte Frage, aber ich würde gerne eine andere Lösung werfen.

Nehmen wir Ihnen einen Blick Layout main.blade.php und eine andere Ansicht genannt haben, die page.blade.php

main.blade.php Haupt genannt erstreckt

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

Nur eine einfache grundlegende Vorlage, um Dinge begonnen. Wenn Sie in Ihrem Controller eine View::make('page') zurückgeben, erhalten Sie den vollständigen HTML-Code, aber Laravel bietet eine Möglichkeit, bestimmte Abschnitte zurückzugeben. Hier ist ein Beispiel dafür, wie die Inhalte, die Sie anzeigen möchten, basierend auf, wenn seine ein Ajax-Aufruf oder nicht aus Ihrem Controller:

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

Nun, wenn Sie eine Ajax machen Rufen Sie die Seite auf, es gibt nur den Inhaltsabschnitt und nicht den gesamten HTML-Code zurück.

+0

+1 für 'renderSections()' – Inigo

+0

Dies sollte die akzeptierte Antwort sein, IMO. – Inigo

+0

@Inigo Ich habe mir nur einen zweiten Blick darauf genommen und festgestellt, dass die Art, wie ich sie vorher hatte, ein bisschen schlampig war. So bearbeitet der Anfrageteil. – JoeMoe1984