Laravel - Blade comments , blade rendering causing page to crash - php

I'm rendering a page that is primarily a form with view::make in Laravel and it is crashing, causing ERR_CONNECTION_RESET. After a long investigation and many red herrings, I started erasing (not commenting) random sections out of the blade file for the view and realized that if I
a) erase 2 of the {{Form}} calls inside this section of the form
b) remove the {{-- and --}} from around this section of the form
{{--
<div class="form-row">
{{ Form::label('foo', 'foo:') }}
{{ Form::text('foo') }}
</div>
<div class="form-row">
{{ Form::label('foo', 'foo:') }}
{{ Form::text('foo') }}
</div>
<div class="form-row">
{{ Form::label('foo', 'foo') }}
{{ Form::text('foo') }}
</div>
--}}
the page will render. I am not sure what exactly the cause here is. There are other blocks above and below, although this is a 3-div commented out section which none of the others are.
Anyone have a clue what is causing this? Running on WAMP if that matters.

Blade comments should only be used for simple remarks or to comment out single-line Blade functions. A single Blade comment cannot be used to comment out multiple lines of code.
Use PHP Block Comments instead. They are still usable in a blade.php file
<?php /*
{{ HTML::form("foo") }};
{{ HTML::form("bar") }};
*/ ?>
Alternatively, comment out your Blade one line at a time:
{{-- HTML::form("foo") --}};
{{-- HTML::form("bar") --}};
Examples of Valid Blade Comments:
Single Blade Function:
{{-- Form::text('foo') --}}
Remark:
{{-- Form Section 1 --}}
Examples of Invalid Blade Comments:
Incorrect syntax:
{{-- Form::text('foo') -- }}
"#" Inside of Blade comment
{{-- #Form::text('foo') --}}
Nested PHP:
{{-- <?php
echo "foo";
echo "bar
?> --}}
Nested Blade:
{{--
{{ HTML::form("foo") }};
{{ HTML::form("bar") }};
--}}
Internals:
Using the sample code from the question, Laravel's Blade Compiler will generate a temporary PHP file containing the following PHP and HTML:
<?php /*
<div class="form-row">
<?php echo Form::label('foo', 'foo:'); ?>
<?php echo Form::text('foo'); ?>
</div>
<div class="form-row">
<?php echo Form::label('foo', 'foo:'); ?>
<?php echo Form::text('foo'); ?>
</div>
<div class="form-row">
<?php echo Form::label('foo', 'foo'); ?>
<?php echo Form::text('foo'); ?>
</div>
*/ ?>
The Blade code inside of the Blade comments are still parsed into PHP. The PHP end tags inside of the PHP block-comment can cause compilation issues:
?> breaks out of PHP mode and returns to HTML mode, and // or #
cannot influence that.

Comments in Blade are very simple!
{{-- Blade comments that wil not appear in the rendered HTML output --}}
You can either do normal PHP comments:
<? /* some comment here */
// or single line comments
# or these :)
?>

I have same problem with laravel 5.1 and PHP 7 (new homestead). The work around was to use this:
<?php /* XXX */?>
instead of this:
{{-- XXX -- }}.

I have a similar symptom and it seems to be related to the length of the comment alone. I tested it with a comment that doesn't contain any PHP code or blade statements at all:
{{--
0123456789abcdef
0123456789abcdef
0123456789abcdef
--}}
I kept adding copies of the repeated line until it crashed. The comment was lexically followed by a blade #if statement, and the corresponding <php if(...): ?> did not end up in the compiled template, but the closing <?php endif; ?> did, resulting in a syntactically invalid compiled template.
It seems to be a bug in the blade compiler and I will report it.
The workaround is to split long blade comments with --}}{{--.

I have Tried the
Nested PHP:
{{-- <?php
echo "foo";
echo "bar";
?> --}}
#TonyArra
While using . It is Not Commenting the Content and prevents from Compiling as HTML
and this is the htmlsource
{{-- foobar --}}
Which i have got
Thats Because If You want To Comment the php Code inside Blade
Try this
<!-- #php echo 'hai'; #endphp -->
OR
<!-- <?php echo 'hai'; ?> -->
and try to view the page source

Blade comments like this one, were the problem in my case:
{{--
#if ($test)
<div>something</div>
#else
<div>something else</div>
#endif
--}}

Simply we have to use a double curly bracket followed by a double hyphen.
This will work for the single line as well multiple lines.
{{-- --}}

Blade Comments
{{-- This comment will not be present in the rendered HTML --}}
Referene: https://laravel-news.com/laravel-blade-comments

Related

Configurable partial

I have a component in my templating engine (that works well so far) that kind of needs to take an argument.
The component is a navigation on a website. In the CMS there can be many navigations (main, footer, side) but I can't get the logic for Mustache right.
My template `top.mustache':
<div id="wrap-top">
<div id="top">
{{> #navigation }}
{{ main }}
{{> /navigation }}
</div>
</div>
And then navigation.mustache is just:
<div class="nav">
{{ #navigation }}
</div>
In PHP I'm rendering it as follows:
$mustache->render("top", [
"navigation" => [
"main" => "HTML HERE"
]
];
The thing is that I don't want to create multiple tags like navigation_main or navigation_footer because the code is the same. The links may be different but that's handled in PHP where HTML is being generated.
The key is to not have to create mustache files for the names of the navigations. How do I put this all together? Just for the purpose of the question, let's say I do this:
{{ #navigation }}
{{ main }}
{{ /navigation }}
<-- some other html -->
{{ #navigation }}
{{ footer }}
{{ /navigation }}
And the result would be:
<div class="nav"><-- links from main here --></div>
<-- some other html -->
<div class="nav"><-- links from footer here --></div>
The reason is that the names of navigations can vary. In PHP I can prepare the array with all available options but how to use only one partial template?

laravel markdown email render hrml in inbox

Recently I upgrade Laravel to 6.13.0. Before the upgrade, my markdown email template was good in design. After upgrade, I am trying to send Laravel Mail in markdown format. But when I test it with MailDev it is rendering HTML format.
My email template looks like.
#component('mail::message')
#component('mail::panel')
<div class="row">
<div class="col-6 bg-gray">
<span>Time</span>
</div>
<div class="col-6 bg-gray">
<span class="badge">{{ date('jS F g:ia', strtotime($signal->signal_time)) }}</span>
</div>
</div>
#endcomponent
#endcomponent
then its look like this in MailDev..
What can I do now?
I get the solution for this issue. recently Laravel has moved CommonMark as their markdown template. it doesn't convert space. what's why my email template is shown as HTML markup. Now, what has to do to fix it.
I removed all space from my email template files like this.
#component('mail::message')
#component('mail::panel')
<div class="row">
<div class="col-6 bg-gray">
<span>Time</span>
</div>
<div class="col-6 bg-gray">
<span class="badge">{{ date('jS F g:ia', strtotime($signal->signal_time)) }}</span>
</div>
</div>
#endcomponent
#endcomponent
and that fixed my issue. I think someone gets help from this answer.
Markdown considers indented stuff to be code blocks. So, we just have to de-indent everything.
Example:
#component('mail::message')
<h3>Hi {{ $name }}</h3>
<h2>You are invited to join as a member. Here is your login credentials:</h2>
<br>
<table>
<tr>
<td>Email</td>
<td>{{ $email }}</td>
</tr>
<tr>
<td>Password</td>
<td>{{ $password }}</td>
</tr>
</table>
#component('mail::button', ['url' => $url])
<span>Login Here</span>
#endcomponent
<h4>Thanks,</h4>
#endcomponent
I got the same issue and in my case, i have fixed it with writing all stuff with a # in one line, so as an example:
File: resources/views/vendor/notifications/email.blade.php
Before (not working, showing linkduration in mail):
#lang('mail.welcome.linkduration',
['linkduration' => $linkduration]
)
After (working)
#lang('mail.welcome.linkduration', ['linkduration' => $linkduration])
I hope, this will help
The default panel component strips HTML.
If you want to override the default mail:: component namespace you have to publish the vendor files.
php artisan vendor:publish --tag=laravel-mail
Then if you look in resources/views/vendor/mail/markdown/ you will see the comonents which you can edit.
panel.blade.php is just {{ $slot }}, change to {!! $slot !!} to allow unfiltered html.
Also, as a side note, if you are using Markdown, you probably don't want to be using complicated bootstrap & HTML directly anyway.
Read more here: https://laravel.com/docs/6.x/mail#customizing-the-components

How #include works in blade templating in Laravel

I was curious about how #include works in Laravel Blade, I mean if we use it in a loop like this
#foreach($posts as $post)
#include('parts.post')
#endforeach
will we load this file x times where x is amount of posts or we load this file once and use it x times?
Thanks
The blade template engine works by turning blade-html files into php-html files. #include will be replaced only once e.g.
<!-- parts/post.blade.php -->
<p>This is my post: {{$post}} </p>
<!-- some-template.blade.php -->
#foreach($posts as $post)
#include('parts.post')
#endforeach
Will be rendered into the following php-html code and saved into a view file (see storage/framework/views if you want to see this):
<?php for($posts as post){ ?>
<p>This is my post: <?php echo($post); ?> </p>
<?php } ?>

Laravel 5 echo out session variable containing html in blade

I did a redirect in laravel:
return redirect('admin')->with($returnData);
$returnData is a string that contains a bootstrap info div with the result from the controller. Almost everything is working except when the page loads again it shows the html on the page as if it were text, brackets and everything. If I use this:
#if(!empty(Session::get('error'))) {{ Session::get('error')}} #endif
Then it shows is as pure text. If I change it to
<?php if(!empty(Session::get('error'))) { echo Session::get('error'); } ?>
It works fine. Im ok keeping it like this but I would rather utilize Blade / Laravel as its supposed to be used so I was wondering if there is a way to have the #if statement show the rendered html and not the text version?
I would recommend returning just the error message then in your view create the div. So if you were to change the layout of the view, you would it in one place.
#if(Session::has('error'))
<div class="alert alert-danger">
{{ Session::get('error')}}
</div>
#endif
hope this help.
To show the rendered HTML you should use {!! $variable->coontent !!} in your view, and this gonna convert your HTML text to render
May this example will help you.
Try this
#if (session('Error'))
<div class="alert alert-success">
{{ session('Error') }}
</div>
#endif
If you want to display plain text from error without any HTML entities you can simply use:
{{ Session::get('error') }}
or
{{ session('error') }}
If you have HTML entities in your variable then use:
{!! Session::get('error') !!}
Try changing your blade code to following.
#if(!empty(Session::get('error')))
{!! Session::get('error') !!}
#endif

create a twig filter that wraps output in HTML

I created a filter in Twig that wraps some HTML around the output. E.g.
{{ 'this is a "test"'|display }}
outputs
<div id="container">
<div id="content">
this is a "test"
</div>
<div id="toolbar">
edit
</div>
</div>
The dilemma is, I would like that subsequent filters are applied only on the original content, and not on the entire html. E.g.
{{ 'this is a "test"'|display|upper|e }}
outputs
&LT;DIV ID=&QUOT;CONTAINER&QUOT;&GT;
&LT;DIV ID=&QUOT;CONTENT&QUOT;&GT;
THIS IS A &QUOT;TEST&QUOT;
&LT;/DIV&GT;
&LT;DIV ID=&QUOT;TOOLBAR&QUOT;&GT;
&LT;A HREF=&QUOT;/EDIT.PHP&QUOT;&GT;EDIT&LT;/A&GT;
&LT;/DIV&GT;
&LT;/DIV&GT;
but as you can imagine, I would prefer the output like this
<div id="container">
<div id="content">
THIS IS A &QUOT;TEST&QUOT;
</div>
<div id="toolbar">
edit
</div>
</div>
Changing the filter order to
{{ 'this is a "test"'|upper|e|display }}
would work for the upper filter, but not for the escape filter, because it places itself always at the end of the filter queue. Also it should work with autoescape=true.
Reading the twig documentation, I can't find a standard way to do what I want. Has someone maybe tried something similar? Or has someone an idea to work around the problem?
Thanks in advance!
Try:
{{ 'this is a "test"'|upper|e|display }}
Filter your content in first place and then wrap it.

Categories