Skip to content

Commit 532291c

Browse files
authored
Added Consultant page (#143)
1 parent c5c95cc commit 532291c

File tree

4 files changed

+351
-0
lines changed

4 files changed

+351
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
3+
namespace App\Http\Controllers;
4+
5+
use Illuminate\Http\RedirectResponse;
6+
use Illuminate\Http\Request;
7+
use NotificationChannels\Telegram\TelegramMessage;
8+
use Orchid\Support\Facades\Toast;
9+
10+
class ConsultantController extends Controller
11+
{
12+
/**
13+
* @return \Illuminate\Contracts\View\View
14+
*/
15+
public function index()
16+
{
17+
return view('pages.consultants');
18+
}
19+
20+
/**
21+
* @param \Illuminate\Http\Request $request
22+
*
23+
* @return \Illuminate\Http\RedirectResponse
24+
*/
25+
public function store(Request $request): RedirectResponse
26+
{
27+
$request->validate([
28+
'name' => 'required|string|min:2',
29+
'contact' => 'required|string|min:2',
30+
'message' => 'required|string|min:10',
31+
]);
32+
33+
TelegramMessage::create()
34+
->to(config('services.telegram-bot-api.chat_id'))
35+
->line('*🛟 Запрос на консультацию*')
36+
->line('`')
37+
->escapedLine($request->input('name'))
38+
->escapedLine($request->input('contact'))
39+
->line('`')
40+
->line('`')
41+
->escapedLine($request->input('message'))
42+
->line('`')
43+
->send();
44+
45+
Toast::success('Отлично! Постараемся подобрать лучшего специалиста который свяжется как можно быстрее.')
46+
->disableAutoHide();
47+
48+
return redirect()->route('consultants');
49+
}
50+
}

resources/views/components/call-to-action.blade.php

+3
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@
66

77

88
<div class="col-lg-7">
9+
@isset($sup)
10+
<span class="text-primary mb-3 d-block text-uppercase fw-semibold ls-xl">{{ $sup }}</span>
11+
@endisset
912
<p class="display-6 fw-bold text-balance">{!! $title !!}</p>
1013
<p class="mb-lg-0 text-balance">
1114
{!! $description !!}
+282
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,282 @@
1+
@extends('layout')
2+
@section('title', 'Консультации Laravel')
3+
@section('description', 'Каждое изменение должно приносить результат. Консультации помогут вам определить, как это достичь.')
4+
5+
@section('content')
6+
<x-header image="/img/bird.svg">
7+
<x-slot name="sup">
8+
Ребята мирового класса
9+
</x-slot>
10+
11+
<x-slot name="title">
12+
Консультанты для вашего проекта
13+
</x-slot>
14+
15+
<x-slot name="description">
16+
Каждое изменение должно приносить результат. Консультации помогут вам определить, как это достичь.
17+
</x-slot>
18+
19+
<x-slot:actions>
20+
<a href="{{ route('docs') }}" class="btn btn-primary btn-lg px-4">Справлюсь сам</a>
21+
22+
<a href="#"
23+
class="d-none d-md-inline-flex link-body-emphasis text-decoration-none icon-link icon-link-hover">
24+
Хорошие практики <x-icon path="i.arrow-right" class="bi" />
25+
</a>
26+
</x-slot>
27+
</x-header>
28+
29+
<x-container>
30+
<div class="row g-4 row-cols-md-2 mb-5 text-balance">
31+
<div class="col">
32+
<div class="p-4 p-xl-5 bg-body-secondary rounded-3 position-relative mb-4 h-100">
33+
<div class="d-flex flex-column g-4 g-md-5">
34+
<div class="d-flex mb-4 align-items-center gap-5">
35+
<h3 class="display-6 fw-semibold mb-0 text-balance">Застряли на проблеме?</h3>
36+
<div class="d-none d-sm-flex">
37+
<x-icon path="i.code" class="img-fluid d-block mx-auto text-primary" width="4rem"
38+
height="4rem"/>
39+
</div>
40+
</div>
41+
<p class="col-md-10">
42+
Специалисты предлагают свежий взгляд, который поможет вам разобраться.
43+
</p>
44+
</div>
45+
</div>
46+
</div>
47+
<div class="col">
48+
<div class="p-4 p-xl-5 bg-body-secondary rounded-3 position-relative mb-4 h-100">
49+
<div class="d-flex flex-column g-4 g-md-5">
50+
<div class="d-flex mb-4 align-items-center gap-5">
51+
<h3 class="display-6 fw-semibold mb-0 text-balance">Погружение в код</h3>
52+
<div class="d-none d-sm-flex">
53+
<x-icon path="i.code" class="img-fluid d-block mx-auto text-primary" width="4rem"
54+
height="4rem"/>
55+
</div>
56+
</div>
57+
<p class="col-md-10">
58+
Давайте вместе рассмотрим ваш код, чтобы убедиться, что он максимально хорош.
59+
</p>
60+
</div>
61+
</div>
62+
</div>
63+
<div class="col">
64+
<div class="p-4 p-xl-5 bg-body-secondary rounded-3 position-relative mb-4 h-100">
65+
66+
<div class="d-flex flex-column g-4 g-md-5">
67+
68+
<div class="d-flex mb-4 align-items-center gap-5">
69+
<h3 class="display-6 fw-semibold mb-0 text-balance">Разбор архитектуры</h3>
70+
<div class="d-none d-sm-flex">
71+
<x-icon path="i.ui" class="img-fluid d-block mx-auto text-primary" width="4rem"
72+
height="4rem"/>
73+
</div>
74+
</div>
75+
<p class="col-md-10">
76+
Мы обсудим, как правильно структурировать ваше приложение для достижения успеха.
77+
</p>
78+
</div>
79+
</div>
80+
</div>
81+
<div class="col">
82+
<div class="p-4 p-xl-5 bg-body-secondary rounded-3 position-relative mb-4 h-100">
83+
<div class="d-flex flex-column g-4 g-md-5">
84+
85+
<div class="d-flex mb-4 align-items-center gap-5">
86+
<h3 class="display-6 fw-semibold mb-0 text-balance">Лучшие практики</h3>
87+
<div class="d-none d-sm-flex">
88+
<x-icon path="i.utilities" class="img-fluid d-block mx-auto text-primary" width="4rem"
89+
height="4rem"/>
90+
</div>
91+
</div>
92+
<p class="col-md-10">
93+
Мы поговорим о новейших передовых практиках, которые помогут вашему проекту не сбиться с пути.
94+
</p>
95+
</div>
96+
</div>
97+
</div>
98+
</div>
99+
100+
101+
{{--
102+
<div class="row g-4 row-cols-md-2 row-cols-xxl-3">
103+
<div class="col">
104+
<div class="h-100 d-flex flex-md-row flex-column px-4 py-3 py-xl-5 bg-body-secondary rounded position-relative align-items-md-center align-items-xxl-baseline">
105+
<div>
106+
<p class="fs-4">Застряли на ошибке?</p>
107+
108+
<p class="text-body-secondary mb-0">Специалисты предлагают свежий взгляд, который поможет вам разобраться.</p>
109+
</div>
110+
</div>
111+
</div>
112+
<div class="col">
113+
<div class="h-100 d-flex flex-md-row flex-column px-4 py-3 py-xl-5 bg-body-secondary rounded position-relative align-items-md-center align-items-xxl-baseline">
114+
<div>
115+
<p class="fs-4">Обзор вашего кода</p>
116+
117+
<p class="text-body-secondary mb-0">Давайте вместе рассмотрим ваш код, чтобы убедиться, что он максимально хорош.</p>
118+
</div>
119+
</div>
120+
</div>
121+
<div class="col">
122+
<div class="h-100 d-flex flex-md-row flex-column px-4 py-3 py-xl-5 bg-body-secondary rounded position-relative align-items-md-center align-items-xxl-baseline">
123+
<div>
124+
<p class="fs-4">Разбор архитектуры</p>
125+
126+
<p class="text-body-secondary mb-0">Мы обсудим, как правильно структурировать ваше приложение для достижения успеха.</p>
127+
</div>
128+
</div>
129+
</div>
130+
<div class="col">
131+
<div class="h-100 d-flex flex-md-row flex-column px-4 py-3 py-xl-5 bg-body-secondary rounded position-relative align-items-md-center align-items-xxl-baseline">
132+
<div>
133+
<p class="fs-4">Оптимизация кода</p>
134+
135+
<p class="text-body-secondary mb-0">Я покажу вам, как заставить ваш код работать быстрее и плавнее.</p>
136+
</div>
137+
</div>
138+
</div>
139+
<div class="col">
140+
<div class="h-100 d-flex flex-md-row flex-column px-4 py-3 py-xl-5 bg-body-secondary rounded position-relative align-items-md-center align-items-xxl-baseline">
141+
<div>
142+
<p class="fs-4">Рекомендации по инструментам и пакетам</p>
143+
144+
<p class="text-body-secondary mb-0">Я могу порекомендовать инструменты и пакеты для более быстрого достижения ваших целей.</p>
145+
</div>
146+
</div>
147+
</div>
148+
<div class="col">
149+
<div class="h-100 d-flex flex-md-row flex-column px-4 py-3 py-xl-5 bg-body-secondary rounded position-relative align-items-md-center align-items-xxl-baseline">
150+
<div>
151+
<p class="fs-4">Обсуждение лучших практик</p>
152+
153+
<p class="text-body-secondary mb-0">Мы поговорим о новейших передовых практиках, которые помогут вашему проекту не сбиться с пути.</p>
154+
</div>
155+
</div>
156+
</div>
157+
158+
{{--
159+
<div class="col">
160+
<div class="h-100 d-flex flex-md-row flex-column px-4 py-3 py-xl-5 bg-body-secondary rounded position-relative align-items-md-center">
161+
<div class="vr bg-primary position-absolute start-0 opacity-100" style="top: 1.5em; bottom: 1.5em;"></div>
162+
<div>
163+
<div class="d-flex align-items-center mb-3">
164+
<p class="fs-4 mb-0">Веб приложение</p>
165+
</div>
166+
167+
<img src="/img/ui/api.svg" class="img-fluid d-block mx-auto">
168+
</div>
169+
</div>
170+
</div>
171+
<div class="col">
172+
<div class="h-100 d-flex flex-md-row flex-column px-4 py-3 py-xl-5 bg-body-secondary rounded position-relative align-items-md-center">
173+
<div class="vr bg-primary position-absolute start-0 opacity-100" style="top: 1.5em; bottom: 1.5em;"></div>
174+
<div>
175+
<div class="d-flex align-items-center mb-3">
176+
<p class="fs-4 mb-0">Веб приложение</p>
177+
</div>
178+
<img src="/img/ui/console.svg" class="img-fluid d-block mx-auto">
179+
</div>
180+
</div>
181+
</div>
182+
183+
</div>
184+
--}}
185+
</x-container>
186+
187+
<x-container>
188+
<section class="p-4 p-xl-5 bg-body-secondary rounded position-relative">
189+
<figure class="position-absolute top-0 start-0 translate-middle z-n1 ms-4">
190+
<x-icon path="l.cube" width="46" height="53" fill="none"/>
191+
</figure>
192+
193+
<div class="row">
194+
<div class="col-lg-11 mx-auto col-md-12">
195+
<div class="row align-items-center g-5">
196+
<div class="col-lg-6 col-12 order-2">
197+
<div class="me-xl-7">
198+
<div class="mb-4">
199+
<span class="text-primary mb-3 d-block text-uppercase fw-semibold ls-xl">Мы знаем</span>
200+
<p class="display-6 fw-bold text-balance">Потребности и способы решения</p>
201+
202+
</div>
203+
<div class="mb-5">
204+
<ul>
205+
<li class="mb-3">
206+
Чем больше вы погружаетесь в код, тем сложнее заметить проблемы. Взгляд со
207+
стороны может принести новые идеи и перспективы, которые изменят вашу игру.
208+
</li>
209+
<li class="mb-3">
210+
Отдавайте часть ответственности за код сообществу открытого исходного кода,
211+
так вы сможете достигать больших результатов с меньшим объемом работы.
212+
</li>
213+
</ul>
214+
</div>
215+
216+
<div class="row align-items-center company-usage">
217+
<div class="col-lg-6 col-md-6 col-6">
218+
<img src="./img/sponsors/am.svg"
219+
alt="logo" class="img-fluid" />
220+
</div>
221+
<div class="col-lg-6 col-md-6 col-6">
222+
<img src="/img/sponsors/soidet.svg"
223+
alt="logo" class="img-fluid" />
224+
</div>
225+
</div>
226+
227+
</div>
228+
</div>
229+
<div class="col-lg-6 col-12 order-lg-2">
230+
<div class="bg-body-tertiary p-4 p-xxl-5 shadow-sm rounded">
231+
<form class="row needs-validation g-3"
232+
method="post"
233+
action="{{ route('consultant.store') }}">
234+
<div class="col-12">
235+
<label for="name" class="form-label">
236+
Как вас зовут?
237+
</label>
238+
<input type="text"
239+
placeholder="По имени всегда приятно"
240+
class="form-control {{ $errors->has('name') ? 'is-invalid' : '' }}"
241+
name="name"
242+
id="name"
243+
required />
244+
<x-error field="name" class="invalid-feedback my-3"/>
245+
</div>
246+
<div class="col-md-12">
247+
<label for="contact"
248+
class="form-label">
249+
Как связаться?
250+
</label>
251+
<input type="text"
252+
placeholder="Телеграм или email для связи"
253+
class="form-control {{ $errors->has('contact') ? 'is-invalid' : '' }}"
254+
name="contact"
255+
id="contact"
256+
required />
257+
<x-error field="contact" class="invalid-feedback my-3"/>
258+
</div>
259+
<div class="col-md-12">
260+
<label for="message"
261+
class="form-label">Тема</label>
262+
<textarea class="form-control {{ $errors->has('message') ? 'is-invalid' : '' }}"
263+
id="message"
264+
name="message"
265+
minlength="10"
266+
placeholder="Расскажите какую проблему вы хотели бы решить, так мы сможем подобрать лучшего специалиста."
267+
rows="8" required></textarea>
268+
<x-error field="message" class="invalid-feedback my-3"/>
269+
</div>
270+
<div class="d-grid">
271+
<button class="btn btn-primary"
272+
type="submit">Получить консультацию</button>
273+
</div>
274+
</form>
275+
</div>
276+
</div>
277+
</div>
278+
</div>
279+
</div>
280+
</section>
281+
</x-container>
282+
@endsection

routes/web.php

+16
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,22 @@
170170
->can('delete', 'position')
171171
->name('position.delete');
172172
});
173+
174+
/*
175+
|--------------------------------------------------------------------------
176+
| Consultants
177+
|--------------------------------------------------------------------------
178+
|
179+
| ...
180+
|
181+
*/
182+
183+
Route::get('/consultants', [\App\Http\Controllers\ConsultantController::class, 'index'])
184+
->name('consultants');
185+
186+
Route::post('/consultants/store', [\App\Http\Controllers\ConsultantController::class, 'store'])
187+
->name('consultant.store');
188+
173189
/*
174190
|--------------------------------------------------------------------------
175191
| Comments Routes

0 commit comments

Comments
 (0)