2013-10-15 85 views
3

我正在使用Laravel 4和刀片模板,並在嘗試擴展模板時遇到問題。覆蓋laravel blade模板中的部分拋出未定義的變量錯誤

在我的佈局,我有

@yield('content') 

,在我的網頁我有

@section('content') 
    Welcome {{ $name }} 
@stop 

的正常工作,我創建了另一個頁面非常相似,我的第一次,只是想改變覆蓋管理內容部分。模板中的其他部分很好。

所以我延長我的網頁,並做

@section('content') 
    Hello! 
@stop 

我得到$ name變量未定義的通知。

我試圖

@section('content') 
    Hello! 
@overwrite 

和同樣的協議,我得到的通知錯誤。 我檢查了我的控制器,它使用正確的模板。我不打電話給@parent,所以我不明白,我怎樣才能覆蓋模板中的一個部分,發現通知錯誤?

回答

8

刀片佈局在呈現任何子級之前,會沿着樹的路徑或主視圖工作。因此,擴展其他視圖的嵌套視圖必須始終在父視圖之前進行渲染。因此,包含部分的父視圖總是會在孩子之前呈現。

爲了解決您遇到的問題,只能嵌套不會覆蓋包含變量的父節的頁面,因爲父項內容將始終在孩子面前呈現。由於上述理想不能總是被遵守或父母節內容仍然是必需的,所以一種好的替代方法是使用視圖作曲家。視圖作曲家給你一個機會,當他們被渲染時,爲任何特定的視圖聲明變量。

View::composer(array('pages.admin'), function($view) 
{ 
    $view->with('name', Auth::user()->username); 
}); 

另一種選擇是使用視圖創建器。當視圖被實例化而不是渲染時,創建者被解僱。此方法允許您在視圖呈現之前覆寫變量。

View::creator(array('pages.admin'), function($view) 
{ 
    $view->with('name', Auth::user()->username); 
}); 

您可以在文檔here中瞭解關於這些方法的更多信息。 (或者here爲Laravel 5文檔)。

+0

謝謝,查看::作曲家是一個非常方便的工具。 – Heihachi

1

我不確定這是一個錯誤還是故意的,但似乎Laravel在解釋刀片指令之前呈現變量。 解決方法會是這樣:

視圖/佈局/ testlayout.blade.php:

<html> 
    <body> 
     @yield('sidebar', 'This is the master sidebar. {{ $name }}') 

     <div class="container"> 
      @yield('content') 
     </div> 
    </body> 
    </html> 

實際視圖:視圖/ test.blade.php

@extends('layouts.testlayout') 


@section('sidebar') 
    No variable in the child 
@stop 

@section('content') 
    This is a child content 
@stop 

這防止了可變$name如果在實際視圖中存在具有該名稱的部分,則顯示該圖像。如果佈局文件中的內容包含變量,則似乎是這種方法

+0

這完全是故意的。刀片佈局必須始終在孩子之前呈現父母或繼承是不可能的。 –

-3

我發現這個問題:)

變量/方法,你在父視圖中調用之前只需添加@符號的簡單的解決方案。如果出現錯誤(通知/警告),PHP將忽略該錯誤並繼續執行。

這並不完美,但將我們保存到代碼視圖/作曲家。

希望得到這個幫助!

0

我無法保證對Laravel 4的支持,但對於那些希望在Laravel 5.5中工作的解決方案(可能還有一點難度 - 難以檢查)是在@extend ing時定義所需的變量。

E.g.在這個問題的例子:

@extend('my.parent.view', ['name' => '']) 

這種做法會特別有用,如果需要的數據提供給兒童的觀點,但以不同的名稱。

E.g.如果父母視需要$parent變量,但孩子視圖只有一個$child變量,它有一個屬性引用父,你可以這樣做:

@extend('my.parent.view', ['parent' => $child->parent])