| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272 |
- {{--
- Вьюха: Настройки сайта — все секции сворачиваемые через AdminLTE card-widget="collapse"
- Partials (в admin/settings/partials/):
- _card_analytics — Яндекс.Метрика и Google Analytics
- _card_og — Open Graph метатеги
- _card_logos — Логотипы шапки и подвала + кнопка сохранения
- _card_site_mode — Режим сайта (обслуживание + noindex)
- --}}
- @extends('admin.layout')
- @section('title', 'Настройки сайта')
- @section('content_header')
- <h1 class="m-0">Настройки сайта</h1>
- @stop
- @section('breadcrumb')
- <li class="breadcrumb-item"><a href="{{ route('admin.dashboard') }}">Главная</a></li>
- <li class="breadcrumb-item active">Настройки</li>
- @stop
- @section('content')
- @if(session('success'))
- <div class="alert alert-success alert-dismissible">
- <button type="button" class="close" data-dismiss="alert">×</button>
- {{ session('success') }}
- </div>
- @endif
- <form action="{{ route('admin.settings.update') }}" method="POST" enctype="multipart/form-data">
- @csrf
- <div class="row">
- {{-- Левая колонка --}}
- <div class="col-md-8">
- {{-- Контакты --}}
- <div class="card card-primary card-outline">
- <div class="card-header">
- <h3 class="card-title">Контакты</h3>
- <div class="card-tools">
- <button type="button" class="btn btn-tool" data-card-widget="collapse"><i class="fas fa-minus"></i></button>
- </div>
- </div>
- <div class="card-body">
- <div class="form-group">
- <label>Номер телефона</label>
- <div class="input-group">
- <div class="input-group-prepend"><span class="input-group-text"><i class="fas fa-phone"></i></span></div>
- <input type="tel" name="phone" class="form-control @error('phone') is-invalid @enderror"
- value="{{ old('phone', $settings['phone'] ?? '') }}" placeholder="+7 (___) ___-__-__">
- </div>
- @error('phone')<div class="text-danger small mt-1">{{ $message }}</div>@enderror
- </div>
- <div class="form-group">
- <label>Email</label>
- <div class="input-group">
- <div class="input-group-prepend"><span class="input-group-text"><i class="fas fa-envelope"></i></span></div>
- <input type="email" name="email" class="form-control @error('email') is-invalid @enderror"
- value="{{ old('email', $settings['email'] ?? '') }}" placeholder="info@example.ru">
- </div>
- @error('email')<div class="text-danger small mt-1">{{ $message }}</div>@enderror
- </div>
- <div class="form-group mb-0">
- <label>Режим работы</label>
- <div class="input-group">
- <div class="input-group-prepend"><span class="input-group-text"><i class="fas fa-clock"></i></span></div>
- <input type="text" name="working_hours" class="form-control @error('working_hours') is-invalid @enderror"
- value="{{ old('working_hours', $settings['working_hours'] ?? '') }}"
- placeholder="Пн–Пт: 9:00 – 20:00 | Сб–Вс: 10:00 – 18:00">
- </div>
- <small class="text-muted">Разделитель строк: | (вертикальная черта)</small>
- @error('working_hours')<div class="text-danger small mt-1">{{ $message }}</div>@enderror
- </div>
- </div>
- </div>
- {{-- Социальные сети --}}
- <div class="card card-secondary card-outline">
- <div class="card-header">
- <h3 class="card-title">Социальные сети</h3>
- <div class="card-tools">
- <button type="button" class="btn btn-tool" data-card-widget="collapse"><i class="fas fa-minus"></i></button>
- </div>
- </div>
- <div class="card-body">
- <div class="form-group">
- <label>Telegram</label>
- <div class="input-group">
- <div class="input-group-prepend"><span class="input-group-text" style="background:#229ED9;color:#fff;border-color:#229ED9">TG</span></div>
- <input type="url" name="telegram" class="form-control @error('telegram') is-invalid @enderror"
- value="{{ old('telegram', $settings['telegram'] ?? '') }}" placeholder="https://t.me/your_channel">
- </div>
- @error('telegram')<div class="text-danger small mt-1">{{ $message }}</div>@enderror
- </div>
- <div class="form-group">
- <label>YouTube</label>
- <div class="input-group">
- <div class="input-group-prepend"><span class="input-group-text" style="background:#FF0000;color:#fff;border-color:#FF0000">YT</span></div>
- <input type="url" name="youtube" class="form-control @error('youtube') is-invalid @enderror"
- value="{{ old('youtube', $settings['youtube'] ?? '') }}" placeholder="https://youtube.com/@channel">
- </div>
- @error('youtube')<div class="text-danger small mt-1">{{ $message }}</div>@enderror
- </div>
- <div class="form-group mb-0">
- <label>ВКонтакте</label>
- <div class="input-group">
- <div class="input-group-prepend"><span class="input-group-text" style="background:#0077FF;color:#fff;border-color:#0077FF">ВК</span></div>
- <input type="url" name="vk" class="form-control @error('vk') is-invalid @enderror"
- value="{{ old('vk', $settings['vk'] ?? '') }}" placeholder="https://vk.com/your_group">
- </div>
- @error('vk')<div class="text-danger small mt-1">{{ $message }}</div>@enderror
- </div>
- </div>
- </div>
- {{-- Подвал --}}
- <div class="card card-secondary card-outline">
- <div class="card-header">
- <h3 class="card-title">Подвал сайта</h3>
- <div class="card-tools">
- <button type="button" class="btn btn-tool" data-card-widget="collapse"><i class="fas fa-minus"></i></button>
- </div>
- </div>
- <div class="card-body">
- <div class="form-group">
- <label>Слоган под логотипом в подвале</label>
- <input type="text" name="footer_slogan" class="form-control @error('footer_slogan') is-invalid @enderror"
- value="{{ old('footer_slogan', $settings['footer_slogan'] ?? '') }}"
- placeholder="Автоподбор по России и доставка авто из любой страны под ключ.">
- @error('footer_slogan')<div class="text-danger small mt-1">{{ $message }}</div>@enderror
- </div>
- <div class="form-group mb-0">
- <label>Копирайт (строка внизу страницы)</label>
- <input type="text" name="copyright" class="form-control @error('copyright') is-invalid @enderror"
- value="{{ old('copyright', $settings['copyright'] ?? '') }}"
- placeholder="© 2025 Компания. Все права защищены.">
- @error('copyright')<div class="text-danger small mt-1">{{ $message }}</div>@enderror
- </div>
- </div>
- </div>
- @include('admin.settings.partials._card_analytics')
- @include('admin.settings.partials._card_og')
- @include('admin.settings.partials._card_logos')
- </div>
- {{-- Правая колонка --}}
- <div class="col-md-4">
- @include('admin.settings.partials._card_site_mode')
- <div class="card card-secondary card-outline">
- <div class="card-header">
- <h3 class="card-title">Где используются</h3>
- <div class="card-tools">
- <button type="button" class="btn btn-tool" data-card-widget="collapse"><i class="fas fa-minus"></i></button>
- </div>
- </div>
- <div class="card-body text-muted" style="font-size:13px;line-height:1.9">
- <p><strong>Телефон</strong> — topbar, кнопка «Позвонить», подвал, контакты</p>
- <p><strong>Email</strong> — topbar, подвал, контакты</p>
- <p><strong>Telegram</strong> — кнопка в шапке, подвал, плавающая кнопка, контакты</p>
- <p><strong>YouTube / ВК</strong> — topbar, подвал</p>
- <p><strong>Режим работы</strong> — страница контактов</p>
- <p><strong>Слоган / Копирайт</strong> — подвал сайта</p>
- <p><strong>Логотипы</strong> — шапка и подвал</p>
- <hr>
- <p><strong>Яндекс.Метрика / GA</strong> — <head> всех страниц</p>
- <p><strong>OG-изображение</strong> — превью в соцсетях (если нет фото авто)</p>
- <hr>
- <p><strong>Обслуживание</strong> — заглушка для гостей и редакторов</p>
- <p><strong>Noindex</strong> — запрет индексации поисковиками</p>
- <p><strong>Анимации</strong> — class="no-animations" на <body>, reveal-блоки видны сразу</p>
- <hr>
- <p class="mb-0 text-info">
- <i class="fas fa-info-circle"></i>
- Незаполненные поля скрываются на сайте автоматически.
- </p>
- </div>
- </div>
- </div>
- </div>
- </form>
- @stop
- @push('js')
- <script>
- // ── Аккордеон карточек настроек (только левая колонка) ──────────────────────
- $(function () {
- // Все карточки левой колонки у которых есть кнопка сворачивания
- var $cards = $('.col-md-8 [data-card-widget="collapse"]').closest('.card');
- // Сворачиваем все кроме первой (без анимации — чтобы не мигало при загрузке)
- $cards.each(function (i) {
- if (i > 0) {
- $(this).addClass('collapsed-card');
- $(this).find('[data-card-widget="collapse"] i')
- .removeClass('fa-minus').addClass('fa-plus');
- $(this).find('.card-body, .card-footer').hide();
- }
- });
- // При разворачивании карточки — сворачиваем все остальные в колонке
- $(document).on('expanded.lte.cardwidget', '.col-md-8 .card', function () {
- var $opened = $(this);
- $cards.each(function () {
- if (!$(this).is($opened) && !$(this).hasClass('collapsed-card')) {
- $(this).find('[data-card-widget="collapse"]').trigger('click');
- }
- });
- });
- });
- // Счётчик символов в поле og_description
- (function () {
- var ta = document.querySelector('textarea[name=og_description]');
- var counter = document.getElementById('og-desc-count');
- if (!ta || !counter) return;
- ta.addEventListener('input', function () {
- var len = this.value.length;
- counter.textContent = len + '/300';
- counter.className = len > 200 ? 'text-warning' : 'text-muted';
- });
- })();
- // Показываем имя выбранного файла в custom-file-input
- document.querySelectorAll('.custom-file-input').forEach(function(input) {
- input.addEventListener('change', function() {
- var label = this.nextElementSibling;
- label.textContent = this.files[0] ? this.files[0].name : 'Выбрать файл';
- });
- });
- // Маска телефона
- (function () {
- var el = document.querySelector('input[name=phone]');
- if (!el) return;
- el.setAttribute('maxlength', '18');
- function fmt(d) {
- var out = '+7';
- if (d.length > 0) out += ' (' + d.slice(0, 3);
- if (d.length >= 3) out += ')';
- if (d.length > 3) out += ' ' + d.slice(3, 6);
- if (d.length > 6) out += '-' + d.slice(6, 8);
- if (d.length > 8) out += '-' + d.slice(8, 10);
- return out;
- }
- function digits() { return el.value.replace(/\D/g, '').replace(/^[78]/, ''); }
- el.addEventListener('focus', function () { if (!this.value) this.value = '+7'; });
- el.addEventListener('blur', function () { if (digits().length === 0) this.value = ''; });
- el.addEventListener('keydown', function (e) {
- if (e.ctrlKey || e.metaKey) return;
- if (['Tab','Enter','ArrowLeft','ArrowRight','Home','End'].includes(e.key)) return;
- e.preventDefault();
- var d = digits();
- if (e.key === 'Backspace') { d = d.slice(0, -1); }
- else if (/^\d$/.test(e.key) && d.length < 10) { d += e.key; }
- else { return; }
- this.value = fmt(d);
- });
- el.addEventListener('paste', function (e) {
- e.preventDefault();
- var text = (e.clipboardData || window.clipboardData).getData('text');
- var d = (digits() + text.replace(/\D/g, '').replace(/^[78]/, '')).slice(0, 10);
- this.value = fmt(d);
- });
- })();
- </script>
- @endpush
|