From 6c834607bd183d14e4afe253f1c1d4eb10421eea Mon Sep 17 00:00:00 2001
From: parsa aghaei
Date: Sun, 3 Nov 2024 16:01:47 +0330
Subject: [PATCH] multilanguage updated
---
.../Controllers/Website/ProjectController.php | 119 ++++++++++++++++++
app/Models/Website/Project.php | 24 ++++
app/Models/Website/ProjectCategory.php | 19 +++
.../Website/ProjectCategoryTranslation.php | 14 +++
app/Models/Website/ProjectTranslation.php | 19 +++
...bsite_projects_and_translations_tables.php | 4 +-
database/seeders/DatabaseSeeder.php | 4 +
database/seeders/ProjectSeeder.php | 18 ---
.../seeders/Website/ProjectCategorySeeder.php | 41 ++++++
database/seeders/Website/ProjectSeeder.php | 46 +++++++
resources/views/welcome.blade.php | 2 +-
routes/api.php | 14 ++-
12 files changed, 299 insertions(+), 25 deletions(-)
create mode 100644 app/Http/Controllers/Website/ProjectController.php
create mode 100644 app/Models/Website/Project.php
create mode 100644 app/Models/Website/ProjectCategory.php
create mode 100644 app/Models/Website/ProjectCategoryTranslation.php
create mode 100644 app/Models/Website/ProjectTranslation.php
delete mode 100644 database/seeders/ProjectSeeder.php
create mode 100644 database/seeders/Website/ProjectCategorySeeder.php
create mode 100644 database/seeders/Website/ProjectSeeder.php
diff --git a/app/Http/Controllers/Website/ProjectController.php b/app/Http/Controllers/Website/ProjectController.php
new file mode 100644
index 0000000..81a4bff
--- /dev/null
+++ b/app/Http/Controllers/Website/ProjectController.php
@@ -0,0 +1,119 @@
+query('per_page', 10); // مقدار پیشفرض ۱۰ در نظر گرفته میشود
+
+ // Retrieve projects with translations and categories
+ $projects = Project::with('translations', 'category.translations')->paginate($perPage);
+ $formattedProjects = $projects->items();
+
+ $formattedProjects = array_map(function ($project) use ($locale) {
+ $translation = $project->translations->firstWhere('locale', $locale);
+ $categoryTranslation = $project->category->translations->firstWhere('locale', $locale);
+
+ return [
+ 'id' => $project->id,
+ 'title' => $translation ? $translation->title : null,
+ 'category' => $categoryTranslation ? $categoryTranslation->title : null,
+ 'images' => [
+ ['src' => $project->image1, 'position' => '1', 'zIndex' => 1],
+ ['src' => $project->image2, 'position' => '2', 'zIndex' => 2],
+ ],
+ 'created_at' => $project->created_at,
+ 'updated_at' => $project->updated_at,
+ ];
+ }, $formattedProjects);
+
+ return response()->json([
+ 'projects' => [
+ 'current_page' => $projects->currentPage(),
+ 'data' => $formattedProjects,
+ 'total' => $projects->total(),
+ 'last_page' => $projects->lastPage(),
+ ],
+ 'categories' => ProjectCategory::all()->map(function ($category) use ($locale) {
+ return [
+ 'id' => $category->id,
+ 'title' => $category->translations->firstWhere('locale', $locale)->title ?? null,
+ 'image' => $category->image,
+ ];
+ }),
+ ]);
+ }
+
+
+ public function store(Request $request)
+ {
+ $project = Project::create($request->only(['category_id', 'image1', 'image2']));
+
+ // ایجاد ترجمهها
+ foreach (['fa', 'en'] as $locale) {
+ $project->translations()->create([
+ 'locale' => $locale,
+ 'title' => $request->input("title_$locale"),
+ 'description' => $request->input("description_$locale"),
+ ]);
+ }
+
+ return response()->json($project->load('translations'), 201);
+ }
+
+ public function show($id)
+ {
+ $project = Project::with('translations', 'category.translations')->findOrFail($id);
+
+ $translation = $project->translations->firstWhere('locale', 'fa');
+ $categoryTranslation = $project->category->translations->firstWhere('locale', 'fa');
+
+ $formattedProject = [
+ 'id' => $project->id,
+ 'title' => $translation ? $translation->title : null,
+ 'category' => $categoryTranslation ? $categoryTranslation->title : null,
+ 'images' => [
+ ['src' => $project->image1, 'position' => '1', 'zIndex' => 1],
+ ['src' => $project->image2, 'position' => '2', 'zIndex' => 2],
+ ],
+ 'created_at' => $project->created_at,
+ 'updated_at' => $project->updated_at,
+ ];
+
+ return response()->json(['project' => $formattedProject]);
+ }
+
+
+ public function update(Request $request, $id)
+ {
+ $project = Project::findOrFail($id);
+ $project->update($request->only(['category_id', 'image1', 'image2']));
+
+ // بهروزرسانی ترجمهها
+ foreach (['fa', 'en'] as $locale) {
+ $project->translations()->updateOrCreate(
+ ['locale' => $locale],
+ [
+ 'title' => $request->input("title_$locale"),
+ 'description' => $request->input("description_$locale"),
+ ]
+ );
+ }
+
+ return response()->json($project->load('translations'));
+ }
+
+ public function destroy($id)
+ {
+ Project::destroy($id);
+ return response()->json(null, 204);
+ }
+}
diff --git a/app/Models/Website/Project.php b/app/Models/Website/Project.php
new file mode 100644
index 0000000..4474481
--- /dev/null
+++ b/app/Models/Website/Project.php
@@ -0,0 +1,24 @@
+hasMany(ProjectTranslation::class, 'project_id');
+ }
+
+ public function category()
+ {
+ return $this->belongsTo(ProjectCategory::class, 'category_id');
+ }
+}
diff --git a/app/Models/Website/ProjectCategory.php b/app/Models/Website/ProjectCategory.php
new file mode 100644
index 0000000..0ce72a8
--- /dev/null
+++ b/app/Models/Website/ProjectCategory.php
@@ -0,0 +1,19 @@
+hasMany(ProjectCategoryTranslation::class, 'category_id');
+ }
+}
diff --git a/app/Models/Website/ProjectCategoryTranslation.php b/app/Models/Website/ProjectCategoryTranslation.php
new file mode 100644
index 0000000..750f2e0
--- /dev/null
+++ b/app/Models/Website/ProjectCategoryTranslation.php
@@ -0,0 +1,14 @@
+belongsTo(Project::class, 'project_id');
+ }
+}
diff --git a/database/migrations/2024_10_23_101857_create_website_projects_and_translations_tables.php b/database/migrations/2024_10_23_101857_create_website_projects_and_translations_tables.php
index fd02387..3a5d9c9 100644
--- a/database/migrations/2024_10_23_101857_create_website_projects_and_translations_tables.php
+++ b/database/migrations/2024_10_23_101857_create_website_projects_and_translations_tables.php
@@ -15,8 +15,8 @@ public function up(): void
Schema::create('website_projects', function (Blueprint $table) {
$table->id();
$table->foreignId('category_id')->constrained('website_project_categories')->onDelete('cascade'); // کلید خارجی به جدول categories
- $table->string('image1'); // عنوان ترجمهشده
- $table->string('image2'); // عنوان ترجمهشده
+ $table->string('image1');
+ $table->string('image2');
$table->timestamps();
});
diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php
index 236b6c3..f047a1b 100644
--- a/database/seeders/DatabaseSeeder.php
+++ b/database/seeders/DatabaseSeeder.php
@@ -5,6 +5,8 @@
use App\Models\User;
use Database\Seeders\Blog\BlogSeeder;
use Database\Seeders\Website\AboutMeSeeder;
+use Database\Seeders\Website\ProjectCategorySeeder;
+use Database\Seeders\Website\ProjectSeeder;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
@@ -22,6 +24,8 @@ public function run(): void
]);
$this->call([
AboutMeSeeder::class,
+ // ProjectSeeder::class,
+ ProjectCategorySeeder::class,
ProjectSeeder::class,
ServiceSeeder::class,
BlogSeeder::class
diff --git a/database/seeders/ProjectSeeder.php b/database/seeders/ProjectSeeder.php
deleted file mode 100644
index aa4652a..0000000
--- a/database/seeders/ProjectSeeder.php
+++ /dev/null
@@ -1,18 +0,0 @@
-count(100)->create();
- }
-}
diff --git a/database/seeders/Website/ProjectCategorySeeder.php b/database/seeders/Website/ProjectCategorySeeder.php
new file mode 100644
index 0000000..6a6fdbd
--- /dev/null
+++ b/database/seeders/Website/ProjectCategorySeeder.php
@@ -0,0 +1,41 @@
+ 'طراحی اپلیکیشن', 'en' => 'App Design'],
+ ['fa' => 'فرانت اند', 'en' => 'Front End'],
+ ['fa' => 'بک اند', 'en' => 'Backend'],
+ ['fa' => 'طراحی وب', 'en' => 'Web Design'],
+ ['fa' => 'طراحی گرافیک', 'en' => 'Graphic Design'],
+ ];
+
+ foreach ($categories as $key => $category) {
+ // ایجاد دستهبندی اصلی
+ $createdCategory = ProjectCategory::create(['image' => 'category' . ($key + 1) . '.jpg']);
+
+ // ایجاد ترجمهها
+ ProjectCategoryTranslation::create([
+ 'category_id' => $createdCategory->id,
+ 'locale' => 'fa',
+ 'title' => $category['fa'],
+ 'description' => 'توضیحات ' . $category['fa'],
+ ]);
+
+ ProjectCategoryTranslation::create([
+ 'category_id' => $createdCategory->id,
+ 'locale' => 'en',
+ 'title' => $category['en'],
+ 'description' => 'Description for ' . $category['en'],
+ ]);
+ }
+ }
+}
diff --git a/database/seeders/Website/ProjectSeeder.php b/database/seeders/Website/ProjectSeeder.php
new file mode 100644
index 0000000..6358ff4
--- /dev/null
+++ b/database/seeders/Website/ProjectSeeder.php
@@ -0,0 +1,46 @@
+ $category->id,
+ 'image1' => 'project' . $i . '_image1.jpg',
+ 'image2' => 'project' . $i . '_image2.jpg'
+ ]);
+
+ // ایجاد ترجمهها
+ ProjectTranslation::create([
+ 'project_id' => $project->id,
+ 'locale' => 'fa',
+ 'title' => 'پروژه ' . $i . ' - ' . $category->translations()->where('locale', 'fa')->first()->title,
+ 'description' => 'توضیحات پروژه ' . $i . ' برای دستهبندی ' . $category->translations()->where('locale', 'fa')->first()->title,
+ ]);
+
+ ProjectTranslation::create([
+ 'project_id' => $project->id,
+ 'locale' => 'en',
+ 'title' => 'Project ' . $i . ' - ' . $category->translations()->where('locale', 'en')->first()->title,
+ 'description' => 'Description for project ' . $i . ' in category ' . $category->translations()->where('locale', 'en')->first()->title,
+ ]);
+ }
+ }
+ }
+}
diff --git a/resources/views/welcome.blade.php b/resources/views/welcome.blade.php
index a9898e3..0608bd8 100644
--- a/resources/views/welcome.blade.php
+++ b/resources/views/welcome.blade.php
@@ -4,7 +4,7 @@
- Laravel
+ Laravel v1
diff --git a/routes/api.php b/routes/api.php
index a5a3fd9..0a5325b 100644
--- a/routes/api.php
+++ b/routes/api.php
@@ -2,27 +2,33 @@
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
-use App\Http\Controllers\ProjectController;
use App\Http\Controllers\Blog\CategoryController;
use App\Http\Controllers\Blog\HomeController;
use App\Http\Controllers\Blog\PostController;
use App\Http\Controllers\Blog\TagController;
-use App\Http\Controllers\SkillController;
+// use App\Http\Controllers\SkillController;
use App\Http\Controllers\Website\ServiceController;
use App\Http\Controllers\Website\AboutMeController;
+use App\Http\Controllers\Website\ProjectController;
Route::get('/user', function (Request $request) {
return $request->user();
})->middleware('auth:sanctum');
-Route::resource('projects', ProjectController::class);
+// Route::resource('projects', ProjectController::class);
-Route::resource('skills', SkillController::class);
Route::apiResource('services', ServiceController::class);
Route::prefix('website')->group(function () {
Route::get('about-me/{id}/translation/{locale}', [AboutMeController::class, 'getTranslation']);
Route::get('services/{locale}', [ServiceController::class, 'index']); // مسیر جدید برای لیست خدمات با ترجمه
Route::get('services/{id}/translation/{locale}', [ServiceController::class, 'showTranslation']);
+ Route::group(['prefix' => 'projects'], function () {
+ Route::get('/translation/{locale}', [ProjectController::class, 'index']);
+ Route::get('/{id}/translation/{locale}', [ProjectController::class, 'show']);
+ Route::post('/', [ProjectController::class, 'store']);
+ Route::put('/{id}', [ProjectController::class, 'update']);
+ Route::delete('/{id}', [ProjectController::class, 'destroy']);
+ });
});
// مسیرهای بلاگ