From b1b31afa3bc7c39da4785aa482c5f23199a2135b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Michal=20Kv=C3=A1=C4=8Dek?= Date: Thu, 14 Sep 2017 20:18:32 +0200 Subject: [PATCH] FEATURE #1552 @1h: save sent messages into database --- ..._09_14_161824_create_sent_emails_table.php | 32 ++++++++++++++ Entities/SentEmail.php | 16 +++++++ Handlers/ContactForm.php | 26 ++++++------ Http/Controllers/Admin/SentEmails.php | 27 ++++++++++++ Http/Controllers/Visitor/CreateNewMessage.php | 25 +++++------ Http/Requests/SendNewEmailRequest.php | 1 - Http/routes.php | 12 ++++++ Listeners/SaveSentEmail.php | 23 ++++++++++ Mail/ContactFormMessage.php | 41 ++++++++++++++++++ Providers/ContactFormServiceProvider.php | 1 + Providers/EventServiceProvider.php | 14 +++++++ Resources/lang/cs/admin/adminMenu.php | 12 +++--- Resources/lang/cs/sent.php | 9 ++++ Resources/views/admin/emailDetail.blade.php | 21 ++++++++++ Resources/views/admin/sent.blade.php | 42 +++++++++++++++++++ 15 files changed, 266 insertions(+), 36 deletions(-) create mode 100644 Database/Migrations/2017_09_14_161824_create_sent_emails_table.php create mode 100644 Entities/SentEmail.php create mode 100644 Http/Controllers/Admin/SentEmails.php create mode 100644 Listeners/SaveSentEmail.php create mode 100644 Mail/ContactFormMessage.php create mode 100644 Providers/EventServiceProvider.php create mode 100644 Resources/lang/cs/sent.php create mode 100644 Resources/views/admin/emailDetail.blade.php create mode 100644 Resources/views/admin/sent.blade.php diff --git a/Database/Migrations/2017_09_14_161824_create_sent_emails_table.php b/Database/Migrations/2017_09_14_161824_create_sent_emails_table.php new file mode 100644 index 0000000..e89711e --- /dev/null +++ b/Database/Migrations/2017_09_14_161824_create_sent_emails_table.php @@ -0,0 +1,32 @@ +increments('id'); + $table->timestamps(); + $table->string('subject'); + $table->string('from'); + $table->string('to'); + $table->text('message'); + $table->boolean('is_new')->default(true)->commect('Was this message read (in admin)?'); + }); + } + + /** + * Rollback migration + */ + public function down() + { + Schema::dropIfExists('sent_emails'); + } +} \ No newline at end of file diff --git a/Entities/SentEmail.php b/Entities/SentEmail.php new file mode 100644 index 0000000..e70eb20 --- /dev/null +++ b/Entities/SentEmail.php @@ -0,0 +1,16 @@ + 'boolean']; +} \ No newline at end of file diff --git a/Handlers/ContactForm.php b/Handlers/ContactForm.php index 3755038..a110155 100755 --- a/Handlers/ContactForm.php +++ b/Handlers/ContactForm.php @@ -1,13 +1,14 @@ . View is returned only as name in plain text - * * @return array of views/templates/html codes divided into section */ public static function getExtendedFormInputsCreate() @@ -64,7 +62,6 @@ class ContactForm extends AdminHandler implements ContentTitles, AdvancedContent /** * Register admin menu (or multiple ones) - * * This cannot be in ServiceProvider because Session is started at middleware. And ServiceProvider is called before * starting any middleware.. * @@ -77,15 +74,21 @@ class ContactForm extends AdminHandler implements ContentTitles, AdvancedContent $submenu = $menu->whereTitle(trans('admin/mainMenu.contentPages')); $submenu->dropdown(trans('contactform::admin/adminMenu.contactForm'), function ($submenu) use ($user) { - $submenu->route('content.new', trans('contactform::admin/adminMenu.new'), ['moduleId' => self::getModuleId()], 10, ['icon' => 'fa fa-plus']); - $submenu->route('content.overview', trans('contactform::admin/adminMenu.overview'), ['moduleId' => self::getModuleId()], 20, ['icon' => 'fa fa-list']); - // $submenu->route('emails.sent', trans('contactform::admin/adminMenu.sentMessages'), [], 30, ['icon' => 'fa fa-send']); + $submenu->route('content.new', trans('contactform::admin/adminMenu.new'), ['module' => config('contactform.alias')], 10, ['icon' => 'fa fa-plus']); + $submenu->route('content.overview', trans('contactform::admin/adminMenu.overview'), ['module' => config('contactform.alias')], 20, ['icon' => 'fa fa-list']); }, 25, ['icon' => 'fa fa-envelope-o']); + + + $new = SentEmail::where('is_new', true)->count(); + + $suffix = ($new == 0) ? '' : ' ('.$new.')'; + + $menu->route('sentEmails.index', trans('contactform::admin/adminMenu.sentMessages'). $suffix , [], 50, ['icon' => 'fa fa-send']); + } /** * Does given module manage content? Or is it just module with widgets/something internal/something absolutely else? - * * @return bool */ public static function managesContent() @@ -95,9 +98,7 @@ class ContactForm extends AdminHandler implements ContentTitles, AdvancedContent /** * Get translated title for pages overview of given type. - * * This value is used for rendering list of all content pages of given type in administration. - * * @return string */ public static function getOverviewTitle() @@ -107,7 +108,6 @@ class ContactForm extends AdminHandler implements ContentTitles, AdvancedContent /** * Title displayed above for for creating new content page - * * @return string */ public static function getCreateNewTitle() @@ -129,7 +129,6 @@ class ContactForm extends AdminHandler implements ContentTitles, AdvancedContent /** * Does this module support categories? - * * @return boolean */ public static function supportCategories() @@ -139,7 +138,6 @@ class ContactForm extends AdminHandler implements ContentTitles, AdvancedContent /** * Method called right after content page is marked as deleted - * * This method is supposed to clean after "deleted" page. * * @param Content $content diff --git a/Http/Controllers/Admin/SentEmails.php b/Http/Controllers/Admin/SentEmails.php new file mode 100644 index 0000000..d0ea18d --- /dev/null +++ b/Http/Controllers/Admin/SentEmails.php @@ -0,0 +1,27 @@ +paginate(); + return view('contactform::admin.sent', compact('emails')); + } + + public function show(SentEmail $email) + { + + if ($email->is_new) { + $email->is_new = false; + $email->save(); + } + + return view('contactform::admin.emailDetail', compact('email')); + } +} \ No newline at end of file diff --git a/Http/Controllers/Visitor/CreateNewMessage.php b/Http/Controllers/Visitor/CreateNewMessage.php index 58d5c34..fd364d0 100755 --- a/Http/Controllers/Visitor/CreateNewMessage.php +++ b/Http/Controllers/Visitor/CreateNewMessage.php @@ -1,12 +1,13 @@ moduleSettings['emailTemplate']) ? $form->moduleSettings['emailTemplate'] : 'contactform::emails.default'; + $subject = isset($form->moduleSettings['subject']) ? $form->moduleSettings['subject'] : trans('contactform::admin/contents.defaultSubject'); + $data = $request->except('_token', 'g-recaptcha-response'); - // send email - $status = Mail::send(Template::name($template), ['data' => $request], function (Message $message) use ($request, $form) { - $message->from($request->email, $request->name); - - // get message subject - $subject = isset($form->moduleSettings['subject']) ? $form->moduleSettings['subject'] : trans('contactform::admin/contents.defaultSubject'); - - $message->to($form->moduleSettings['email']) - ->subject($subject); - }); + Mail::to($form->moduleSettings['contactEmail']) + ->send(new ContactFormMessage($data, $subject, Template::name($template))); // inform user about success or failure - return $this->sendResponse($status, $request, $form); + return $this->sendResponse($request, $form); } - private function sendResponse($status, SendNewEmailRequest $request, $form) + private function sendResponse(SendNewEmailRequest $request, $form) { // send response for ajax if ($request->ajax()) { return response()->json([ - 'status' => $status ? 'success' : 'failed', + 'status' => 'success', 'redirectUrl' => $form->url ]); } else { // redirect user to previous form $response = redirect()->back(); - return $status ? $response->with('success', 'sent') : $response->with('error', 'cannotSend'); + return $response->with('success', 'sent'); } } } diff --git a/Http/Requests/SendNewEmailRequest.php b/Http/Requests/SendNewEmailRequest.php index 7e0dab6..b8057da 100755 --- a/Http/Requests/SendNewEmailRequest.php +++ b/Http/Requests/SendNewEmailRequest.php @@ -6,7 +6,6 @@ class SendNewEmailRequest extends Request { /** * Get the validation rules that apply to the request. - * * @return array */ public function rules() diff --git a/Http/routes.php b/Http/routes.php index 2ff17cf..e1b2a6e 100755 --- a/Http/routes.php +++ b/Http/routes.php @@ -9,4 +9,16 @@ Route::group([ Route::post('/message/{formId}', 'CreateNewMessage@postMessage') ->name('email.send'); +}); + +Route::group([ + 'middleware' => ['admin', 'bindings'], + 'namespace' => '\Modules\ContactForm\Http\Controllers\Admin', + 'prefix' => LaravelLocalization::setLocale() . '/contactform' + ], function () { + + Route::get('sent', 'SentEmails@index') + ->name('sentEmails.index'); + + Route::get('send/{email}', 'SentEmails@show')->name('sentEmails.show'); }); \ No newline at end of file diff --git a/Listeners/SaveSentEmail.php b/Listeners/SaveSentEmail.php new file mode 100644 index 0000000..ebf195e --- /dev/null +++ b/Listeners/SaveSentEmail.php @@ -0,0 +1,23 @@ +message; + + $from = key($email->getFrom()); + $to = key($email->getTo()); + + SentEmail::create([ + 'from' => $from, + 'to' => $to, + 'subject' => $email->getSubject(), + 'message' => $email->getBody() + ]); + } +} \ No newline at end of file diff --git a/Mail/ContactFormMessage.php b/Mail/ContactFormMessage.php new file mode 100644 index 0000000..c12ee4d --- /dev/null +++ b/Mail/ContactFormMessage.php @@ -0,0 +1,41 @@ +data = $data; + $this->template = $template; + $this->subject = $subject; + } + + /** + * Build the message. + * @return $this + */ + public function build() + { + return $this->subject($this->subject) + ->from($this->data['email']) + ->view($this->template, ['data' => $this->data]); + } +} diff --git a/Providers/ContactFormServiceProvider.php b/Providers/ContactFormServiceProvider.php index 10f6590..4b3e314 100644 --- a/Providers/ContactFormServiceProvider.php +++ b/Providers/ContactFormServiceProvider.php @@ -28,6 +28,7 @@ class ContactFormServiceProvider extends ServiceProvider */ public function register() { + $this->app->register(EventServiceProvider::class); } private function registerWidgets() diff --git a/Providers/EventServiceProvider.php b/Providers/EventServiceProvider.php new file mode 100644 index 0000000..6b7f4e2 --- /dev/null +++ b/Providers/EventServiceProvider.php @@ -0,0 +1,14 @@ + [ + \Modules\ContactForm\Listeners\SaveSentEmail::class + ], + ]; +} \ No newline at end of file diff --git a/Resources/lang/cs/admin/adminMenu.php b/Resources/lang/cs/admin/adminMenu.php index 72e7b03..e08d1ff 100755 --- a/Resources/lang/cs/admin/adminMenu.php +++ b/Resources/lang/cs/admin/adminMenu.php @@ -1,9 +1,9 @@ "Kontaktní formulář", -"emails" => "E-mailové šablony", -"new" => "Nový", -"overview" => "Všechny formuláře", -"sentMessages" => "Zprávy", -"templatePath" => "Kontaktní formulář", + "contactForm" => "Kontaktní formulář", + "emails" => "E-mailové šablony", + "new" => "Nový", + "overview" => "Všechny formuláře", + "sentMessages" => "Přijaté zprávy", + "templatePath" => "Kontaktní formulář", ]; diff --git a/Resources/lang/cs/sent.php b/Resources/lang/cs/sent.php new file mode 100644 index 0000000..fdadd87 --- /dev/null +++ b/Resources/lang/cs/sent.php @@ -0,0 +1,9 @@ + 'Od', + 'to' => 'Komu', + 'subject' => 'Předmět', + 'createdAt' => 'Odesláno', + 'overview' => 'Přehled přijatých e-mailů', + 'detail' => 'Detail e-mailu' +]; \ No newline at end of file diff --git a/Resources/views/admin/emailDetail.blade.php b/Resources/views/admin/emailDetail.blade.php new file mode 100644 index 0000000..2ae0e33 --- /dev/null +++ b/Resources/views/admin/emailDetail.blade.php @@ -0,0 +1,21 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', @trans('contactform::sent.detail')) + +@section('headerButtons') + + @endsection + +@section('content') +
+
+

{{$email->subject}}

+ +

+ {{$email->message}} +

+
+ +
+@endsection \ No newline at end of file diff --git a/Resources/views/admin/sent.blade.php b/Resources/views/admin/sent.blade.php new file mode 100644 index 0000000..3e0e2b2 --- /dev/null +++ b/Resources/views/admin/sent.blade.php @@ -0,0 +1,42 @@ +@extends('admin.layoutWithNavigation') + +@section('pageHeading', @trans('contactform::sent.overview')) + +@section('content') + @if (count($emails)) +
+
+ + + + + + + + + @foreach($emails as $email) + is_new) class="bold" @endif > + + + + + + + @endforeach +
@lang('contactform::sent.from')@lang('contactform::sent.to')@lang('contactform::sent.createdAt')@lang('contactform::sent.subject')
{{$email->from}}{{$email->to}}@date($email->created_at){{$email->subject}} + + + +
+
+ +
+ + @else +
+ @lang('contactform::sent.noEntries') +
+ @endif +@stop \ No newline at end of file