J'essaie de personnaliser la présentation du courrier électronique HTML utilisée lors de l'envoi de notifications par courrier électronique.
J'ai publié les vues de courrier et de notification.
php artisan vendor:publish --tag=laravel-mail
php artisan vendor:publish --tag=laravel-notifications
Si je modifie le fichier /resources/views/vendor/notifications/email.blade.php
, je ne pourrai modifier que le contenu BODY des emails envoyés. Je souhaite modifier le pied de page, l'en-tête et toutes les autres parties de la présentation de l'e-mail.
J'ai également essayé de modifier les vues à l'intérieur de /resources/vendor/mail/html/
, mais chaque fois que la notification est envoyée, elle n'utilise même pas ces vues mais utilise celles par défaut de laravel framework.
Je sais que je peux définir une vue sur la MailMessage
renvoyée par ma classe Notification, mais je souhaite conserver les fonctions standard line()
, greeting()
, etc.
Est-ce que quelqu'un sait comment je peux obtenir mes notifications pour envoyer un courrier électronique en utilisant les vues dans /resources/vendor/mail/html
?
Ce qui suit est mon fichier /resources/views/vendor/notifications/email.blade.php
, mais il n’a aucun emplacement pour personnaliser la disposition en-tête/pied de page/globale.
@component('mail::message')
{{-- Greeting --}}
@if (! empty($greeting))
# {{ $greeting }}
@else
@if ($level == 'error')
# Whoops!
@else
# Hello!
@endif
@endif
{{-- Intro Lines --}}
@foreach ($introLines as $line)
{{ $line }}
@endforeach
{{-- Action Button --}}
@if (isset($actionText))
<?php
switch ($level) {
case 'success':
$color = 'green';
break;
case 'error':
$color = 'red';
break;
default:
$color = 'blue';
}
?>
@component('mail::button', ['url' => $actionUrl, 'color' => $color])
{{ $actionText }}
@endcomponent
@endif
{{-- Outro Lines --}}
@foreach ($outroLines as $line)
{{ $line }}
@endforeach
<!-- Salutation -->
@if (! empty($salutation))
{{ $salutation }}
@else
Regards,<br>{{ config('app.name') }}
@endif
<!-- Subcopy -->
@if (isset($actionText))
@component('mail::subcopy')
If you’re having trouble clicking the "{{ $actionText }}" button, copy and paste the URL below
into your web browser: [{{ $actionUrl }}]({{ $actionUrl }})
@endcomponent
@endif
@endcomponent
Exécuter cette commande
php artisan vendor:publish --tag=laravel-notifications
php artisan vendor:publish --tag=laravel-mail
mise à jour pour laravel 5.7+
php artisan vendor:publish
et alors vous obtiendrez:
[<number>] Tag: laravel-mail
[<number>] Tag: laravel-notifications
et puis il suffit de taper ce numéro devant pour publier le fichier pour édition
puis dans
/resources/views/vendor/mail/html/
vous pouvez éditer tous les composants et personnaliser tout ce que vous voulez ... Par exemple, j'ai édité la phrase "Tous droits réservés". dans "Tous les tests réservés" au bas de cette image dans ce fichier:
/resources/views/vendor/mail/html/message.blade.php
et voici ce que j'ai eu:
Assurez-vous d’avoir la bonne configuration dans votre config/mail.php:
'markdown' => [
'theme' => 'default',
'paths' => [
resource_path('views/vendor/mail'),
]
],
J'ai écrit un article sur la création d'une notification et la modification de votre modèle, y compris l'en-tête et le pied de page.
Il comprend des explications sur le fonctionnement des composants Laravel et sur la manière de transmettre vos données à un nouveau modèle de courrier électronique.
La partie la plus importante consiste à insérer le code suivant dans votre modèle de courrier électronique:
@component('mail::layout')
{{-- Header --}}
@slot('header')
@component('mail::header', ['url' => config('app.url')])
Header Title
@endcomponent
@endslot
{{-- Body --}}
This is our main message {{ $user }}
{{-- Subcopy --}}
@isset($subcopy)
@slot('subcopy')
@component('mail::subcopy')
{{ $subcopy }}
@endcomponent
@endslot
@endisset
{{-- Footer --}}
@slot('footer')
@component('mail::footer')
© {{ date('Y') }} {{ config('app.name') }}. Super FOOTER!
@endcomponent
@endslot
@endcomponent
Vous pouvez consulter l'article intermédiaire au cas où vous voudriez plus de détails sur le fonctionnement des composants et la manière de transmettre correctement les données.
@Brian Vous pouvez simplement modifier les directives @component dans votre fichier de modèle pour utiliser vos modèles personnalisés. Par exemple:
Remplacez @component('mail::message')
par @component('vendor.mail.html.message')
, en supposant que votre modèle se trouve à /resources/views/vendor/mail/html/message.blade.php
J'ai fini par utiliser une vue personnalisée plutôt que d'essayer de faire fonctionner les versions intégrées de Laravel.
J'ai ajouté l'instruction use
suivante à ma classe Notification
use Illuminate\Support\Facades\View;
use Illuminate\Support\HtmlString;
use TijsVerkoyen\CssToInlineStyles\CssToInlineStyles;
Puis dans la méthode toMail
:
public function toMail($notifiable)
{
$view_file = 'emails.teamInvitation';
$view = View::make($view_file, ['sender' => $this->sender, 'invitationToken' => $this->invitationToken, 'team' => $this->team ]);
$view = new HtmlString(with(new CssToInlineStyles)->convert($view));
return (new MailMessage)
->subject('PreSource Invitation From ' . $this->sender->name )
->view('emails.htmlBlank', ['bodyContent' => $view]);
}
emails.teamInvitation
est mon modèle de courrier électronique actuel.
Je compile la vue en une chaîne, puis convertis les feuilles de style en ligne.
emails.htmlBlank
est un fichier de vue, mais il ne fait que mettre echo out bodyContent
. Cela est nécessaire car la méthode MailMessage->view
attend un fichier de vue, et non un HtmlString.
Ne faites pas ce qui est suggéré ici.
Cela marche. Rappelez-vous simplement que vous devez éditer les modèles contenus dans le dossier 'vendor/mail/html' ET NON le contenu du dossier 'vendor/mail/markdown', sauf si vous utilisez bien sûr markdown au lieu de la ligne ()/greeting ( ) fonctions de création d'e-mails
Au lieu de cela, exécutez les commandes artisan, puis modifiez les fichiers générés dans votre dossier de ressources avec lequel vous vous retrouvez. N'écrasez jamais les fichiers du fournisseur, comme si vous travailliez sur une version locale, puis envoyez-le sur un serveur en direct et exécutez l'installation de composer, vous ne subirez plus ces modifications.
L'héritage de Laravel vous permet de remplacer facilement des méthodes et des fichiers prédéfinis. Profitez-en pour optimiser le contrôle des versions et optimiser les modifications apportées aux fonctionnalités principales.
Vous créez un courrier électronique en fonction du composant @component('mail::message')
Il s'agit d'un paramètre par défaut, décrit dans la documentation. Ce composant ne vous permet pas de modifier l'en-tête. Cependant, si vous regardez dans son fichier,
\vendor\laravel\framework\src\Illuminate\Mail\resources\views\markdown\message.blade.php
vous verrez qu'il utilise un autre composant @component('mail::layout')
,
Copiez simplement le contenu du fichier message.blade.php
dans votre .blade.php
et remplacez {{ $slot }}
par ce que vous aviez auparavant dans votre fichier.
Et maintenant, vous avez toute la flexibilité dans votre dossier.
Plus
si vous voulez modifier les styles, allez dans le fichier \config\mail.php
et changer la section markdown
comme si
'markdown' => [
'theme' => 'default0',
'paths' => [
resource_path('views/vendor/mail'),
base_path('resources/views/emails/vendor'),
],
],
Dans ce cas, j'ai remplacé le thème par défaut par mon propre \resources\views\emails\vendor\html\themes\default0.css
ou, si vous ne voulez pas personnaliser les chemins - mettez votre default0.css
dans /resources/views/vendor/mail/html/themes
- c'est un chemin par défaut et vous n'avez pas besoin de le mentionner.
Testé sur Laravel 5.7