classify admin
This commit is contained in:
239
app/Http/Controllers/SeoSettingController.php
Normal file
239
app/Http/Controllers/SeoSettingController.php
Normal file
@@ -0,0 +1,239 @@
|
||||
<?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');
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user