Laravel 4像.NET一样模板化

时间:2014-01-17 17:15:07

标签: templates laravel blade

为什么我不能将视图作为模块的一部分?

在.NET中,您拥有视图和代码。有时候我们需要做一些与这个逻辑匹配的东西,比如每个单元格内都有一个小部件的网格。通常一个小部件有一个带有标题和内容的小盒子,有一点逻辑,我怎么能把这样的部分包含到另一个这样的视图中。

@extends('jarvis.admin._layouts.default')

@section('title')
  Dashboard
@stop

@section('main')
<div class="row-fluid">
    <div class="span4">
        @yield('first')

        <div class="jarviswidget" id="widget-id-00">
            <header>
                <h2>{{ $widget['title'] }}</h2>                           
            </header>
            <div>
                <div class="jarviswidget-editbox">
                    <div>
                        <label>{{ ucfirst(Lang::get('strings.title')) }}:</label>
                        <input type="text">
                    </div>
                    <div>
                        <label>{{ ucfirst(Lang::get('strings.style')) }}</label>
                        <span data-widget-setstyle="red" class="red-btn"></span>
                        <span data-widget-setstyle="green" class="green-btn"></span>
                        <span data-widget-setstyle="purple" class="purple-btn"></span>
                        <span data-widget-setstyle="black" class="black-btn"></span>
                        <span data-widget-setstyle="darkgrey" class="darkgrey-btn"></span>
                    </div>
                </div>
                <div class="jarviswidget-timestamp"></div>
                <div class="inner-spacer"> 
                    <!-- content goes here -->
                    @yield('wg_content')

                    Content

                </div>
            </div>
        </div>

    </div>
    <div class="span4">
        @yield('second')

        <div class="jarviswidget" id="widget-id-00">
            <header>
                <h2>{{ $widget['title'] }}</h2>                           
            </header>
            <div>
                <div class="jarviswidget-editbox">
                    <div>
                        <label>{{ ucfirst(Lang::get('strings.title')) }}:</label>
                        <input type="text">
                    </div>
                    <div>
                        <label>{{ ucfirst(Lang::get('strings.style')) }}</label>
                        <span data-widget-setstyle="red" class="red-btn"></span>
                        <span data-widget-setstyle="green" class="green-btn"></span>
                        <span data-widget-setstyle="purple" class="purple-btn"></span>
                        <span data-widget-setstyle="black" class="black-btn"></span>
                        <span data-widget-setstyle="darkgrey" class="darkgrey-btn"></span>
                    </div>
                </div>
                <div class="jarviswidget-timestamp"></div>
                <div class="inner-spacer"> 
                    <!-- content goes here -->
                    @yield('wg_content')

                    Content

                </div>
            </div>
        </div>

    </div>
    <div class="span4">
        @yield('third')

        <div class="jarviswidget" id="widget-id-00">
            <header>
                <h2>{{ $widget['title'] }}</h2>                           
            </header>
            <div>
                <div class="jarviswidget-editbox">
                    <div>
                        <label>{{ ucfirst(Lang::get('strings.title')) }}:</label>
                        <input type="text">
                    </div>
                    <div>
                        <label>{{ ucfirst(Lang::get('strings.style')) }}</label>
                        <span data-widget-setstyle="red" class="red-btn"></span>
                        <span data-widget-setstyle="green" class="green-btn"></span>
                        <span data-widget-setstyle="purple" class="purple-btn"></span>
                        <span data-widget-setstyle="black" class="black-btn"></span>
                        <span data-widget-setstyle="darkgrey" class="darkgrey-btn"></span>
                    </div>
                </div>
                <div class="jarviswidget-timestamp"></div>
                <div class="inner-spacer"> 
                    <!-- content goes here -->
                    @yield('wg_content')

                    Content

                </div>
            </div>
        </div>

    </div>
</div>

<div class="row-fluid">
    <div class="span12">
    </div>
</div>
@stop

每个@yield都会加载一个小小部件来处理小逻辑或甚至另一个模板与另一个嵌套视图。

例如@yield(&#39; first&#39;)将加载一个框,这是另一个模板,其里面有一个yield,一个变量作为标题。这个嵌套的收益将有另一个收益或内容...然后我们用于该框的同一个框将再次使用另一个标题和另一个内容来渲染@yield(&#39; second&#39;)使用与第一次收益相同的。

我不了解如何使用刀片模板系统进行此级联。有没有办法做类似的事情?

我知道这很复杂,但如果你曾经使用.net,你就能理解我的意思。

谢谢,对不起我的英语。

这与HMVC模型有相似之处,但不一样。

1 个答案:

答案 0 :(得分:0)

我找到了解决方案......

这里解释起来有点复杂,但我会尽我所能。

试试这个:

默认模板(default.blade.php)

<!DOCTYPE html>
  <html lang="en">
    <head></head>

    <body>

      <div class="fluid-container">

        @yield('main')

      </div>

    </body>
  </html>

默认内容模板(mypage.blade.php)

@extends('_layouts.default')

@section('main')
    <div id="widget-grid">
        <div class="row-fluid">
            <article class="span12">
                @include('_modules.mymodule')
            </article>
        </div>
    </div>
@stop

模块模板(mymodule.blade.php)

我们将一些变量发送到共享模板小部件

@extends('admin._partials.widget', array('widget' => array('title' => 'title', 'id' => 'some_id', 'style' => 'your: style')))

@section('wg_content')
  <!-- Your widget content goes here -->
@overwrite

共享模板(widget.blade.php)

Your title $widget['title']
Your id $widget['id']
Your style $widget['style']
<!-- content -->
@yield('wg_content')

views目录树将是:

views
  _layouts
    default.blade.php
  _partials
    widget.blade.php
  _modules
    mymodule.blade.php
  page
    mypage.blade.php

现在,当您从控制器制作视图时,您应该拨打 mypage

魔术指令在模块模板的底部是 @overwrite

现在,当您调用模块时,系统将获取窗口小部件模板并包装mymodule,然后将其添加到页面中,最后将所有内容包装在默认的主模板中。

这有助于您与他人共享模板。我知道你有疑问,请问! XD