2013-03-05 11 views
5

Kann mir jemand erklären, warum ich einen leeren Bildschirm mit der gedruckten Zeichenfolge "@extends ('layouts.default') bekomme" wenn ich die Seite normal anfordere (nicht Ajax)?Laravel 4: Wenn die Anweisung im Blade-Layout seltsam funktioniert

@if(!Request::ajax()) 
    @extends('layouts.default') 
    @section('content') 
@endif 
Test 
@if(!Request::ajax()) 
    @stop 
@endif 

Ich versuche Problem mit Ajax zu lösen, ich möchte nicht, 2 Vorlagen für jeden Anforderungstyp erstellen und auch, ich will Blattvorlagen verwenden, so Controller-Layouts für mich nicht funktioniert . Wie kann ich es in Blade-Vorlage tun? Ich schaute auf diese Laravel: how to render only one section of a template?

Übrigens. Wenn ich es mit Ajax anfordere, funktioniert es wie es sollte.

Antwort

9

Ja @extends auf Linie sein muss 1.

Und ich fand Lösung für PJAX . Am Anfang war ich mir nicht sicher, ob das mein Problem lösen könnte, aber es war so. Ich weiß nicht, warum ich Angst hatte, die Blade-Funktionalität zu verlieren, wenn Sie es tatsächlich nicht so verlieren können. Wenn jemand PJAX verwendet und muss eine Vorlage verwenden, mit und ohne Layout könnte dies Ihre Lösung sein:

protected $layout = 'layouts.default'; 

public function index() 
{ 
    if(Request::header('X-PJAX')) 
    { 
    return $view = View::make('home.index') 
     ->with('title', 'index'); 
    } 
    else 
    { 
    $this->layout->title = 'index'; 
    $this->layout->content = View::make('home.index'); 
    } 
} 
+0

Bitte markieren Sie Ihre eigene Antwort als akzeptiert, damit andere sehen können, dass sie die richtige ist. –

+0

Ich kann meine eigene Antwort erst nach 21 Stunden annehmen. –

+0

Ich sehe - meine Entschuldigung. –

3

Versuchen Sie, @extends in Zeile 1 zu verschieben, und Sie werden sehen, dass die Blade-Vorlage ordnungsgemäß gerendert wird.

Um das Ajax-Problem zu lösen, denke ich, es ist besser, wenn Sie die Logik zurück auf Ihren Controller verschieben.

Beispiel:

… 
if (Request::ajax()) 
{ 
    return Response::eloquent($books); 
} else { 
    return View::make('book.index')->with('books', $books); 
} 
… 

einen Blick für weitere Informationen zu diesem Thema nehmen: http://forums.laravel.io/viewtopic.php?id=2508

+0

Das Problem Ich brauche das Layout überhaupt nicht, wenn es eine Ajax-Anfrage ist. Ich brauche eine reine HTML-Ansicht mit Daten. Irgendwie muss ich das Layout-Rendering abschalten. Ich weiß, dass ich das mit Controller-Layouts machen kann, aber ich möchte auch die Blade-Funktionalität nutzen. –

3

Sie noch Ihren Zustand kurz in der ersten Zeile wie so geben laufen

@extends((Request::ajax())?"layout1":"layout2")