将数据绑定到 Laravel 5.1 中的特定 blade 模板(视图编辑器在嵌套模板上被调用两次的问题)
Bind data to specific blade templates in Laravel 5.1 (Issue with view composer being called twice on nested template)
我正在尝试在站点中实施主题,以便某些页面具有与其他页面不同的外观和感觉(和功能)。
我有 master.blade.php
,它包含完整的 HTML 结构,并有 @section
和 @yield
来获取内容:
<html>
<body>
@section('master-template')
<?php
view()->share('masterTemplate', 'general');
$masterTemplate = "general";
?>
@stop
<header>
@section('nav-1')
@include('layout.navs.house-links')
@show
@section('nav-2')
@include ('layout.navs.contact-links')
@show
@section('nav-3')
@include('layout.navs.product-links')
@show
@section('nav-4')
@show
</header>
@yield('content')
</body>
</html>
然后我有 ford.blade.php
它扩展了 master,并覆盖了一些东西:
@extends('templates.master')
@section('master-template')
<?php
view()->share('masterTemplate', 'ford');
$masterTemplate = "ford";
?>
@overwrite
@section('nav-1')
@include('layout.navs.house-links')
@overwrite
@section('nav-2')
@include ('layout.navs.contact-links')
@overwrite
@section('nav-3')
@include('layout.navs.product-links')
@overwrite
然后网站上的常规页面将扩展 master.blade,任何需要福特导航栏和配色方案的内容都会扩展 ford.blade模板。
然后我将视图编辑器绑定到 layout.navs.product-links
,它从视图数据中获取 $masterTemplate
变量并检查它是否是我们的主题之一(如 "ford")。如果是普通页面,它会将所有制造商的车型系列绑定到视图,如果是福特页面,它只会将福特系列绑定到该页面。视图编辑器的 pseudo-code 如下:
public function compose(View $view)
{
// Get the view data
$viewData = $view->getData();
// Check for $masterTemplate view variable
if (isset($viewData['masterTemplate'])) {
$template = $viewData['masterTemplate'];
if ($template == "ford") {
$ranges = $this->getRangesForManufacturer($template);
}else {
$ranges = $this->getRangesForAllManufacturers();
}
$view->with('ranges', $ranges);
}
}
问题是,因为 ford.blade 扩展了 master.blade,两个视图都在幕后呈现。所以上面的视图编写器逻辑是无用的,因为它在 "ford" 页面上运行了两次,一次是 master.blade 一次是 ford.blade.
我通过使用 Laravel DebugBar 检查 运行 的查询证明了这一点。
如何绑定变量 $masterTemplate
以在所有视图(和部分视图)中使用,以检查视图内部的逻辑是 "ford" 还是 "general" 页?我在 ford.blade 中用 @section
和 @overwrite
做到了,但这似乎并不适用于所有地方。
如何使用视图编辑器将数据绑定到 @include
d by ford.blade 和 master.blade,因为 ford.blade 扩展了 master.blade 等等view composer 被执行了两次。
乍一看,@overwrite
可能会按照您的指示去做(除了 @stop
就足够了,请参阅 how to extend a layout)。
作为一种变通方法:重新设计一下,您有一个 meta-master
模板,其中包含一般内容并由 ford
和 master
扩展(即一般) 模板,具体取决于您需要哪一部分? (然后您可以将 master
重命名为 general
并将 meta-master
重命名为 master
)
那会跳过你的问题,因为在每个实例中只会定义一个。
我正在尝试在站点中实施主题,以便某些页面具有与其他页面不同的外观和感觉(和功能)。
我有 master.blade.php
,它包含完整的 HTML 结构,并有 @section
和 @yield
来获取内容:
<html>
<body>
@section('master-template')
<?php
view()->share('masterTemplate', 'general');
$masterTemplate = "general";
?>
@stop
<header>
@section('nav-1')
@include('layout.navs.house-links')
@show
@section('nav-2')
@include ('layout.navs.contact-links')
@show
@section('nav-3')
@include('layout.navs.product-links')
@show
@section('nav-4')
@show
</header>
@yield('content')
</body>
</html>
然后我有 ford.blade.php
它扩展了 master,并覆盖了一些东西:
@extends('templates.master')
@section('master-template')
<?php
view()->share('masterTemplate', 'ford');
$masterTemplate = "ford";
?>
@overwrite
@section('nav-1')
@include('layout.navs.house-links')
@overwrite
@section('nav-2')
@include ('layout.navs.contact-links')
@overwrite
@section('nav-3')
@include('layout.navs.product-links')
@overwrite
然后网站上的常规页面将扩展 master.blade,任何需要福特导航栏和配色方案的内容都会扩展 ford.blade模板。
然后我将视图编辑器绑定到 layout.navs.product-links
,它从视图数据中获取 $masterTemplate
变量并检查它是否是我们的主题之一(如 "ford")。如果是普通页面,它会将所有制造商的车型系列绑定到视图,如果是福特页面,它只会将福特系列绑定到该页面。视图编辑器的 pseudo-code 如下:
public function compose(View $view)
{
// Get the view data
$viewData = $view->getData();
// Check for $masterTemplate view variable
if (isset($viewData['masterTemplate'])) {
$template = $viewData['masterTemplate'];
if ($template == "ford") {
$ranges = $this->getRangesForManufacturer($template);
}else {
$ranges = $this->getRangesForAllManufacturers();
}
$view->with('ranges', $ranges);
}
}
问题是,因为 ford.blade 扩展了 master.blade,两个视图都在幕后呈现。所以上面的视图编写器逻辑是无用的,因为它在 "ford" 页面上运行了两次,一次是 master.blade 一次是 ford.blade.
我通过使用 Laravel DebugBar 检查 运行 的查询证明了这一点。
如何绑定变量
$masterTemplate
以在所有视图(和部分视图)中使用,以检查视图内部的逻辑是 "ford" 还是 "general" 页?我在 ford.blade 中用@section
和@overwrite
做到了,但这似乎并不适用于所有地方。如何使用视图编辑器将数据绑定到
@include
d by ford.blade 和 master.blade,因为 ford.blade 扩展了 master.blade 等等view composer 被执行了两次。
乍一看,@overwrite
可能会按照您的指示去做(除了 @stop
就足够了,请参阅 how to extend a layout)。
作为一种变通方法:重新设计一下,您有一个 meta-master
模板,其中包含一般内容并由 ford
和 master
扩展(即一般) 模板,具体取决于您需要哪一部分? (然后您可以将 master
重命名为 general
并将 meta-master
重命名为 master
)
那会跳过你的问题,因为在每个实例中只会定义一个。