我有特定的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
它工作正常,但如果我每页使用两次组件,样式也会增加两次。如何允许多个但唯一的条目?
答案 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
仅将此样式添加一次