master
sergeybodin 2023-07-12 14:44:16 +03:00
parent 96104fcc4e
commit 78b365b084
13 changed files with 241 additions and 22 deletions

View File

@ -0,0 +1,19 @@
<?php
namespace App\Events;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
class FeedbackSender {
use Dispatchable, InteractsWithSockets, SerializesModels;
public string $email;
public array $data;
public function __construct(string $email, array $data) {
$this->email = $email;
$this->data = $data;
}
}

View File

@ -28,10 +28,9 @@ class PublicationsController extends Controller {
$query = $this->model->query()->orderBy('id', 'desc'); $query = $this->model->query()->orderBy('id', 'desc');
$user = Auth::user(); $user = Auth::user();
if (!($user->isAdmin ?? null)) $query->where(['is_published' => true]); if (!($user->isAdmin ?? null)) $query->where(['is_published' => true]);
if ($page = Page::byUuid($request->get('page'))->first()){ if ($page = Page::byUuid($request->get('page_id'))->first()) $query->where(['page_id' => $page->id]);
$query->where(['page_id' => $page->id]); //$paginator = $query->paginate(config('app.pagination_limit'));
} $paginator = $query->paginate(1);
$paginator = $query->paginate(config('app.pagination_limit'));
return fractal($paginator, new PublicationTransformer())->respond(); return fractal($paginator, new PublicationTransformer())->respond();
} }

View File

@ -0,0 +1,17 @@
<?php
namespace App\Listeners;
use App\Mail\FeedbackSender;
use Illuminate\Support\Facades\Mail;
class SendFeedbackMessage {
public function __construct() {
}
public function handle(object $event) {
try {
Mail::to($event->email)->send(new FeedbackSender($event->data));
} catch (\Exception $exception) {}
}
}

View File

@ -0,0 +1,23 @@
<?php
namespace App\Mail;
use App\Models\User;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Mail\Mailable;
use Illuminate\Queue\SerializesModels;
class FeedbackSender extends Mailable implements ShouldQueue {
use Queueable, SerializesModels;
public array $data;
public function __construct(array $data) {
$this->data = $data;
}
public function build() {
return $this->subject('Сообщение из обратной связи')->view('mail.feedback.support');
}
}

View File

@ -2,8 +2,10 @@
namespace App\Providers; namespace App\Providers;
use App\Events\FeedbackSender;
use App\Events\PasswordRecovered; use App\Events\PasswordRecovered;
use App\Events\UserRegistered; use App\Events\UserRegistered;
use App\Listeners\SendFeedbackMessage;
use App\Listeners\SendPasswordRecoveredNotification; use App\Listeners\SendPasswordRecoveredNotification;
use App\Listeners\SendRegistrationNotification; use App\Listeners\SendRegistrationNotification;
use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Events\Registered;
@ -20,6 +22,9 @@ class EventServiceProvider extends ServiceProvider {
], ],
PasswordRecovered::class => [ PasswordRecovered::class => [
SendPasswordRecoveredNotification::class SendPasswordRecoveredNotification::class
],
FeedbackSender::class => [
SendFeedbackMessage::class
] ]
]; ];

View File

@ -0,0 +1,120 @@
<?php
namespace App\Services\Forms\Feedback;
use App\Events\FeedbackSender;
use App\Models\Asset;
use App\Models\Dictionaries\Dictionary;
use App\Models\Objects\FieldType;
use App\Models\Objects\NirObject;
use App\Models\Objects\ObjectType;
use App\Models\Registries\Entry;
use App\Models\Registries\Operation;
use App\Models\Registries\OperationType;
use App\Services\Forms\FormsService;
use App\Transformers\Assets\AssetTransformer;
use App\Transformers\Dictionaries\DictionaryItemTransformer;
use App\Transformers\Objects\FieldTransformer;
use App\Transformers\Objects\ObjectPropertyTransformer;
use App\Transformers\Objects\ObjectTransformer;
use App\Transformers\Registries\OperationTransformer;
use Illuminate\Http\JsonResponse;
class FeedbackForms extends FormsService {
public array $formTitles = ['create' => 'Создание операции', 'update' => 'Редактирование операции'];
public function form(?string $id = null, array $data = []): array {
$model = NirObject::byUuid($id)->first();
$groups = [
['name' => 'common', 'fields' => $this->commonGroupFields($model)]
];
return ['title' => $this->formTitle($model), 'data' => $groups];
}
public function commonGroupFields(?NirObject $model): array {
// return $model ? fractal($model->groups->first()->fields, new ObjectPropertyTransformer($model))->toArray() :
// fractal(ObjectType::byName('entry-operation')->first()->groups()->first()->fields, new FieldTransformer())->toArray();
/*
$fields = [
[
'name' => 'type',
'title' => 'Вид работы',
'type' => FieldType::RELATION,
'required' => true,
'appearance' => 'radio',
'options' => $this->getRelationItems(OperationType::TITLES),
'value' => $this->getRelationValue(OperationType::TITLES, $model->type ?? null)
],
[
'name' => 'order_name',
'title' => 'Наименование приказа',
'type' => FieldType::STRING,
'required' => true,
'value' => $model->order_name ?? null
],
[
'name' => 'order_date',
'title' => 'Дата приказа',
'required' => true,
'type' => FieldType::DATE,
'value' => ($v = $model->order_date ?? null) ? $v->toIso8601String() : null
],
[
'name' => 'order',
'title' => 'Документ приказа',
'type' => FieldType::DOCUMENT,
'required' => true,
'value' => ($order = $model->order ?? null) ? fractal($order, new AssetTransformer()) : null
],
[
'name' => 'listing',
'title' => 'Вхождение в перечень ПП',
'type' => FieldType::RELATION,
'multiple' => true,
'appearance' => 'checkbox',
'options' => fractal(Dictionary::byName('listings')->first()->items, new DictionaryItemTransformer()),
'value' => null
],
[
'name' => 'active_since',
'title' => 'Дата начала действия',
'type' => FieldType::DATE,
'required' => true,
'value' => ($v = $model->active_since ?? null) ? $v->toIso8601String() : null
],
[
'name' => 'active_till',
'title' => 'Дата окончания действия',
'type' => FieldType::DATE,
'value' => ($v = $model->active_till ?? null) ? $v->toIso8601String() : null
],
[
'name' => 'developer',
'title' => 'Разработчик',
'type' => FieldType::STRING,
'required' => true,
'value' => $model->developer ?? null
]
];
return ['data' => $fields];
*/
}
public function store(array $data) {
var_dump($data);
$email = 'sergey@bodin.ru';
event(new FeedbackSender($email, $data));
// $entry = Entry::byUuid($data['entry'] ?? null)->firstOrFail();
// $model = $entry->createObject('entry-operation', null, 'operations');
// $model->setValues($data);
// return fractal($model, new ObjectTransformer())->respond();
return null;
}
public function update(string $id, array $data) {
// $model = NirObject::byUuid($id)->firstOrFail();
// $model->setValues($data);
// return fractal($model->fresh(), new ObjectTransformer())->respond();
return null;
}
}

View File

@ -0,0 +1,9 @@
<?php
namespace App\Services\Forms\Feedback;
class FeedbackFormsServices {
public static array $services = [
'feedback-form-support' => FeedbackForms::class
];
}

View File

@ -2,6 +2,7 @@
namespace App\Services\Forms; namespace App\Services\Forms;
use App\Services\Forms\Feedback\FeedbackFormsServices;
use App\Services\Forms\Pages\PageFormsServices; use App\Services\Forms\Pages\PageFormsServices;
use App\Services\Forms\Publications\PublicationFormsServices; use App\Services\Forms\Publications\PublicationFormsServices;
use App\Services\Forms\Registries\RegistryFormsServices; use App\Services\Forms\Registries\RegistryFormsServices;
@ -14,7 +15,8 @@ class FormsService {
PageFormsServices::class, PageFormsServices::class,
PublicationFormsServices::class, PublicationFormsServices::class,
RegistryFormsServices::class, RegistryFormsServices::class,
UserFormsServices::class UserFormsServices::class,
FeedbackFormsServices::class,
]; ];
public function __construct() { public function __construct() {

View File

@ -4,6 +4,5 @@ namespace App\Services\Forms\Pages;
class PageFormsServices { class PageFormsServices {
public static array $services = [ public static array $services = [
'published' => PublicationForms::class
]; ];
} }

View File

@ -5,7 +5,9 @@ namespace Database\Seeders\Objects;
use App\Models\Dictionaries\DictionaryItem; use App\Models\Dictionaries\DictionaryItem;
use App\Models\Objects\Field; use App\Models\Objects\Field;
use App\Models\Objects\FieldType; use App\Models\Objects\FieldType;
use App\Models\Objects\ObjectType;
use App\Transformers\Dictionaries\DictionaryItemTransformer; use App\Transformers\Dictionaries\DictionaryItemTransformer;
use App\Transformers\Objects\ObjectTypeTransformer;
use Illuminate\Database\Seeder; use Illuminate\Database\Seeder;
class FieldsTableSeeder extends Seeder { class FieldsTableSeeder extends Seeder {
@ -127,29 +129,30 @@ class FieldsTableSeeder extends Seeder {
'type' => FieldType::HTML, 'type' => FieldType::HTML,
], ],
'feddback-email-admin' => [ 'feedback-support-email' => [
'title' => 'Email кому будет отправлен ответ', 'title' => 'Email кому будет отправлен ответ',
'type' => FieldType::STRING, 'type' => FieldType::STRING,
'required' => true, 'required' => true,
'params' => [
'showForm' => 'second',
]
], ],
'feedback-email-user' => [ 'feedback-form-type' => [
'title' => 'Email', 'title' => 'Тип формы',
'type' => FieldType::STRING, 'type' => FieldType::RELATION,
'required' => true, 'required' => true,
'params' => [ 'params' => [
'showForm' => 'second', 'related' => ObjectType::class, 'transformer' => ObjectTypeTransformer::class,
'options' => ['show' => true, 'whereHas' => ['parent' => ['name' => 'feedback-form']]]
] ]
], ],
'feedback-email' => [
'title' => 'Электронная почта',
'type' => FieldType::STRING,
'required' => true,
],
'feedback-name' => [ 'feedback-name' => [
'title' => 'Ваше имя', 'title' => 'Ваше имя',
'type' => FieldType::STRING, 'type' => FieldType::STRING,
'required' => true, 'required' => true,
'params' => [
'showForm' => 'second',
]
], ],
'feedback-type' => [ 'feedback-type' => [
'title' => 'Тема обращения', 'title' => 'Тема обращения',
@ -158,17 +161,14 @@ class FieldsTableSeeder extends Seeder {
'params' => [ 'params' => [
'related' => DictionaryItem::class, 'transformer' => DictionaryItemTransformer::class, 'related' => DictionaryItem::class, 'transformer' => DictionaryItemTransformer::class,
'options' => ['show' => true, 'whereHas' => ['dictionary' => ['name' => 'feedback-types']]], 'options' => ['show' => true, 'whereHas' => ['dictionary' => ['name' => 'feedback-types']]],
'showForm' => 'second',
] ]
], ],
'feedback-message' => [ 'feedback-message' => [
'title' => 'Текст сообщения', 'title' => 'Текст сообщения',
'type' => FieldType::TEXT, 'type' => FieldType::TEXT,
'required' => true, 'required' => true,
'params' => [
'showForm' => 'second',
]
], ],
'operation-type' => [ 'operation-type' => [
'title' => 'Вид работы', 'title' => 'Вид работы',
'type' => FieldType::RELATION, 'type' => FieldType::RELATION,
@ -194,6 +194,7 @@ class FieldsTableSeeder extends Seeder {
'type' => FieldType::DOCUMENT, 'type' => FieldType::DOCUMENT,
'required' => true 'required' => true
], ],
'listings' => [ 'listings' => [
'title' => 'Вхождение в перечень ПП', 'title' => 'Вхождение в перечень ПП',
'type' => FieldType::RELATION, 'type' => FieldType::RELATION,
@ -204,6 +205,7 @@ class FieldsTableSeeder extends Seeder {
'options' => ['show' => true, 'whereHas' => ['dictionary' => ['name' => 'listings']]] 'options' => ['show' => true, 'whereHas' => ['dictionary' => ['name' => 'listings']]]
] ]
], ],
'active-since' => [ 'active-since' => [
'title' => 'Дата начала действия', 'title' => 'Дата начала действия',
'type' => FieldType::DATE, 'type' => FieldType::DATE,
@ -213,6 +215,7 @@ class FieldsTableSeeder extends Seeder {
'title' => 'Дата окончания действия', 'title' => 'Дата окончания действия',
'type' => FieldType::DATE 'type' => FieldType::DATE
], ],
'developer' => [ 'developer' => [
'title' => 'Разработчик', 'title' => 'Разработчик',
'type' => FieldType::STRING 'type' => FieldType::STRING

View File

@ -62,7 +62,12 @@ class ObjectTypeFieldsTableSeeder extends Seeder {
], ],
'page-section-feedback' => [ 'page-section-feedback' => [
'common' => [ 'common' => [
'fields' => ['feddback-email-admin', 'feedback-email-user', 'feedback-name', 'feedback-type', 'feedback-message'] 'fields' => ['feedback-support-email', 'feedback-form-type']
]
],
'feedback-form-support' => [
'common' => [
'fields' => ['feedback-email', 'feedback-name', 'feedback-type', 'feedback-message']
] ]
], ],
'entry-operation' => [ 'entry-operation' => [

View File

@ -47,6 +47,15 @@ class ObjectTypesTableSeeder extends Seeder {
] ]
], ],
'feedback-form' => [
'title' => '',
'children' => [
'feedback-form-support' => [
'title' => 'Обращение',
],
]
],
'entry-operation' => [ 'entry-operation' => [
'title' => 'Действие с записью в реестре' 'title' => 'Действие с записью в реестре'
] ]

View File

@ -0,0 +1,9 @@
@extends('mail.layouts.layout')
@section('content')
<p>Вам пришло сообщение с обратной связи.</p>
<p class="mb-10">Email отправителя: {{$data->feedback_email}}</p>
<p class="mb-10">Имя отправителя: {{$data->feedback_name}}</p>
<p class="mb-10">Тема сообщения: {{$data->feedback_type}}</p>
<p class="mb-10">Сообщение: {{$data->feedback_message}}</p>
@endsection