Добавить второе действие или ссылку на уведомление Laravel

Я отправляю уведомление с помощью Laravel и не могу понять, как отправить второе действие. Вот мой код для функции toMail

 public function toMail($notifiable)
    {

    return (new MailMessage)
        ->subject($this->options['subject'])
        ->greeting($this->options['greeting'])
        ->line($this->options['contentParagraph1'])
        ->line($this->options['contentParagraph2'])
        ->action('Facebook', 'https://www.facebook.com/')
        ->line($this->options['contentParagraph5'])
        ->action('LinkedIn', 'https://www.linkedin.com/')
        ->line($this->options['contentParagraph3'])
        ->line($this->options['contentParagraph4'])
        ->salutation($this->options['salutation']);
}

То, что я получаю, это только второе действие. Похоже, второе действие перезаписывает первое. Есть ли способ сохранить оба действия или использовать ссылку вместо кнопки?

1 ответ

Решение

SimpleMessage Класс предназначен для создания простых сообщений, в которых есть одна кнопка призыва к действию. Вы можете найти код, обеспечивающий функциональность, в https://github.com/laravel/framework/blob/5.5/src/Illuminate/Notifications/Messages/SimpleMessage.php, а шаблон для писем SimpleMessage можно найти в https://github.com/laravel/framework/blob/5.5/src/Illuminate/Notifications/resources/views/email.blade.php - обратите внимание на одну кнопку.

Вы можете создавать более сложные сообщения, используя функцию почтовых уведомлений Markdown, которая позволит вам включать столько кнопок, сколько вам нужно. Вы можете реализовать это так:

  1. Запустите команду для генерации нового уведомления и введите markdown вариант, например: php artisan make:notification InvoicePaid --markdown=mail.invoice.paid
  2. Откройте вновь созданный шаблон, например: views/mail/invoice/paid.blade.php
  3. Добавьте столько кнопок, сколько хотите, например:

    @component('mail::message')
      # Introduction
    
      @component('mail::button', ['url' => $url1])
      Button 1 Text
      @endcomponent
    
      @component('mail::button', ['url' => $url2])
      Button 2 Text
      @endcomponent
    
      @component('mail::button', ['url' => $url3])
      Button 3 Text
      @endcomponent
    
      Thanks,<br>
      {{ config('app.name') }}
    @endcomponent
    
  4. Замените ваши звонки на SimpleMessage методы со ссылкой на ваш шаблон уценки при создании вашей электронной почты, например:

    return (new MailMessage)
      ->subject($this->options['subject'])
      ->markdown('mail.invoice.paid', $this->options);
    

Второй параметр в markdown Метод - это массив для передачи в ваше представление, с помощью которого вы можете включить различные значения, которые вы хотели бы включить в свою электронную почту, например: contentParagraph1, greeting а также salutation,

Я реализовал этот обходной путь для добавления кнопки в стандартный SimpleMailобъект. посколькуMailMessage::line() может принимать любой объект, реализующий Htmlable, вы можете поместить в него все, что захотите.

Вам все равно нужно переопределить класс уведомлений, чтобы вместо этого создать экземпляр MyMultiButtonVerifyEmail (вместо того VerifyEmail), но это легко сделать (и то, что вам, вероятно, уже приходилось делать после того, как была предоставлена ​​обновленная копия электронной почты).

Grrr, эти классы уведомлений Laravel по умолчанию нельзя использовать повторно, не так ли?

use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Contracts\Support\Htmlable;
use Illuminate\Notifications\Action;
use Illuminate\Notifications\Messages\MailMessage;
use Illuminate\Support\Facades\Lang;

class MyMultiButtonVerifyEmail extends VerifyEmail {

    public function toMail($notifiable) {
        $verificationUrl = ...;
        $resendUrl = ...;

        return (new MailMessage)
            ->line('some line')
            ->action(Lang::getFromJson('Verify Email Address'), $verificationUrl)
            ->line('another line')
            ->line($this->makeActionIntoLine(new Action(Lang::getFromJson('Request New Activation'), $resendUrl)))
            ->line(Lang::getFromJson('If you did not create an account, no further action is required.'));
    } // end toMail()

    private function makeActionIntoLine(Action $action): Htmlable {
        return new class($action) implements Htmlable {
            private $action;

            public function __construct(Action $action) {
                $this->action = $action;
            } // end __construct()

            public function toHtml() {
                return $this->strip($this->table());
            } // end toHtml()

            private function table() {
                return sprintf(
                    '<table class="action">
                        <tr>
                        <td align="center">%s</td>
                    </tr></table>
                ', $this->btn());
            } // end table()

            private function btn() {
                return sprintf(
                    '<a
                        href="%s"
                        class="button button-primary"
                        target="_blank"
                        style="font-family: -apple-system, BlinkMacSystemFont, \'Segoe UI\', Roboto, Helvetica, Arial, sans-serif, \'Apple Color Emoji\', \'Segoe UI Emoji\', \'Segoe UI Symbol\'; box-sizing: border-box; border-radius: 3px; box-shadow: 0 2px 3px rgba(0, 0, 0, 0.16); color: #fff; display: inline-block; text-decoration: none; -webkit-text-size-adjust: none; background-color: #3490dc; border-top: 10px solid #3490dc; border-right: 18px solid #3490dc; border-bottom: 10px solid #3490dc; border-left: 18px solid #3490dc;"
                    >%s</a>',
                    htmlspecialchars($this->action->url),
                    htmlspecialchars($this->action->text)
                );
            } // end btn()

            private function strip($text) {
                return str_replace("\n", ' ', $text);
            } // end strip()

        };
    } // end makeActionIntoLine()

}
Другие вопросы по тегам