我试图实现一个网站的主题,以便某些网页有一个不同的外观(和功能)与其他网页。
我有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变量,并检查它是否是我们的主题之一(比如“福特”)。如果它是一个常规页面,它将绑定所有制造商的车辆范围到视图,如果它是一个福特页面,它将只绑定福特范围到页面。视图编写器的伪代码如下:
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,所以两个视图都会在幕后呈现。所以上面的视图编写器逻辑是无用的,因为它在“福特”页面上运行了两次,一次是针对master.blade,另一次是针对ford.blade。
我通过检查使用Laravel DebugBar运行的查询来证明这一点。
$masterTemplate以便在所有视图(和部分视图)中使用,以检查视图中的逻辑是“福特”还是“通用”页面?我是在@section和@overwrite的ford.blade中这样做的,但这似乎并不适用于所有地方。@include和master.blade组成的部分视图,因为ford.blade扩展了master.blade,因此视图编写器被执行了两次。发布于 2015-10-24 17:52:14
乍一看,@overwrite可能会按照您的要求来做(除了@stop已经足够了,请参阅如何扩展布局)。
作为解决办法:如果您有一个包含通用内容的meta-master-template,并由ford和master (即通用)模板进行扩展,那么重新设计如何,取决于您需要哪个部分?(然后您可以将master重命名为general,将meta-master重命名为master)
这将跳过您的问题,因为在每个实例中只定义一个。
https://stackoverflow.com/questions/33321176
复制相似问题