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>
Related
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 want to import partial template in other partial.
For example, I'm already using header partial.
Current Structure is
-- header.blade.php
--+ partials
|__ nave.blade.php
In this case, I want to use nav partial in header partial.
But I was not available to add nav to header. I could see not found error.
Is there any special way to solve this issue?
Assuming you have a main.blade.php page.
The content is like this:
#include('layouts.header')
<section> Main Content {{$slot}} </section>
#include('layouts.footer')
In header.blade.php, here is your content:
<div class="container">
<div id="app">
#include('layouts.nav')
On your nav.blade.php page, here could be your content:
<nav id="navbar"> Nav Item </nav>
Then finally, in your footer partial, you can close the opened divs up:
</div>{{-- Closes the #app id --}}
</div> {{-- Closes the Container class --}}
<script>Your JS links and sources</script>
So, in essence, what all these suggest is that within any file, if you call the file path correctly, you can use and
embed any partial from anywhere. Note, the (dot) indentation suggests a level deep down in the files structure.
Which means, in your Views folder, this will be the structure of your subfolders:
- Views
- layouts.blade.php
- header.blade.php
- nav.blade.php
- footer.blade.php
- home.blade.php
I need to duplicate a piece of html in my blade template but it's so small that I don't want to create a new file. Can I create a section in the same file that I use it? for example:
#section('small')
<div>small piece of html</div>
#endsection
#include('small')
<div>some html here</div>
#include('small')
I think #stack and #push is what you need instead of #section
Let's say you're going to use that on other file
Page 1:
#stack('small')
Page 2 :
#push('small')
<div>small piece of html</div>
#endpush
#push('small')
<div>some html here</div>
#endpush
You need to use Component with Laravel and make your template in a example.blade.php and set your variables in the component, and send the variables to the component while calling it like:
#component('alert', ['foo' => 'bar'])
...
#endcomponent
So it's in a different file but while sending the variables to the component, it can be efficient.
Do you mean duplicate #section? if yes, so create #yield with another name, and call both sections in the same template.
Page 1:
#yield('section1')
#yield('section2')
Page 2 :
#section('section1')
<div>small piece of html</div>
#endsection
#section('section2')
<div>some html here</div>
#endsection
I have such type of code in view, add.ctp file in Cake PHP.
<div id="container">
<div id="content">
------------------
</div>
<div id="sidebar">
----------------
</div>
</div>
Now in Layout, in default.ctp file, we access this code by this line.
<?php echo $this->fetch('content'); ?>
I have sidebar in each and every view file, and if I need some changes then I will go in each and every file and then change.
Now My Question is that, can I made a file in layout like sidebar.ctp or any thing else that I just call this file in my view. If I can, then how I will made such type of file.
You could do it with include or elements like this
<?php echo $this->element('sidebar'); ?>
With the element, you make the sidebar.ctp file in the View/Elements/ folder.
Check for more information: Cakephp 2 Elements
The other way is with include (not my choice, but another way to accomplish it)
<?php include('../View/Layouts/sidebar.ctp'); ?>
You can use elements and if the content in elements is dynamic you can use the blocks supported in latest version of cakephp.
http://book.cakephp.org/2.0/en/views.html
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.