Laravel 5从视图中要求CSS文件的正确方法

时间:2017-03-01 11:57:52

标签: laravel laravel-5 blade

我有特定的Form组件,声明为

Form::component('fcRadio', 'components.form.fcradio', ['name', 'options', 'selected' => null]);

并用作

{{ Form::fcRadio('name', $options }}

我想要的是以某种方式附加自定义CSS文件,因此如果页面至少触发此组件一次,则所需的CSS文件将包含在我的文档的<head>中。

例如,在Joomla中它就像

$this->document->addStylesheet('my_awesome_style.css');

Laravel有没有办法实现同样的目标?

UPD:

我已经将答案扩展到下面,让它从多个模板中添加多个样式。最后,它看起来像这样:

@section('styles')
@parent
{{HTML::style('css/fcradio.css')}}
@stop

它工作正常,但如果我每页使用两次组件,样式也会增加两次。如何允许多个但唯一的条目?

3 个答案:

答案 0 :(得分:1)

所以我想我明白你在说什么。

在您的刀片布局文件中,在头部内创建一个部分:

<head>
    @yield('componentcss')
</head>

在组件中执行:

@section('componentcss')
{{HTML::style('css/fcradio.css')}}
@stop

你也可以只包括css,但我不建议这样做:

@section('componentcss')
<style>
    .exampleclass {text-align:center;}
</style>
@stop

希望我能正确理解你。

答案 1 :(得分:1)

所以这通常是我处理它的方式:

在您的文件夹中:resources/views我创建了一个名为layout的文件夹。此文件夹处理我所有页面的模板。

然后我创建了一个名为default.blade.php的文件。在其中我放了大量的HTML代码。以下是default.blade.php看起来如何(显然是瘦身)

的示例
    <!DOCTYPE html>
    <html lang="en">
    <head>
      <meta charset="utf-8">
      <meta http-equiv="x-ua-compatible" content="ie=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">

      <title>
      @yield('title')
      </title>

      <link rel="stylesheet" href="{{ asset('css/main.css') }}">

      <!-- Additional per-page css -->
      @yield('css')
    </head>

    <body>

      @yield('content')

      <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
      <script src="js/script.js"></script>
      <script src="{{ asset('js/bootstrap.min.js') }}"></script>

      <!-- Include per-page JS -->
      @yield('js')
    </body>

    </html>

是的,基本上我们目前所拥有的是@yield()asset()助手。

@yield()是Laravel使用的特殊刀片语法,“好的。只要继承此主模板的刀片视图调用此@yield()中指定的部分,我就会在此处显示该内容

asset()是一个漂亮的小助手,它基本上将你的URL结构附加到你传递它的字符串上。因此,如果您的网址为http://MyGreatSite.com并且您使用asset('js/script.js'),那么它会吐出一个完全合格的网址,该网址可以在网站的任何位置使用(http://MyGreatSite.com/js/script.js)。 asset()非常棒,因为您可以在刀片模板中使用它,这些模板将作为电子邮件发送出去,并且所有文件都可以在电子邮件收件箱中使用,因为它们是绝对链接。

右。所以现在我们有了这个主模板,我们需要使用它。所以我要做的是在resources/views目录中创建另一个视图。让我们说我们正在做一个联系页面。我会contact.blade.php。现在我想继承我们创建的主模板。所以我们这样做:

    @extends('layout.default)

    @section('css')
    <link rel="stylesheet" href="{{ asset('css/contact.css') }}">
    @stop


    @section('title')

    Contact Us

    @stop


    @section('content')

    <h1>Contact us</h1>

    <p>
    Contact us via email: <a href="mailto:contact@mygreatsite.com">contact@mygreatsite.com</a>
    </p>

    @stop


    @section('js')

    <script src="{{ asset('js/contact-form.js') }}"></script>

    @stop

好的,首先是第一件事。在最顶层,我们告诉这个刀片文件,我们想要使用我们刚刚制作的模板。我们使用刀片助手@extends()并将路径传递给我们相对于以句点分隔的views目录的视图。

接下来,我们要创建与模板对应的部分。我们通过打开@section()部分并传递我们要将此内容块推送到的部分的名称来实现。我们编写内容,然后使用@stop关闭该部分。很简单。对于images,css或js,我们只需再次使用asset()助手。

我知道这有点啰嗦,但希望这有助于并更好地解释这个过程。

tl; dr:使用@yield()@section()asset()

答案 2 :(得分:0)

我终于找到了一个棘手但有效的解决方案:

@hasSection('fcRadioStyle')
@else

@section('fcRadioStyle')
{{Html::style('css/components/fcradio.css')}}
@stop

@section('styles')
@yield('fcRadioStyle')
@append

@endif

这使得Form::fcRadio仅将此样式添加一次