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
Related
In Laravel, there are different ways of using sections:
#yield('section1') // Filled in by child view
#section('section2')
// Default content, can be overwritten by child
// Different ways of closing the section
#endsection|stop|show|append
Who can tell me what the exact difference is between all of these?
Accoding to this, #stop and #endsection might be the same. (with one having been deprecated, but not anymore)
#endsection and #stop are the same and indicate the end of a section.
The section is not actually rendered on the page until you do #yield('sectionname')
In contrast, #show is equivalent to
#stop
#yield('sectionname')
i.e. it stops and immediately renders the section at that part of the page.
#append is basically equivalent to:
//FileA.blade.php
#section('sectionname')
... content
#stop
//FileB.blade.php
#extends('fileA')
#section('sectionname')
#parent
... more content after content
#stop
Here's some relevant source code:
protected function compileStop() {
return '<?php $__env->stopSection(); ?>';
}
protected function compileEndsection() {
return '<?php $__env->stopSection(); ?>'; //Same code
}
protected function compileShow() {
return '<?php echo $__env->yieldSection(); ?>';
}
Yield section just stops the current section and yields its contents.
I might be late in the party. But in Laravel 7.x series, there is no mention of "#stop" and "#append".
Q: Difference between #endsection and #show
#endsection directive just tells the blade engine where the section actually ends. And to show that section you need to use the #yield directive. If you don't yield that section blade won't show it after rendering the view.
For example in layout view:
<!-- layout -->
<body>
#section('content')
Some Content
#endsection
</body>
The above code has no meaning, of course we have defined a section. But it won't show up in the view to the client. So we need to yield it, to make it visible on the client. So lets yield it in the same layout.
<!--layout-->
<body>
#section('content')
Some content
#endsection
#yield('content')
</body>
Now the above code has some meaning to the client, because we have defined a section and told the Blade engine to yield it in the same layout.
But Laravel provides a shortcut to that, instead of explicitly yielding that section in the same layout, use the #section - #show directive pairs. Therefore the above code can be written as follows:
<!--layout-->
<body>
#section('content')
Some content
#show
</body>
So #show is just a compacted version of #endsection and #yield directives.
I hope I made everything clear. And one more thing, in laravel 7.x to append the content in the section, #parent directive is used.
Found it in quora
#show has similar functionality like #yield but you can use it for more things. When you declare #yield in your layout view you can set default value as well.
app.blade.php
#yield('title', 'Default Title')
and in your child view you can change the title
user.blade.php
#section('title', 'Custom Title')
However, you can set only string for default value in case of #yield. If you want to use some part of html content as a default part, you should use #show
app.blade.php
#section('some_div')
<h1>Default Heading1</h1>
<p>Default Paragraph
<span>Default Span</span>
</p>
#show
in your child view
#section('some_div')
<h1>Custom Heading1</h1>
<p>Custom Paragraph
<span>Custom Span</span>
</p>
#endsection
also you can use both default content and custom content together. just include #parent
#section('some_div')
#parent
<h1>Custom Heading1</h1>
<p>Custom Paragraph
<span>Custom Span</span>
</p>
#endsection
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 two page on Laravel.
I can easily extend this layout in another blade partial to get a working modal with a header, content, and footer which I can embed using #extends('master').
My problem is:
The first page is using header1.blade.php.
And second page is using header2.blade.php.
On master.blade.php is my master page.
<body>
#include('partials.header1')
#yield('content')
#include('partials.footer')
</body>
On index.blade.php is using master.blade.php is master page with extends('master.blade.php).
On listnews.blade.php have same master page.
I want at listnews.blade.php using partials.header2.
Have any way to do this?
As an alternative to #lewis4u's answer you can use the #section directve.
This way you can define the default header to be used but you can change it whenever you need to.
Firstly, change your master.blade.php file to be:
<body>
#section('header')
#include('partials.header1')
#show
#yield('content')
#include('partials.footer')
</body>
Then in your listnews.blade.php file just add another section after the extends:
#section('header')
#include('partials.header2')
#endsection
Hope this helps!
Using laravel 5.1, could I insert a custom code into a blade view dynamically?
For example, I have this view.blade.php :
<html>
<head>
<title>App Name - #yield('title')</title>
</head>
<body>
#section('sidebar')
This is the master sidebar.
#show
<div class="container">
#yield('content')
// Here, I want to insert a code dynamically, for example :
<div> <p> something </p> </div>
</div>
</body>
So, Is there a good way to do something like this in controller :
$customCode = "<div> <p> something </p> </div>";
$content = (string) $view;
//For example I want to insert this code into view file on line 11
updateContent($content, $customCode, $line_position_in_view);
Here is your code with jQuery :
Your HTML FILE OR VIEW FILE
<div class="container">
#yield('content')
// Here, I want insert a code dynamically, for example :
<div> <p> something </p> </div>
</div>
$.post("test.php",{},function (data){
$(".container").append(data);
});
Note : if you want to use controller function then change test.php with function name with proper path.
test.php file or controller function
<?php
echo "<div> <p> something </p> </div>";
exit;
?>
For instance let's say you don't want to insert something like
{{$user->name}}
but more styled html chunk of code instead with the same string showed,
say by bootstrap 4. then you have to assign to the name a string like
$user->update(['name' => '<span class="badge badge-success">SHILPILDOQ</span>']);
AND FINALLY for the blade file you have a little change now :
{!! $user->name !!}
You are not suppose to just put html and javascript in your controller so you can dump it out into your blade view. This goes against the seperation of concerns.
You should just create a master layout and extend this master layout on other pages you create. This way you can dynamically adjust the content of the master layout page.
Naturally, you should never ever mix php functions into your blade view. Run the php functionality in your controller, put it into a variable and pass it along to your view to use.
Is it possible to include multiple view in route? What is the best practice for doing this, let say I want config file, header, content, and footer file to join and load in a view? If do it in the route, then I can easily change the content based on route request.
Thank you.
You need to take a futher look at Laravel's Blade templating. With Blade templating, you can create layouts and cascade them onto each other really nicely. For example, let's take the following routes...
app/routes.php
Route::get('about', function()
{
return View::make('about');
});
Route::get('contact', function()
{
return View::make('content')
});
As you can see, we have two different views for those two different request. However, with Blade templating, and sections, we can create a master layout and only change the content that we need. So, here is what our master layout would look like.
app/views/layouts/master.blade.php
<!DOCTYPE html>
<html>
<head>
<title>Site Title</title>
</head>
<body>
<nav>
<ul>
<li>Home</li>
<li>About</li>
<li>Contact</li>
</ul>
</nav>
#yield('content')
</body>
</html>
This is our master layout. We have our nav that will always stay the same, our HTML and head and everything that we don't want to write over and over again. But, we are also using yield in blade to accept content and place it there. This is where our actual views come into play from routes.php.
app/views/about.blade.php
#extends('layouts.master')
#section('content')
<p>This is the about me content.</p>
#endsection
We can simply extend the master layout, and place our content within the content section, which we can name anything we want. Same with the other page, contact.
app/views/contact.blade.php
#extends('layouts.master')
#section('content')
<p>This is the contact page content.</p>
#endsection
As you can see, it's not so much as including multiple views...but rather it's about extending different views and putting them together using Blade.
Alternate way to include header / footer in another view will as below.
https://laravel.com/docs/5.3/blade#including-sub-views
<div>
#include('templates.header') // views/templates/header.blade.php
<form>
<!-- Form Contents -->
</form>