Laravel 5.7: как отправить контактную форму с несколькими полями

Итак, у меня есть этот веб-сайт, который я разрабатываю, всего лишь одна страница начальной загрузки с несколькими разделами автоматической прокрутки. На странице есть раздел рассылки, где зритель может ввести свой адрес электронной почты, чтобы подписаться. Форма для этого работает нормально. Но проблема внизу, есть контактное окно для ввода «Имя, Электронная почта, Тема и Сообщение», где зритель может отправить контактное сообщение.

Базовая структура Код для контактной формы:

      {{ Form::open([
                              'action'   =>   'MailController@contactForm',
                              'class'    =>   'contactForm',
                              'method'   =>   'POST',
                              'files'    =>    true,
                                  ]) }}

            <div class="form-group">

              {{  Form::text('name', $value  = NULL, $attributes = array(

                              'id'           =>  'name',
                              'placeholder'  =>  'Your Name',
                              'class'        =>  'form-control',
                              'data-rule'    =>  'minlen:4',
                              'data-msg'     =>  'Please enter at least 4 chars',
                                )) }}

              @yield('div')

              {{  Form::email('email_two', $value  = NULL, $attributes = array(

                              'id'           =>  'email_two',
                              'placeholder'  =>  'Your Email',
                              'class'        =>  'form-control',
                              'data-rule'    =>  'email',
                              'data-msg'     =>  'Please enter a valid email',
                                )) }}

              @yield('div')

              {{  Form::text('subject', $value, $attributes = array(

                              'id'           =>  'subject',
                              'placeholder'  =>  'Subject',
                              'class'        =>  'form-control',
                              'data-rule'    =>  'minlen:4',
                              'data-msg'     =>  'Please enter at least 8 chars of subject',
                                )) }}

              @yield('div')

              {{  Form::textarea('message', $value, $attributes = array(

                              'id'           =>  'message',
                              'placeholder'  =>  'Message or File',
                              'class'        =>  'form-control',
                              'rows'         =>   5,
                              'data-rule'    =>  'required',
                              'data-msg'     =>  'Please write something for us',

                                )) }}

{{ Form::close() }}

Он выводит красивую красивую форму с моими css и js. Код для контроллера:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Http\Response;
use Illuminate\Mail\Mailer;
use Illuminate\Http\UploadedFile;

class MailController extends Controller {

          protected $request;
          protected $mailer;

          //method to send the subscriber email   (this one works fine)

          public function subscribe (Request $request, Mailer $mailer) {

                  // grab POST data varaiables

                  $this->request  =   $request;

                  if ($request->filled('email_one')) {
                        // $request->flash();
                        $email_one          =   $request->email_one; //$request->input('email_one')
                        $mailer->to($email_one)
                                ->send(new  \App\Mail\Newsletter($email_one));
                        return back();
                      }
          }


          //method to send the contact form is giving me headaches

          public function contactForm (Request $request, Mailer $mailer) {

                        $this->request  =   $request;

                        // $request->flash();

                        $email_two      =   $request->email_two;
                        $name           =   $request->name;
                        $subject        =   $request->subject;
                        $message        =   $request->message;

                  $mailer->to('[email protected]')
                         ->send(new   \App\Mail\ContactForm($data));

                  return back();



                }


}

Код для рассылки, которая не работает:

<?php

namespace App\Mail;

use Illuminate\Bus\Queueable;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Contracts\Queue\ShouldQueue;

class ContactForm extends Mailable {

            use Queueable, SerializesModels;

            // data to be used in view

            public $email_two;
            public $name;
            public $subject;
            public $message;

            public $data;

            /**
             * Create a new message instance.
             *
             * @return void
             */
            public function __construct($data) {

                  $this->email_two     =     $email_two;
                  $this->name          =     $name;
                  $this->subject       =     $subject;
                  $this->message       =     $message;

                  $data                =     array();

                  $data['email']       =      $this->email_two;
                  $data['name']        =      $this->name;
                  $data['subject']     =      $this->subject;
                  $data['message']     =      $this->message;

            }

            /**
             * Build the message.
             *
             * @return $this
             */
            public function build() {

              return $this->markdown('emails.contactform', compact('data'))
                          // ->subject('Message from Contact Box.')
                          ->from('[email protected]');
                          // ->attach('/path/to/file');
            }


}

Код для уценки контактной формы:

@component('mail::message')
# New Message Received.

You have received one new message. Please find below:

@component('mail::panel')
From:     {{ $email_two }}    <br>
Name:     {{ $name }}         <br>
Subject:  {{ $subject }}      <br>
Message:  {{ $message }}      
@endcomponent

@component('mail::panel')
This is the panel content.
@endcomponent

Thanks,<br>
{{ config('app.name') }}
@endcomponent

Итак, друзья, вот и все. Когда я отправляю информационный бюллетень, он работает успешно. Я тестирую MailTrap. Но когда я заполняю контактную форму, ничего не происходит. Страница не загружается. Никаких сообщений не приходит. Когда я пытаюсь отправить только одну переменную (например, тему, имя, адрес электронной почты или сообщение), это работает. Но отправка нескольких переменных не работает.

Пожалуйста посоветуй.


person M Roberts    schedule 09.12.2018    source источник
comment
в вашем contactForm вы отправляете $data на \App\Mail\ContactForm, но $data не существует. поместите свои четыре переменные в массив $data   -  person Roman Meyer    schedule 09.12.2018


Ответы (1)


Здесь довольно много проблем. Похоже, вы не совсем понимаете видимость переменных PHP в классах, поэтому прочтите документация. Например, строки $this->request = $request не нужны и ничего не делают.

Затем, когда вы делаете send(new \App\Mail\ContactForm($data)), вы не определили $data. Вы можете сделать $data = $request->all(); или установить для переменных выше $data['email_two'] = $request->input('email_two'); и т. Д.

Затем в вашем Mailable вы можете заменить весь код конструктора на $this->data = $data;

Наконец, в функции сборки добавьте строку $data = $this->data; в качестве первой строки.

person lufc    schedule 09.12.2018
comment
Сработал как шарм, дружище! В итоге я отправил его как $data = $request->all() и сжал массив в уценку; именно так, как вы предложили. Теперь я могу спать. Бесконечно благодарен. - person M Roberts; 10.12.2018