I'am new to Laravel I just want to know the difference between #extends and #include
#extends('tempalate')
can I use #include to add template file in my laravel project.
#include('tempalate')
To simply put it:
Using #include('') function you are including or adding an existing file.
Using #extends('') your are sending a portion of your file to the extended file.
Which is usually wrapped inside a #section('') function.
As per Laravel Documentation:
Blade's #include directive allows you to include a Blade view from
within another view. All variables that are available to the parent
view will be made available to the included view:
<div>
#include('shared.errors')
<form>
<!-- Form Contents -->
</form>
</div>
When defining a child view, use the Blade #extends directive to
specify which layout the child view should "inherit". Views which
extend a Blade layout may inject content into the layout's sections
using #section directives. Remember, as seen in the example above, the
contents of these sections will be displayed in the layout using
#yield:
<!-- Stored in resources/views/child.blade.php -->
#extends('layouts.app')
#section('title', 'Page Title')
#section('sidebar')
#parent
<p>This is appended to the master sidebar.</p>
#endsection
#section('content')
<p>This is my body content.</p>
#endsection
Laravel -> Blade Templates -> Including Subviews
I have a little problem with Laravel Blade in Laravel version 5.2. Can someone tell me how to include a Blade template within a Blade template? I already try to include welcome.blade.php
by #include('welcome') but, I always get an error message.
first you need to define a master page or main template what ever you say.
we create main.blade.php as template page .
<html>
<div class="row">
#yield("content")
</div>
the above code is our simple template page.
inside your welcome.blade.php write as below
#extends("main")
#section("content")
your code
#stop
if welcome.blade.php is your template or master page do like below.
welcome.blade.php :
<html>
<div class="row">
#yield("content")
</div>
inside your other page you want use welcome page as template do as below :
#extends("welcome")
#section("content")
your code
#stop
I was hoping someone could help me with my understanding when using the #sectoin and #yield commands inside a themosis 1.2 scout template.
Basically I have a view "/views/my-page.scout.php" with some basic html markup:
#include('includes.header')
<div> some content </div>
#yield('extra-content')
#include('includes.footer')
enter code here
Then inside of another file located in "views/extras/extra-content.scout.php" I have the following:
#section('extra-content')
<div>Some extra content</div>
#stop
Im not sure why my #yield is not working, I know I could just use #include but I wanted to get a better understanding of using #yield. Ive checked out the laravel and themosis documentation but im still confused.
Any help would be most appreciated. :)
File location: /views/extras/extra-content.scout.php
File name: extra-content.scout.php
File Contents:
#section('extra-content')
<div>Some extra content</div>
#stop
File location: /views/my-page.scout.php
File name: my-page.scout.php
File Contents:
#include('includes.header')
<div> some content </div>
#yield('extra-content')
#include('includes.footer')
File : my-page.scout.php
#include('includes.header')
#include('extras.extra-content')
<div> some content </div>
#yield('extra-content')
{{-- or include here #include('extras.extra-content') --}}
{{-- or include here #include('extras.extra-content') --}}
#include('includes.footer')
the file extra-content should be included explicitily in this file or any file it's extending/including.
yield will just store the content in a variable with will be available in this file.
In your use case, including may be the best way, because your file contains only that section. imagine a extra-content file where you will output some content and handle 'extra-content` variable
section content will always be placed where you yield it.
this code
#section('my-content')
i want to place to place this content somewhere
#stop
will be interpreted as:
$sections['my-content'] = 'i want to place to place this content somewhere';
and
yield('my-content');
is intepreted as
echo isset($sections['my-content']) ? $section['my-content']:'';
Edit imagine your file extra-content where you define the section doesn't contains only the section definition:
File: extra-content
#section('my-content')
this is yielded content displayed where you use yield('my-content')
#stop
<p> this will be displayed where the file is included</p>
I have a sample view:
File: hello.blade.php
//includes the basic html enclosed tags
<p>Hello world<p>
#yield('content')
File: tester.blade.php
#extends('hello')
#section('content')
<p>this is a test<p>
#yield('contents')
#endsection
File: content.blade.php
#extends('tester.blade.php')
#section('contents')
<p>any code will do<p>
#endsection
now my problem is whenever it only renders
Hello world
this is a test
is there any workaround this? or blade engine does not support nested yields? anyhelp will be greatly appreciated
I have not tested but you could try change content.blade.php to
#extends('tester')
and make sure you use
return view('content');
However #include inside #section works. or using #parent in content.blade.php
#extends('tester')
#section('content')
#parent
<p>any code will do</p>
#endsection
#parent will cause Blade to append parent view content with current view rather than overwrite whole section.
I've tested it but doesn't do what we expect.
But there is one solution that I still use when I'm facing to such situation. I use #parent blade directive like this
File: hello.blade.php
{{-- includes the basic html enclosed tags --}}
<p>Hello world<p>
#yield('content')
File: tester.blade.php
#extends('hello')
#section('content')
<p>this is a test<p>
#yield('contents')
#endsection
File: content.blade.php
#extends('tester.blade.php')
#section('contents')
#parent
<p>any code will do<p>
#endsection
I tried to use the laravel's template system: blade but seems like not working when using the code below in the file users.blade.php:
#extends('layout')
#section('content')
Users! #stop
and browser,
#extends('layout')
That should work if you have a template file at /app/views/layout.blade.php that contains
<p>Some content here</p>
#yield('content')
<p>Some additional content here</p>
Then in your /app/views/user.blade.php, the content
#extends('layout')
#section('content')
<p>This is the user content</p>
#stop
If you call return View::make('user') you should have the compiled content
<p>Some content here</p>
<p>This is the user content</p>
<p>Some additional content here</p>
I hope that helps clarify things for you. If not, can you provide your template file locations and the relevant content?
Just remove the extra space or anything before #extends('yourlayoutfile').
It should be the first thing to be rendered in the file.
I was facing the same problem and tried many things.Suddenly I found a single space at the starting of the file before #extends.
Removed the space and is working fine.
Thanks.
Format:
#extends('layouts.default')
#section('content')
.....
#stop
---Edit----
If this didnt work then try :
Copy all the content in the file and then delete the file.
Create a new file and save it as filename.blade.php
Only after saving the file paste the content into the page.
Save the changes and run it.
This works.
Thank you.
Where is your layout?
If its in app/views/layouts, then it should be
#extends('layouts.index')
(assuming the name is index.blade.php)
ex: #extends('layouts.foo') equals a file in app/views/layouts/ called either foo.blade.php or foo.php. (depending if you use blade)
I have the same problem. What is did is:
1. in routes.php
Route::get('about', 'AboutController#index');
that
AboutController is a controller file AboutController.php in app/controllers
index is a function inside that controller.
2.Create AboutController.php in app/controllers
class class AboutController extends BaseController {
protected $layout = 'layouts.default';
$this->layout->content = View::make('pages.about');
}
You can look at this reference: Defining A Layout On A Controller
By default,Laravel has a layouts folder inside views folder, i.e. app/views/layouts and in this folder you keep your layout files, i.e. app/views/layouts/index.master.php and if you have something similar then you should use something like this:
#extends('layouts.master')
#section('content')
<p>Page Content</p>
#stop
This will inherit/use the master.blade.php file (as layout) from layouts folder, here, layouts.master means layouts/master.blade.php.
In your master.blade.php file you mast have this
#yield('content')
So, data/content from the view between #section('content') and #stop will be dumped in the place of #yield('content') of your layout.
You can use any name for your layout file, if it's layouts/main.blade.php then you should use
#extends('layouts.main')
Make sure you inserted the css link in App.blade.php
For me By default there is no link to the css file
Insert the following link in app.blade.php
<link rel="stylesheet" href= "/css/app.css" >
now its works fine :)
list things to make sure
file name and path properly given
double-check .blade.php file extention
layouts.admin.blade.php
<section class="content" style="padding-top: 20px">
#yield('content')
</section>
#extends('layouts.admin')
#section('content')
<p> this is Order index view</p>
#endsection
Try this!
php artisan cache:clear
php artisan view:clear
php artisan route:clear
php artisan clear-compiled
let's say you have 'master.blade.php' and 'index.blade.php'.
and both of files are in views->home directory. when you want to use #extends in 'index.blade.php' by calling 'master.blad.php' , you should write in index.blade.php file this statment:
#extends('home.master')
not
#extends('master')
Simply save your source using encoding UTF-8 without signature.