Commit 77ece55780c19fb29b9520dc4693c282910a763c
1 parent
31e0a8793e
Exists in
master
task-132687 FAQ page now editable
Showing 13 changed files with 371 additions and 340 deletions Side-by-side Diff
- app/Enums/FaqTarget.php
- app/Http/Controllers/EmployerController.php
- app/Http/Controllers/FaqController.php
- app/Http/Requests/FaqActionRequest.php
- app/Models/Faq.php
- database/migrations/2024_09_02_072828_create_faqs_table.php
- resources/views/admin/faq/create.blade.php
- resources/views/admin/faq/form.blade.php
- resources/views/admin/faq/list.blade.php
- resources/views/admin/faq/update.blade.php
- resources/views/employers/faq.blade.php
- resources/views/layout/admin.blade.php
- routes/web.php
app/Enums/FaqTarget.php
app/Http/Controllers/EmployerController.php
... | ... | @@ -707,11 +707,6 @@ class EmployerController extends Controller |
707 | 707 | } |
708 | 708 | } |
709 | 709 | |
710 | - // FAQ - Вопросы/ответы для работодателей и соискателей | |
711 | - public function faq() { | |
712 | - return view('employers.faq'); | |
713 | - } | |
714 | - | |
715 | 710 | // Рассылка сообщений |
716 | 711 | public function send_all_messages() { |
717 | 712 | $id = Auth()->user()->id; |
app/Http/Controllers/FaqController.php
... | ... | @@ -0,0 +1,76 @@ |
1 | +<?php | |
2 | + | |
3 | +namespace App\Http\Controllers; | |
4 | + | |
5 | +use App\Enums\FaqTarget; | |
6 | +use App\Http\Requests\FaqActionRequest; | |
7 | +use App\Models\Faq; | |
8 | +use Illuminate\Http\RedirectResponse; | |
9 | + | |
10 | +class FaqController extends Controller | |
11 | +{ | |
12 | + public function get(string $userType = null) { | |
13 | + return Faq::query() | |
14 | + ->when($userType, function ($query, $userType) { | |
15 | + $query->where('target', $userType); | |
16 | + }) | |
17 | + ->where('active', true) | |
18 | + ->get(); | |
19 | + } | |
20 | + | |
21 | + public function showListForAdmin(){ | |
22 | + | |
23 | + return view( | |
24 | + 'admin.faq.list', | |
25 | + [ | |
26 | + 'questions' => $this->get(), | |
27 | + ] | |
28 | + ); | |
29 | + } | |
30 | + | |
31 | + public function showListForUser() | |
32 | + { | |
33 | + return view( | |
34 | + 'employers.faq', | |
35 | + [ | |
36 | + 'questionsEmployer' => $this->get(FaqTarget::EMPLOYER->value), | |
37 | + 'questionsEmployee' => $this->get(FaqTarget::EMPLOYEE->value) | |
38 | + ] | |
39 | + ); | |
40 | + } | |
41 | + | |
42 | + public function create() | |
43 | + { | |
44 | + return view('admin.faq.create'); | |
45 | + } | |
46 | + | |
47 | + public function store(FaqActionRequest $request) | |
48 | + { | |
49 | + Faq::query()->create($request->toArray()); | |
50 | + | |
51 | + return response()->redirectTo(route('admin.faq.list')); | |
52 | + } | |
53 | + | |
54 | + public function edit(int $id) | |
55 | + { | |
56 | + return view('admin.faq.update', ['question' => Faq::find($id)]); | |
57 | + } | |
58 | + | |
59 | + public function update(FaqActionRequest $request, int $id) | |
60 | + { | |
61 | + Faq::query() | |
62 | + ->where('id', $id) | |
63 | + ->update($request->all(['question', 'target', 'answer'])); | |
64 | + | |
65 | + return response()->redirectTo(route('admin.faq.list')); | |
66 | + } | |
67 | + | |
68 | + public function destroy(int $id): RedirectResponse | |
69 | + { | |
70 | + Faq::query() | |
71 | + ->where('id', $id) | |
72 | + ->delete(); | |
73 | + | |
74 | + return response()->redirectTo(route('admin.faq.list')); | |
75 | + } | |
76 | +} |
app/Http/Requests/FaqActionRequest.php
... | ... | @@ -0,0 +1,19 @@ |
1 | +<?php | |
2 | + | |
3 | +namespace App\Http\Requests; | |
4 | + | |
5 | +use App\Enums\FaqTarget; | |
6 | +use Illuminate\Foundation\Http\FormRequest; | |
7 | +use Illuminate\Validation\Rule; | |
8 | + | |
9 | +class FaqActionRequest extends FormRequest | |
10 | +{ | |
11 | + public function rules() | |
12 | + { | |
13 | + return [ | |
14 | + 'question' => 'required|string|max:255', | |
15 | + 'answer' => 'required|string', | |
16 | + 'target' => ['required', 'string', Rule::enum(FaqTarget::class)], | |
17 | + ]; | |
18 | + } | |
19 | +} |
app/Models/Faq.php
... | ... | @@ -0,0 +1,19 @@ |
1 | +<?php | |
2 | + | |
3 | +namespace App\Models; | |
4 | + | |
5 | +use Illuminate\Database\Eloquent\Model; | |
6 | + | |
7 | +/** | |
8 | + * @property string $question | |
9 | + * @property string $answer | |
10 | + * @property string $target | |
11 | + * @property boolean $active | |
12 | + */ | |
13 | +class Faq extends Model | |
14 | +{ | |
15 | + protected $guarded = [ | |
16 | + 'created_at', | |
17 | + 'updated_at' | |
18 | + ]; | |
19 | +} |
database/migrations/2024_09_02_072828_create_faqs_table.php
... | ... | @@ -0,0 +1,35 @@ |
1 | +<?php | |
2 | + | |
3 | +use Illuminate\Database\Migrations\Migration; | |
4 | +use Illuminate\Database\Schema\Blueprint; | |
5 | +use Illuminate\Support\Facades\Schema; | |
6 | + | |
7 | +return new class extends Migration | |
8 | +{ | |
9 | + /** | |
10 | + * Run the migrations. | |
11 | + * | |
12 | + * @return void | |
13 | + */ | |
14 | + public function up() | |
15 | + { | |
16 | + Schema::create('faqs', function (Blueprint $table) { | |
17 | + $table->id(); | |
18 | + $table->string('question'); | |
19 | + $table->text('answer'); | |
20 | + $table->string('target')->default('employer'); | |
21 | + $table->boolean('active')->default(true); | |
22 | + $table->timestamps(); | |
23 | + }); | |
24 | + } | |
25 | + | |
26 | + /** | |
27 | + * Reverse the migrations. | |
28 | + * | |
29 | + * @return void | |
30 | + */ | |
31 | + public function down() | |
32 | + { | |
33 | + Schema::dropIfExists('faqs'); | |
34 | + } | |
35 | +}; |
resources/views/admin/faq/create.blade.php
resources/views/admin/faq/form.blade.php
... | ... | @@ -0,0 +1,100 @@ |
1 | +@csrf | |
2 | + | |
3 | +@isset($question) | |
4 | + @method('PUT') | |
5 | +@endisset | |
6 | + | |
7 | +<script> | |
8 | + function translit(word){ | |
9 | + var answer = ''; | |
10 | + var converter = { | |
11 | + 'а': 'a', 'б': 'b', 'в': 'v', 'г': 'g', 'д': 'd', | |
12 | + 'е': 'e', 'ё': 'e', 'ж': 'zh', 'з': 'z', 'и': 'i', | |
13 | + 'й': 'y', 'к': 'k', 'л': 'l', 'м': 'm', 'н': 'n', | |
14 | + 'о': 'o', 'п': 'p', 'р': 'r', 'с': 's', 'т': 't', | |
15 | + 'у': 'u', 'ф': 'f', 'х': 'h', 'ц': 'c', 'ч': 'ch', | |
16 | + 'ш': 'sh', 'щ': 'sch', 'ь': '', 'ы': 'y', 'ъ': '', | |
17 | + 'э': 'e', 'ю': 'yu', 'я': 'ya', | |
18 | + | |
19 | + 'А': 'A', 'Б': 'B', 'В': 'V', 'Г': 'G', 'Д': 'D', | |
20 | + 'Е': 'E', 'Ё': 'E', 'Ж': 'Zh', 'З': 'Z', 'И': 'I', | |
21 | + 'Й': 'Y', 'К': 'K', 'Л': 'L', 'М': 'M', 'Н': 'N', | |
22 | + 'О': 'O', 'П': 'P', 'Р': 'R', 'С': 'S', 'Т': 'T', | |
23 | + 'У': 'U', 'Ф': 'F', 'Х': 'H', 'Ц': 'C', 'Ч': 'Ch', | |
24 | + 'Ш': 'Sh', 'Щ': 'Sch', 'Ь': '', 'Ы': 'Y', 'Ъ': '', | |
25 | + 'Э': 'E', 'Ю': 'Yu', 'Я': 'Ya', ' ': '-' | |
26 | + }; | |
27 | + | |
28 | + for (var i = 0; i < word.length; ++i ) { | |
29 | + if (converter[word[i]] == undefined){ | |
30 | + answer += word[i]; | |
31 | + } else { | |
32 | + answer += converter[word[i]]; | |
33 | + } | |
34 | + } | |
35 | + | |
36 | + return answer; | |
37 | + } | |
38 | + | |
39 | + window.addEventListener("DOMContentLoaded", (event) => { | |
40 | + let title = document.querySelector('#name'); | |
41 | + let text = document.querySelector('#slug'); | |
42 | + | |
43 | + title.addEventListener('input', function() { | |
44 | + text.value = translit(this.value); | |
45 | + }); | |
46 | + }); | |
47 | + | |
48 | +</script> | |
49 | +<div class="px-4 py-3 mb-8 bg-white rounded-lg shadow-md dark:bg-gray-800"> | |
50 | + <label class="block text-sm"> | |
51 | + <span class="text-gray-700 dark:text-gray-400">Вопрос</span> | |
52 | + <input name="question" id="question" | |
53 | + class="block w-full mt-1 text-sm dark:border-gray-600 dark:bg-gray-700 focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:text-gray-300 dark:focus:shadow-outline-gray form-input" | |
54 | + placeholder="Вопрос" value="{{ old('name') ?? $question->question ?? '' }}" | |
55 | + /> | |
56 | + @error('question') | |
57 | + <span class="text-xs text-red-600 dark:text-red-400"> | |
58 | + {{ $message }} | |
59 | + </span> | |
60 | + @enderror | |
61 | + </label><br> | |
62 | + | |
63 | + <label class="block text-sm"> | |
64 | + <span class="text-gray-700 dark:text-gray-400">Ответ</span> | |
65 | + <textarea class="block w-full mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-textarea focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray ckeditor" name="answer" placeholder="Ответ" required rows="10"> | |
66 | + {{ old('text2') ?? $question->answer ?? '' }} | |
67 | + </textarea> | |
68 | + @error('answer') | |
69 | + <span class="text-xs text-red-600 dark:text-red-400"> | |
70 | + {{ $message }} | |
71 | + </span> | |
72 | + @enderror | |
73 | + </label><br> | |
74 | + | |
75 | + <label class="block text-sm"> | |
76 | + <span class="text-gray-700 dark:text-gray-400">Ответ</span> | |
77 | + <select name="target" id="target" placeholder="Для кого" | |
78 | + class="block w-full mt-1 text-sm dark:text-gray-300 dark:border-gray-600 dark:bg-gray-700 form-select focus:border-purple-400 focus:outline-none focus:shadow-outline-purple dark:focus:shadow-outline-gray"> | |
79 | + <option value="{{ \App\Enums\FaqTarget::EMPLOYER->value }}" @if (isset($question) && \App\Enums\FaqTarget::EMPLOYER->value==$question->target) selected @endif>Работодатель</option> | |
80 | + <option value="{{ \App\Enums\FaqTarget::EMPLOYEE->value }}" @if (isset($question) && \App\Enums\FaqTarget::EMPLOYEE->value==$question->target) selected @endif>Работник</option> | |
81 | + </select> | |
82 | + @error('target') | |
83 | + <span class="text-xs text-red-600 dark:text-red-400"> | |
84 | + {{ $message }} | |
85 | + </span> | |
86 | + @enderror | |
87 | + </label><br> | |
88 | + | |
89 | + <div class="flex flex-col flex-wrap mb-4 space-y-4 md:flex-row md:items-end md:space-x-4"> | |
90 | + <div> | |
91 | + <button type="submit" class="px-3 py-1 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-md active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple"> | |
92 | + Сохранить | |
93 | + </button> | |
94 | + <a href="{{ route('admin.faq.list') }}" | |
95 | + class="px-3 py-1 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-md active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple" | |
96 | + style="display: -webkit-inline-box; height: 30px!important;" | |
97 | + >Назад</a> | |
98 | + </div> | |
99 | + </div> | |
100 | +</div> |
resources/views/admin/faq/list.blade.php
... | ... | @@ -0,0 +1,46 @@ |
1 | +@extends('layout.admin', ['title' => 'Админка - Страница статистики']) | |
2 | + | |
3 | +@section('content') | |
4 | + | |
5 | + <a href="{{ route('admin.faq.create') }}" style="width: 200px" class="px-3 py-1 text-sm font-medium leading-5 text-white transition-colors duration-150 bg-purple-600 border border-transparent rounded-md active:bg-purple-600 hover:bg-purple-700 focus:outline-none focus:shadow-outline-purple"> | |
6 | + Добавить вопрос/ответ | |
7 | + </a> | |
8 | + <br> | |
9 | + <div class="w-full overflow-hidden rounded-lg shadow-xs" id="ajax_block"> | |
10 | + | |
11 | + <div class="w-full overflow-x-auto"> | |
12 | + <table class="w-full whitespace-no-wrap"> | |
13 | + <thead> | |
14 | + <tr class="text-xs font-semibold tracking-wide text-left text-gray-500 uppercase border-b dark:border-gray-700 bg-gray-50 dark:text-gray-400 dark:bg-gray-800"> | |
15 | + <th class="px-4 py-3">ID</th> | |
16 | + <th class="px-4 py-3">Вопрос</th> | |
17 | + <th class="px-4 py-3">Дата создания</th> | |
18 | + <th class="px-4 py-3"></th> | |
19 | + <th class="px-4 py-3"></th> | |
20 | + </tr> | |
21 | + </thead> | |
22 | + <tbody class="bg-white divide-y dark:divide-gray-700 dark:bg-gray-800"> | |
23 | + @foreach($questions as $question) | |
24 | + <tr class="text-gray-700 dark:text-gray-400"> | |
25 | + <td class="px-4 py-3"> | |
26 | + {{$question->id}} | |
27 | + </td> | |
28 | + <td class="px-4 py-3"> | |
29 | + {{$question->question}} | |
30 | + </td> | |
31 | + <td class="px-4 py-3"> | |
32 | + {{$question->created_at}} | |
33 | + </td> | |
34 | + <td class="px-4 py-3 text-sm_"> | |
35 | + <a href="{{ route('admin.faq.edit', ['id' => $question->id]) }}">Изменить</a> | |
36 | + </td> | |
37 | + <td class="px-4 py-3 text-sm_"> | |
38 | + <a href="{{ route('admin.faq.destroy', ['id' => $question->id]) }}">Удалить</a> | |
39 | + </td> | |
40 | + </tr> | |
41 | + @endforeach | |
42 | + </tbody> | |
43 | + </table> | |
44 | + </div> | |
45 | + </div> | |
46 | +@endsection |
resources/views/admin/faq/update.blade.php
... | ... | @@ -0,0 +1,7 @@ |
1 | +@extends('layout.admin', ['title' => 'Админка - Добавление страницы']) | |
2 | + | |
3 | +@section('content') | |
4 | + <form method="POST" action="{{ route('admin.faq.update', ['id' => $question->id]) }}" enctype="multipart/form-data"> | |
5 | + @include('admin.faq.form') | |
6 | + </form> | |
7 | +@endsection |
resources/views/employers/faq.blade.php
1 | 1 | @extends('layout.frontend', ['title' => 'FAQ Вопросы и ответы - РекаМоре']) |
2 | 2 | |
3 | -@section('scripts') | |
4 | - <script> | |
5 | - $(document).on('change', '#sort_ajax', function() { | |
6 | - var this_ = $(this); | |
7 | - var val_ = this_.val(); | |
8 | - console.log('sort items '+val_); | |
9 | - | |
10 | - $.ajax({ | |
11 | - type: "GET", | |
12 | - url: "{{ route('shipping_companies') }}", | |
13 | - data: "sort="+val_+"&block=1", | |
14 | - success: function (data) { | |
15 | - console.log('Выбор сортировки'); | |
16 | - console.log(data); | |
17 | - $('#block_1').html(data); | |
18 | - }, | |
19 | - headers: { | |
20 | - 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') | |
21 | - }, | |
22 | - error: function (data) { | |
23 | - data = JSON.stringify(data); | |
24 | - console.log('Error: ' + data); | |
25 | - } | |
26 | - }); | |
27 | - | |
28 | - $.ajax({ | |
29 | - type: "GET", | |
30 | - url: "{{ route('shipping_companies') }}", | |
31 | - data: "sort="+val_+"&block=2", | |
32 | - success: function (data) { | |
33 | - console.log('Выбор сортировки2'); | |
34 | - console.log(data); | |
35 | - history.pushState({}, '', "{{ route('shipping_companies') }}?sort="+val_+"@if (isset($_GET['page']))&page={{ $_GET['page'] }}@endif"); | |
36 | - $('#block_2').html(data); | |
37 | - }, | |
38 | - headers: { | |
39 | - 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content') | |
40 | - }, | |
41 | - error: function (data) { | |
42 | - data = JSON.stringify(data); | |
43 | - console.log('Error: ' + data); | |
44 | - } | |
45 | - }); | |
46 | - }); | |
47 | - </script> | |
48 | -@endsection | |
49 | - | |
50 | 3 | @section('content') |
51 | 4 | <section class="cabinet"> |
52 | 5 | <div class="container"> |
... | ... | @@ -76,302 +29,40 @@ |
76 | 29 | </div> |
77 | 30 | <div class="cabinet__bodies showed" data-body="1"> |
78 | 31 | <div class="faqs"> |
79 | - <!--<button type="button" class="faqs__button js-toggle js-parent-toggle button button_light button_more"> | |
80 | - <span>Показать ещё</span> | |
81 | - <span>Свернуть</span> | |
82 | - </button>--> | |
32 | + @foreach($questionsEmployer as $question) | |
83 | 33 | <div class="faqs__body"> |
84 | 34 | <div class="faqs__item"> |
85 | - <button type="button" class="faqs__item-button js-toggle active"> | |
86 | - <span>Инструкция 1 для работодателя</span> | |
87 | - <i> | |
88 | - <svg> | |
89 | - <use xlink:href="{{ asset('images/sprite.svg#arrow') }}"></use> | |
90 | - </svg> | |
91 | - </i> | |
92 | - </button> | |
93 | - <div class="faqs__item-body"> | |
94 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
95 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
96 | - </div> | |
97 | - </div> | |
98 | - <div class="faqs__item"> | |
99 | - <button type="button" class="faqs__item-button js-toggle"> | |
100 | - <span>Инструкция 2 для работодателя</span> | |
101 | - <i> | |
102 | - <svg> | |
103 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
104 | - </svg> | |
105 | - </i> | |
106 | - </button> | |
107 | - <div class="faqs__item-body"> | |
108 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
109 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
110 | - </div> | |
111 | - </div> | |
112 | - <div class="faqs__item"> | |
113 | - <button type="button" class="faqs__item-button js-toggle"> | |
114 | - <span>Вопрос 3</span> | |
115 | - <i> | |
116 | - <svg> | |
117 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
118 | - </svg> | |
119 | - </i> | |
120 | - </button> | |
121 | - <div class="faqs__item-body"> | |
122 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
123 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
124 | - </div> | |
125 | - </div> | |
126 | - <div class="faqs__item"> | |
127 | - <button type="button" class="faqs__item-button js-toggle"> | |
128 | - <span>Вопрос 4</span> | |
129 | - <i> | |
130 | - <svg> | |
131 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
132 | - </svg> | |
133 | - </i> | |
134 | - </button> | |
135 | - <div class="faqs__item-body"> | |
136 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
137 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
138 | - </div> | |
139 | - </div> | |
140 | - <div class="faqs__item"> | |
141 | - <button type="button" class="faqs__item-button js-toggle"> | |
142 | - <span>Вопрос 5</span> | |
143 | - <i> | |
144 | - <svg> | |
145 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
146 | - </svg> | |
147 | - </i> | |
148 | - </button> | |
149 | - <div class="faqs__item-body"> | |
150 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
151 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
152 | - </div> | |
153 | - </div> | |
154 | - <div class="faqs__item"> | |
155 | 35 | <button type="button" class="faqs__item-button js-toggle"> |
156 | - <span>Вопрос 6</span> | |
36 | + <span>{{ $question->question }}</span> | |
157 | 37 | <i> |
158 | 38 | <svg> |
159 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
160 | - </svg> | |
161 | - </i> | |
162 | - </button> | |
163 | - <div class="faqs__item-body"> | |
164 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
165 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
166 | - </div> | |
167 | - </div> | |
168 | - <div class="faqs__item"> | |
169 | - <button type="button" class="faqs__item-button js-toggle"> | |
170 | - <span>Вопрос 7</span> | |
171 | - <i> | |
172 | - <svg> | |
173 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
174 | - </svg> | |
175 | - </i> | |
176 | - </button> | |
177 | - <div class="faqs__item-body"> | |
178 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
179 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
180 | - </div> | |
181 | - </div> | |
182 | - <div class="faqs__item"> | |
183 | - <button type="button" class="faqs__item-button js-toggle"> | |
184 | - <span>Вопрос 8</span> | |
185 | - <i> | |
186 | - <svg> | |
187 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
188 | - </svg> | |
189 | - </i> | |
190 | - </button> | |
191 | - <div class="faqs__item-body"> | |
192 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
193 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
194 | - </div> | |
195 | - </div> | |
196 | - <div class="faqs__item"> | |
197 | - <button type="button" class="faqs__item-button js-toggle"> | |
198 | - <span>Вопрос 9</span> | |
199 | - <i> | |
200 | - <svg> | |
201 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
202 | - </svg> | |
203 | - </i> | |
204 | - </button> | |
205 | - <div class="faqs__item-body"> | |
206 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
207 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
208 | - </div> | |
209 | - </div> | |
210 | - <div class="faqs__item"> | |
211 | - <button type="button" class="faqs__item-button js-toggle"> | |
212 | - <span>Вопрос 10</span> | |
213 | - <i> | |
214 | - <svg> | |
215 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
39 | + <use xlink:href="{{ asset('images/sprite.svg#arrow') }}"></use> | |
216 | 40 | </svg> |
217 | 41 | </i> |
218 | 42 | </button> |
219 | - <div class="faqs__item-body"> | |
220 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
221 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
222 | - </div> | |
43 | + <div class="faqs__item-body" style="white-space:break-spaces; word-break: break-word;">{{ $question->answer }}</div> | |
223 | 44 | </div> |
224 | 45 | </div> |
46 | + @endforeach | |
225 | 47 | </div> |
226 | 48 | </div> |
227 | 49 | <div class="cabinet__bodies" data-body="2"> |
228 | 50 | <div class="faqs"> |
229 | - <!--<button type="button" class="faqs__button js-toggle js-parent-toggle button button_light button_more"> | |
230 | - <span>Показать ещё</span> | |
231 | - <span>Свернуть</span> | |
232 | - </button>--> | |
233 | - <div class="faqs__body"> | |
234 | - <div class="faqs__item"> | |
235 | - <button type="button" class="faqs__item-button js-toggle active"> | |
236 | - <span>Инструкция для соискателя 1</span> | |
237 | - <i> | |
238 | - <svg> | |
239 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
240 | - </svg> | |
241 | - </i> | |
242 | - </button> | |
243 | - <div class="faqs__item-body"> | |
244 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
245 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
246 | - </div> | |
247 | - </div> | |
248 | - <div class="faqs__item"> | |
249 | - <button type="button" class="faqs__item-button js-toggle"> | |
250 | - <span>Вопрос 2</span> | |
251 | - <i> | |
252 | - <svg> | |
253 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
254 | - </svg> | |
255 | - </i> | |
256 | - </button> | |
257 | - <div class="faqs__item-body"> | |
258 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
259 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
260 | - </div> | |
261 | - </div> | |
262 | - <div class="faqs__item"> | |
263 | - <button type="button" class="faqs__item-button js-toggle"> | |
264 | - <span>Вопрос 2</span> | |
265 | - <i> | |
266 | - <svg> | |
267 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
268 | - </svg> | |
269 | - </i> | |
270 | - </button> | |
271 | - <div class="faqs__item-body"> | |
272 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
273 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
274 | - </div> | |
275 | - </div> | |
276 | - <div class="faqs__item"> | |
277 | - <button type="button" class="faqs__item-button js-toggle"> | |
278 | - <span>Вопрос 2</span> | |
279 | - <i> | |
280 | - <svg> | |
281 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
282 | - </svg> | |
283 | - </i> | |
284 | - </button> | |
285 | - <div class="faqs__item-body"> | |
286 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
287 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
288 | - </div> | |
289 | - </div> | |
290 | - <div class="faqs__item"> | |
291 | - <button type="button" class="faqs__item-button js-toggle"> | |
292 | - <span>Вопрос 2</span> | |
293 | - <i> | |
294 | - <svg> | |
295 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
296 | - </svg> | |
297 | - </i> | |
298 | - </button> | |
299 | - <div class="faqs__item-body"> | |
300 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
301 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
302 | - </div> | |
303 | - </div> | |
304 | - <div class="faqs__item"> | |
305 | - <button type="button" class="faqs__item-button js-toggle"> | |
306 | - <span>Вопрос 2</span> | |
307 | - <i> | |
308 | - <svg> | |
309 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
310 | - </svg> | |
311 | - </i> | |
312 | - </button> | |
313 | - <div class="faqs__item-body"> | |
314 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
315 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
316 | - </div> | |
317 | - </div> | |
318 | - <div class="faqs__item"> | |
319 | - <button type="button" class="faqs__item-button js-toggle"> | |
320 | - <span>Вопрос 2</span> | |
321 | - <i> | |
322 | - <svg> | |
323 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
324 | - </svg> | |
325 | - </i> | |
326 | - </button> | |
327 | - <div class="faqs__item-body"> | |
328 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
329 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
330 | - </div> | |
331 | - </div> | |
332 | - <div class="faqs__item"> | |
333 | - <button type="button" class="faqs__item-button js-toggle"> | |
334 | - <span>Вопрос 2</span> | |
335 | - <i> | |
336 | - <svg> | |
337 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
338 | - </svg> | |
339 | - </i> | |
340 | - </button> | |
341 | - <div class="faqs__item-body"> | |
342 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
343 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
344 | - </div> | |
345 | - </div> | |
346 | - <div class="faqs__item"> | |
347 | - <button type="button" class="faqs__item-button js-toggle"> | |
348 | - <span>Вопрос 2</span> | |
349 | - <i> | |
350 | - <svg> | |
351 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
352 | - </svg> | |
353 | - </i> | |
354 | - </button> | |
355 | - <div class="faqs__item-body"> | |
356 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
357 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
358 | - </div> | |
359 | - </div> | |
360 | - <div class="faqs__item"> | |
361 | - <button type="button" class="faqs__item-button js-toggle"> | |
362 | - <span>Вопрос 2</span> | |
363 | - <i> | |
364 | - <svg> | |
365 | - <use xlink:href="images/sprite.svg#arrow"></use> | |
366 | - </svg> | |
367 | - </i> | |
368 | - </button> | |
369 | - <div class="faqs__item-body"> | |
370 | - <p>Ясность нашей позиции очевидна: выбранный нами инновационный путь обеспечивает актуальность дальнейших направлений развития.</p> | |
371 | - <p>Высокий уровень вовлечения представителей целевой аудитории является четким доказательством простого факта: базовый вектор развития создаёт необходимость включения в производственный план целого ряда внеочередных мероприятий с учётом комплекса позиций, занимаемых участниками в отношении поставленных задач.</p> | |
372 | - </div> | |
373 | - </div> | |
374 | - </div> | |
51 | + @foreach($questionsEmployee as $question) | |
52 | + <div class="faqs__body"> | |
53 | + <div class="faqs__item"> | |
54 | + <button type="button" class="faqs__item-button js-toggle"> | |
55 | + <span>{{ $question->question }}</span> | |
56 | + <i> | |
57 | + <svg> | |
58 | + <use xlink:href="{{ asset('images/sprite.svg#arrow') }}"></use> | |
59 | + </svg> | |
60 | + </i> | |
61 | + </button> | |
62 | + <div class="faqs__item-body" style="white-space:break-spaces; word-break: break-word;">{{ $question->answer }}</div> | |
63 | + </div> | |
64 | + </div> | |
65 | + @endforeach | |
375 | 66 | </div> |
376 | 67 | </div> |
377 | 68 | </div> |
... | ... | @@ -380,8 +71,5 @@ |
380 | 71 | </div> |
381 | 72 | |
382 | 73 | </section> |
383 | - | |
384 | - </div> | |
385 | - <div> | |
386 | 74 | @endsection |
387 | 75 |
resources/views/layout/admin.blade.php
... | ... | @@ -719,6 +719,15 @@ |
719 | 719 | @endif |
720 | 720 | @endif |
721 | 721 | |
722 | + @if ($cont->url_page == "admin/faq") | |
723 | + @if ((($cont->is_admin == 1) && ($admin == 1)) || | |
724 | + (($cont->is_manager == 1) && ($is_manager == 1))) | |
725 | + <li class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200 {{ Request::routeIs('admin.faq.list') ? 'dark:text-gray-100' : null }}"> | |
726 | + <a class="w-full" href="{{ route('admin.faq.list') }}">FAQ</a> | |
727 | + </li> | |
728 | + @endif | |
729 | + @endif | |
730 | + | |
722 | 731 | @endforeach |
723 | 732 | </ul> |
724 | 733 | </template> |
... | ... | @@ -1383,7 +1392,16 @@ |
1383 | 1392 | @if ((($cont->is_admin == 1) && ($admin == 1)) || |
1384 | 1393 | (($cont->is_manager == 1) && ($is_manager == 1))) |
1385 | 1394 | <li class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200 {{ Request::routeIs('admin.employers-main') ? 'dark:text-gray-100' : null }}"> |
1386 | - <a class="w-full" href="{{ route('admin.employers-main') }}">Работодатели на главной</a> | |
1395 | + <a class="w-full" href="{{ route('admin.employers-main') }}">Работодатели на главной11</a> | |
1396 | + </li> | |
1397 | + @endif | |
1398 | + @endif | |
1399 | + | |
1400 | + @if ($cont->url_page == "faq/list") | |
1401 | + @if ((($cont->is_admin == 1) && ($admin == 1)) || | |
1402 | + (($cont->is_manager == 1) && ($is_manager == 1))) | |
1403 | + <li class="px-2 py-1 transition-colors duration-150 hover:text-gray-800 dark:hover:text-gray-200 {{ Request::routeIs('admin.faq.list') ? 'dark:text-gray-100' : null }}"> | |
1404 | + <a class="w-full" href="{{ route('admin.faq.list') }}">FAQ</a> | |
1387 | 1405 | </li> |
1388 | 1406 | @endif |
1389 | 1407 | @endif |
routes/web.php
... | ... | @@ -17,6 +17,7 @@ use App\Http\Controllers\Auth\ForgotPasswordController; |
17 | 17 | use App\Http\Controllers\Auth\LoginController; |
18 | 18 | use App\Http\Controllers\Auth\RegisterController; |
19 | 19 | use App\Http\Controllers\CKEditorController; |
20 | +use App\Http\Controllers\FaqController; | |
20 | 21 | use App\Http\Controllers\MediaController; |
21 | 22 | use App\Http\Controllers\WorkerController; |
22 | 23 | use App\Models\Ad_jobs; |
... | ... | @@ -404,6 +405,17 @@ Route::group([ |
404 | 405 | Route::get('logs', function() { |
405 | 406 | $files = Storage::files('logs/laravel.log'); |
406 | 407 | })->name('logs'); |
408 | + | |
409 | + Route::prefix('faq')->as('faq.')->group(function () { | |
410 | + Route::middleware('admin')->group(function () { | |
411 | + Route::get('/', [FaqController::class, 'showListForAdmin'])->name('list'); | |
412 | + Route::get('/create', [FaqController::class, 'create'])->name('create'); | |
413 | + Route::post('/create', [FaqController::class, 'store'])->name('store'); | |
414 | + Route::get('/edit/{id}', [FaqController::class, 'edit'])->name('edit'); | |
415 | + Route::put('/edit/{id}', [FaqController::class, 'update'])->name('update'); | |
416 | + Route::get('/destroy/{id}', [FaqController::class, 'destroy'])->name('destroy'); | |
417 | + }); | |
418 | + }); | |
407 | 419 | }); |
408 | 420 | |
409 | 421 | // Инструментальные страницы |
... | ... | @@ -639,8 +651,8 @@ Route::group([ |
639 | 651 | Route::get('cabinet/send-all-messages', [EmployerController::class, 'send_all_messages'])->name('send_all_messages'); |
640 | 652 | Route::post('cabinet/send-all-messages/send', [EmployerController::class, 'send_all_post'])->name('send_all_post'); |
641 | 653 | |
642 | - // 10 страница FAQ вопросы | |
643 | - Route::get('cabinet/faq', [EmployerController::class, 'faq'])->name('faq'); | |
654 | + // 10 страница FAQ вопрос | |
655 | + Route::get('cabinet/faq', [FaqController::class, 'showListForUser'])->name('faq'); | |
644 | 656 | |
645 | 657 | // 11 страница - Настройка уведомлений |
646 | 658 | Route::get('cabinet/subscribe', [EmployerController::class, 'subscribe'])->name('subscribe'); |