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 @@ -