How to customize the emails sent by Laravel Breeze? - laravel

I wanted to customize the emails sent by Breeze from the default styles. Looks like the installation of Breeze does not publish the files for that but I found online that using php artisan vendor:publish --tag=laravel-notifications will publish the email files, and it did, although looks like it did not publish all the necessary files (it only published one file)
It only published /vendor/notifications/email.blade.php, with the following code, but looks like other things are missing like the components themselves such as the x-mail::button?
<x-mail::message>
{{-- Greeting --}}
#if (! empty($greeting))
# {{ $greeting }}
#else
#if ($level === 'error')
# #lang('Whoops!')
#else
# #lang('Hello!')
#endif
#endif
{{-- Intro Lines --}}
#foreach ($introLines as $line)
{{ $line }}
#endforeach
{{-- Action Button --}}
#isset($actionText)
<?php
$color = match ($level) {
'success', 'error' => $level,
default => 'primary',
};
?>
<x-mail::button :url="$actionUrl" :color="$color">
{{ $actionText }}
</x-mail::button>
#endisset
{{-- Outro Lines --}}
#foreach ($outroLines as $line)
{{ $line }}
#endforeach
{{-- Salutation --}}
#if (! empty($salutation))
{{ $salutation }}
#else
#lang('Regards'),<br>
{{ config('app.name') }}
#endif
{{-- Subcopy --}}
#isset($actionText)
<x-slot:subcopy>
#lang(
"If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\n".
'into your web browser:',
[
'actionText' => $actionText,
]
) <span class="break-all">[{{ $displayableActionUrl }}]({{ $actionUrl }})</span>
</x-slot:subcopy>
#endisset
</x-mail::message>
How can I customize that? The buttons for example? Because looks like this template is working for all the types of emails (welcome, verification, password-reset), so I can't just replace the contents with my code but I somehow need only to change the styles

Related

How does Laravel turn this code into a link?

Consider this block of code from a Laravel blade file:
<div class="result-content">
<h6>{{ $item->name }}</h6>
<div>{!! Str::limit($item->desccription, 120) !!}</div>
#if($item->type == 'lot')
<div>{{ $item->info ? "Current Bid: $".number_format($item->info, 2) : 'No bids yet' }}</div>
<div>{{ \Carbon\Carbon::parse($item->start)->setTimezone($_COOKIE['timezone'])->format('n/j/y g:ia T') }} - {{ \Carbon\Carbon::parse($item->end)->setTimezone($_COOKIE['timezone'])->format('n/j/y g:ia T') }}</div>
#else
<div>{{ $item->info }} Lot{{ $item->info > 1 ? "s" : '' }}</div>
<div>{{ \Carbon\Carbon::parse($item->start)->setTimezone($_COOKIE['timezone'])->format('n/j/y T') }} - {{ \Carbon\Carbon::parse($item->end)->setTimezone($_COOKIE['timezone'])->format('n/j/y T') }}</div>
#endif
<a href="{{ $item->search_url }}" title="">
View: {{ $item->search_title }}
</a>
</div>
Somehow or other, this renders in a browser as a block of text that is all included in a link tag, and "$item->search_url" becomes the link url. But the link is wrong - it just points back to the page this text is appearing on. I need to figure out where "search-url" is assigned its value, so I can fix it. But I am entirely new to Laravel, and I can't figure out where or how "search-url" is getting assigned a value. I've searched the entire system with Visual Code, and that name doesn't appear anywhere else. It's not a variable, it's not a property name, it's not a database field name.
Where is that variable getting assigned?

Passing variables to email footer in Laravel

I would like to show a disclaimer in the footer saying
This email was sent to {recipients email address}.
but i can't figure out how i can get the email address into the standard footer blade.
Here is what I have:
In my notification component I make the following call with $rcp_email having the email address of the recipient:
return (new MailMessage)
->subject('Contact Form Submitted')
->markdown('emails.generic.contactform', [
'first_name' => $this->first_name,
'message' => $this->message,
'rcp_email' => $this->rcp_email,
'url_security_issue' => $url_security_issue,
]);
The emails.generic.contactform looks like this
#extends('emails.main')
#section('content')
(body of email)
#endsection
emails.main looks like this
#component('mail::message')
#yield('content')
#if (isset($unsubscribe_url))
(html code for unsubscribe)
#endif
#endcomponent
the standard vendor\mail\html\message blade looks like this:
#component('mail::layout')
{{-- Header --}}
#slot('header')
#component('mail::header', ['url' => config('app.front_end_url'), 'logo' => asset('logo-image-white-circular-background.png')])
{{ config('app.name') }}
#endcomponent
#endslot
{{-- Body --}}
{{ $slot }}
{{-- Subcopy --}}
#isset($subcopy)
#slot('subcopy')
#component('mail::subcopy')
{{ $subcopy }}
#endcomponent
#endslot
#endisset
{{-- Footer --}}
#slot('footer')
#component('mail::footer')
© {{ date('Y') }} {{ config('app.name') }}. #lang('All rights reserved.')
#endcomponent
#endslot
#endcomponent
I traced each level of blade and $rcp_email is first of all not availble in the message blade. I tried to pass it on by changing the first line of emails.main to
#component('mail::message', ['rcp_email' => $rcp_email])
but in either case when i try to use the variable in the message blade, i get the error Undefined variable: rcp_email
In an ideal case, I would want to add the html code and make use of the variable in the actual footer blade, but I don't know if that's possible.
I would much appreciate if there is any hints/any docus or articles you can share that describes in depth how this works?
Thanks,
Goppi
hopefully this helps for others with issue
From what I did, when you use #component('mail::message', ['rcp_email' => $rcp_email]) it will pass the variable $rcp_email to the message blade.
Here change your message blade #component('mail::footer') to #component('mail::footer', ['rcp_email' => $rcp_email]) to pass it again to your footer blade.
In footer blade access the variable like {{$rcp_email}}
so example would be <p>sent to {{$rcp_email}}</p>
Also as a note, when passing the variable like ['name' => $variable] it uses the name as the variable in the next blade. so here you would access it like $name
Thanks #Jack C - your solution didn't work for me back then as you can see from my original post. I tried to pass rcp_email on to the message blade using
#component('mail::message', ['rcp_email' => $rcp_email])
and when I tested $rcp_email within the message blade, it came back with undefined variable. That said, I didn't figure out why it wasn't working, but I used #component with variables for other blades without issues. Perhaps it didn't work due to caching issue.
The solution that I came up with back then opened itself up once I decided not to use the standard email template, but design my own.
The emails.generic.contactform changed as follows:
#extends('emails.layout.layout')
#section('content')
{{-- body of email --}}
#endsection
The emails.layout.layout blade looks like this:
#component('mail::layout')
{{-- Content --}}
{{-- Footer --}}
#slot('footer')
#component('mail::footer')
{{ $recipient ?? '' }}
#endcomponent
#endslot
to summarize, my understanding on how to pass variables between blades is as follows:
extend - extends allows the layout blade to use all variables with the same names as the extended blade.
#extends('layout')
components have no access to the variables of the parent blade. Instead they need to be passed on. There are two ways to pass them on: as one or more variables or as a slot. In the example below $name is available within the component footer.
#component('footer', ['name' => $rcp_email])
#endcomponent
component - the second way is as a slot. In the example below the variable $slot would contain the email address.
#component('footer')
{{ $rcp_email }}
#endcomponent

How can I solve "No hint path defined for [mail]." (customize email layout) on laravel?

From here : Laravel 5.4 - How to customize notification email layout?
I try customize notification email layout
My code to send email like this :
public function toMail($notifiable)
{
return (new MailMessage)
->subject('Test')
->view('vendor.mail.markdown.message',['data'=>$this->data]);
}
The view like this :
#component('mail::layout')
{{-- Header --}}
#slot('header')
#component('mail::header', ['url' => config('app.url')])
{{ config('app.name') }}
#endcomponent
#endslot
{{-- Body --}}
{{ $slot }} test
{{-- Subcopy --}}
#isset($subcopy)
#slot('subcopy')
#component('mail::subcopy')
{{ $subcopy }}
#endcomponent
#endslot
#endisset
{{-- Footer --}}
#slot('footer')
#component('mail::footer')
© {{ date('Y') }} {{ config('app.name') }}. All rights reserved.
#endcomponent
#endslot
#endcomponent
If the code executed, there exist error like this :
(2/2) ErrorException No hint path defined for [mail]. (View:
C:\xampp\htdocs\myshop\resources\views\vendor\mail\markdown\message.blade.php)
How can I solve the error?
If you are using markdown in your template, you need to use the ->markdown() method rather than the ->view() method on your MailMessage
public function toMail($notifiable)
{
return (new MailMessage)
->subject('Test')
->markdown('vendor.mail.markdown.message', ['data' => $this->data]);
}
In an application migrated through different Laravel versions (and now at 5.6) I had to modify the file config/mail.php, changing the parameter markdown/paths from resource_path('views/vendor/mail') to resource_path('views/vendor/mail/markdown'), so it found the base templates for my Markdown mails.

Laravel blade regex image and output it?

Hi I have twitter api working to output details on the page however, this
field:
{{ $item['text'] }}
Gives me something like this:
RT #JacksSmokehouse: Don't forget #HappyHour tomorrow until 6pm - #loveJacks #live_oldham #OldhamHour #YouDontKnowJack https://twitter.com/shorturl, (with t.co)
So the image https:// I want to actually display it? is it possible to write in blade template a regex, something like this:
for each {{$item['text']}} take the url if there is any and output it below the text? can be a different variable.
Here's my full code:
<div>
#if(!empty($twitterItems))
#foreach($twitterItems as $key => $item)
{{ $item['text'] }}
#if(!empty($item['extended_entities']['media']))
#foreach($item['extended_entities']['media'] as $image)
<img src="{{ $image['media_url_https'] }}" style="width:100px;">
#endforeach
#endif
{{ $item['favorite_count'] }}
{{ $item['retweet_count'] }}
{{ $item['created_at'] }}
#endforeach
#else
There are no data.
#endif

What is the use of .blade in the Laravel framework?

I encountered the file welcome.blade.php in the views folder.
What is the purpose of .blade in the file's name?
Laravel uses Blade Template as its template engine (e.g. smarty was quite popular in past ) and .blade.php is extension used for it. Can find more details here
As mentioned by Abbasi Blade is a templating engine. I just wanted to share a good resource for blade and Laravel in general which provides some nice examples like:
#extends('layout.name')
// Begin a section
#section('name')
// End a section
#stop
// End a section and yield
#show
#parent
// Show a section in a template
#yield('name')
#include('view.name')
#include('view.name', array('key' => 'value'));
#lang('messages.name')
#choice('messages.name', 1);
#if
#else
#elseif
#endif
#unless
#endunless
#for
#endfor
#foreach
#endforeach
#while
#endwhile
//forelse 4.2 feature
#forelse($users as $user)
#empty
#endforelse
// Echo content
{{ $var }}
// Echo escaped content
{{{ $var }}}
{{-- Blade Comment --}}
// Echoing Data After Checking For Existence
{{{ $name or 'Default' }}}
// Displaying Raw Text With Curly Braces
#{{ This will not be processed by Blade }}
check out this site for other Laravel syntax helpers

Resources