首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Laravel5.1中将数据绑定到特定的叶片模板(在嵌套模板上两次调用view )

在Laravel5.1中将数据绑定到特定的叶片模板(在嵌套模板上两次调用view )
EN

Stack Overflow用户
提问于 2015-10-24 17:29:40
回答 1查看 924关注 0票数 2

我试图实现一个网站的主题,以便某些网页有一个不同的外观(和功能)与其他网页。

我有master.blade.php,它包含完整的HTML结构,并有@section@yield来获取内容:

代码语言:javascript
复制
<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,并覆盖了一些内容:

代码语言:javascript
复制
@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变量,并检查它是否是我们的主题之一(比如“福特”)。如果它是一个常规页面,它将绑定所有制造商的车辆范围到视图,如果它是一个福特页面,它将只绑定福特范围到页面。视图编写器的伪代码如下:

代码语言:javascript
复制
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运行的查询来证明这一点。

  1. 如何绑定变量$masterTemplate以便在所有视图(和部分视图)中使用,以检查视图中的逻辑是“福特”还是“通用”页面?我是在@section@overwrite的ford.blade中这样做的,但这似乎并不适用于所有地方。
  2. 如何使用视图编写器将数据绑定到由@include和master.blade组成的部分视图,因为ford.blade扩展了master.blade,因此视图编写器被执行了两次。
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-24 17:52:14

乍一看,@overwrite可能会按照您的要求来做(除了@stop已经足够了,请参阅如何扩展布局)。

作为解决办法:如果您有一个包含通用内容的meta-master-template,并由fordmaster (即通用)模板进行扩展,那么重新设计如何,取决于您需要哪个部分?(然后您可以将master重命名为general,将meta-master重命名为master)

这将跳过您的问题,因为在每个实例中只定义一个。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33321176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档