Files
admin/app/Http/Controllers/SeoSettingController.php
Husanjonazamov e0f1989655 classify admin
2026-02-24 12:52:01 +05:00

240 lines
8.5 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\SeoSetting;
use App\Models\SeoSettingsTranslation;
use App\Services\BootstrapTableService;
use App\Services\FileService;
use App\Services\ResponseService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Throwable;
class SeoSettingController extends Controller
{
private string $uploadFolder;
public function __construct() {
$this->uploadFolder = "seo-setting";
}
/**
* Display a listing of the resource.
*/
public function index()
{
//
}
/**
* Show the form for creating a new resource.
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*/
public function store(Request $request)
{
$validator = Validator::make(
$request->all(),
[
'page' => 'required|unique:seo_settings,page',
'title.1' => 'required|string',
'description.1' => 'required|string',
'keywords.1' => 'nullable|string',
'image' => 'nullable|mimes:jpeg,png,jpg,svg|max:7168',
'languages' => 'required|array',
'languages.*' => 'exists:languages,id',
],
[
'page.unique' => 'This page already has SEO settings.',
'title.1.required' => 'The English title field is required.',
'description.1.required' => 'The English description field is required.',
]
);
if ($validator->fails()) {
return ResponseService::validationError($validator->errors()->first());
}
try {
$data = $request->all();
// Handle image upload
if ($request->hasFile('image')) {
$data['image'] = FileService::upload($request->file('image'), $this->uploadFolder);
}
// Store main SEO setting (language_id = 1)
$seoSetting = SeoSetting::create([
'page' => $data['page'],
'title' => $data['title'][1],
'description' => $data['description'][1],
'keywords' => $data['keywords'][1] ?? null,
'image' => $data['image'] ?? null,
]);
// Store translations for other languages
foreach ($data['languages'] as $langId) {
if ($langId == 1) continue; // Skip default language
$title = $data['title'][$langId] ?? null;
$description = $data['description'][$langId] ?? null;
$keywords = $data['keywords'][$langId] ?? null;
// Skip empty translations
if (empty($title) && empty($description) && empty($keywords)) {
continue;
}
SeoSettingsTranslation::create([
'seo_setting_id' => $seoSetting->id,
'language_id' => $langId,
'title' => $title,
'description' => $description,
'keywords' => $keywords,
]);
}
return ResponseService::successResponse('SEO Setting Successfully Added');
} catch (Throwable $th) {
ResponseService::logErrorRedirect($th, "SeoSetting Controller -> Store");
return ResponseService::errorResponse('Something Went Wrong');
}
}
/**
* Display the specified resource.
*/
public function show(Request $request)
{
$offset = $request->offset ?? 0;
$limit = $request->limit ?? 10;
$sort = $request->sort ?? 'id';
$order = $request->order ?? 'DESC';
$sql = SeoSetting::with('translations')->orderBy($sort, $order);
if (!empty($_GET['search'])) {
$search = $_GET['search'];
$sql->where('id', 'LIKE', "%$search%")->orwhere('code', 'LIKE', "%$search%")->orwhere('name', 'LIKE', "%$search%");
}
$total = $sql->count();
$sql->skip($offset)->take($limit);
$result = $sql->get();
$bulkData = array();
$bulkData['total'] = $total;
$rows = array();
foreach ($result as $key => $row) {
$tempRow = $row->toArray();
$operate = '';
if ($row->code != "en") {
$operate .= BootstrapTableService::editButton(route('seo-setting.update', $row->id), true);
$operate .= BootstrapTableService::deleteButton(route('seo-setting.destroy', $row->id));
}
$tempRow['operate'] = $operate;
$rows[] = $tempRow;
}
$bulkData['rows'] = $rows;
return response()->json($bulkData);
}
/**
* Show the form for editing the specified resource.
*/
public function edit(string $id)
{
//
}
/**
* Update the specified resource in storage.
*/
public function update(Request $request, $id)
{
$validator = Validator::make(
$request->all(),
[
'title.1' => 'required|string',
'description.1' => 'required|string',
'image' => 'nullable|mimes:jpeg,png,jpg,svg|max:7168',
],
[
'title.1.required' => 'The English title field is required.',
'description.1.required' => 'The English description field is required.',
]
);
if ($validator->fails()) {
return ResponseService::validationError($validator->errors()->first());
}
try {
$seo = SeoSetting::findOrFail($id);
$data = $request->only('page');
if ($request->hasFile('image')) {
$data['image'] = FileService::upload($request->file('image'), $this->uploadFolder);
}
// Save base (main) SEO setting
$seo->update($data);
// Update translation for each language
foreach ($request->input('languages', []) as $langId) {
$translatedTitle = $request->input("title.$langId");
$translatedDescription = $request->input("description.$langId");
$translatedKeywords = $request->input("keywords.$langId");
if ($langId == 1) {
// English (default)
$seo->update([
'title' => $translatedTitle,
'description' => $translatedDescription,
'keywords' => $translatedKeywords,
]);
} else {
$seo->translations()->updateOrCreate(
['language_id' => $langId],
[
'title' => $translatedTitle,
'description' => $translatedDescription,
'keywords' => $translatedKeywords,
]
);
}
}
return ResponseService::successResponse('SEO Setting Updated Successfully');
} catch (Throwable $th) {
return ResponseService::logErrorRedirect($th, "SeoSetting Controller -> Update");
return ResponseService::errorResponse('Something Went Wrong');
}
}
/**
* Remove the specified resource from storage.
*/
public function destroy(string $id)
{
try {
$seo_setting = SeoSetting::findOrFail($id);
$seo_setting->delete();
FileService::delete($seo_setting->getRawOriginal('image'));
ResponseService::successResponse('Seo Setting Deleted successfully');
} catch (Throwable $th) {
ResponseService::logErrorRedirect($th, "Language Controller --> Destroy");
ResponseService::errorResponse('Something Went Wrong');
}
}
}