| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- <?php
- namespace App\Http\Controllers\Admin;
- /*
- * SettingAdminController — настройки сайта в административной панели.
- *
- * Маршруты: GET /admin/settings (форма), POST /admin/settings (сохранение)
- * Хранит: контакты, соцсети, копирайт, слоган, логотипы,
- * Яндекс.Метрика, Google Analytics, Open Graph.
- * Логотипы/OG-изображение загружаются как файлы, путь сохраняется в settings.
- * После сохранения сбрасывается кеш настроек.
- */
- use App\Http\Controllers\Controller;
- use App\Models\Setting;
- use Illuminate\Http\RedirectResponse;
- use Illuminate\Http\Request;
- use Illuminate\View\View;
- class SettingAdminController extends Controller
- {
- private const TEXT_KEYS = [
- // Контакты
- 'phone', 'email', 'working_hours',
- // Соцсети
- 'telegram', 'youtube', 'vk',
- // Подвал
- 'footer_slogan', 'copyright',
- // Аналитика
- 'yandex_metrika', 'google_analytics',
- // Open Graph
- 'og_site_name', 'og_description', 'og_locale',
- // Режим сайта (хранятся как '1'/'0')
- 'site_maintenance', 'site_noindex',
- ];
- private const LOGO_KEYS = ['logo_header', 'logo_footer'];
- public function index(): View
- {
- $settings = Setting::all();
- return view('admin.settings.index', compact('settings'));
- }
- public function update(Request $request): RedirectResponse
- {
- $request->validate([
- 'phone' => 'nullable|string|max:30',
- 'email' => 'nullable|email|max:100',
- 'telegram' => 'nullable|url|max:255',
- 'youtube' => 'nullable|url|max:255',
- 'vk' => 'nullable|url|max:255',
- 'footer_slogan' => 'nullable|string|max:255',
- 'copyright' => 'nullable|string|max:255',
- 'working_hours' => 'nullable|string|max:500',
- // Аналитика
- 'yandex_metrika' => 'nullable|digits_between:6,12',
- 'google_analytics' => 'nullable|string|max:30',
- // Open Graph
- 'og_site_name' => 'nullable|string|max:100',
- 'og_description' => 'nullable|string|max:300',
- 'og_locale' => 'nullable|string|max:10',
- // Режим сайта
- 'site_maintenance' => 'nullable|in:0,1',
- 'site_noindex' => 'nullable|in:0,1',
- // Файлы
- 'logo_header' => 'nullable|image|mimes:png,jpg,svg,webp|max:512',
- 'logo_footer' => 'nullable|image|mimes:png,jpg,svg,webp|max:512',
- 'og_image' => 'nullable|image|mimes:jpg,jpeg,png,webp|max:2048',
- ]);
- // Сохраняем текстовые поля
- foreach (self::TEXT_KEYS as $key) {
- Setting::set($key, $request->input($key));
- }
- // Загружаем логотипы — заменяем файл и сохраняем путь в settings
- foreach (self::LOGO_KEYS as $key) {
- if ($request->hasFile($key) && $request->file($key)->isValid()) {
- $ext = $request->file($key)->getClientOriginalExtension();
- $filename = $key.'.'.$ext;
- $request->file($key)->move(public_path('images/logos'), $filename);
- Setting::set($key, 'images/logos/'.$filename);
- }
- }
- // OG-изображение: 1200×630, сохраняется в public/images/og/
- if ($request->hasFile('og_image') && $request->file('og_image')->isValid()) {
- $ext = $request->file('og_image')->getClientOriginalExtension();
- $request->file('og_image')->move(public_path('images/og'), 'og_image.'.$ext);
- Setting::set('og_image', 'images/og/og_image.'.$ext);
- }
- return redirect()->route('admin.settings.index')
- ->with('success', 'Настройки сохранены.');
- }
- }
|