Your IP : 216.73.216.79


Current Path : /var/www/html/reddsis/app/Http/Controllers/Backend/
Upload File :
Current File : /var/www/html/reddsis/app/Http/Controllers/Backend/ContentArticleController.php

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use App\Http\Requests\Backend\ContentArticleRequest;
use App\Models\Backend\ContentArticle;
use App\Models\Backend\ContentArticleTranslation;
use App\Models\Backend\FrontendSite;
use App\Models\Backend\Ref;
use App\Models\Backend\menu\frontend\MenuCategory;
use Illuminate\Http\Request;

class ContentArticleController extends Controller
{
    public function index(Request $request)
    {
        $search = $request->get('search');

        $articles = ContentArticle::with('translations')
            ->when($search, function ($q) use ($search) {
                $q->where(function ($sub) use ($search) {
                    $sub->where('article_code', 'like', "%{$search}%")
                        ->orWhere('article_category', 'like', "%{$search}%")
                        ->orWhere('article_status', 'like', "%{$search}%")
                        ->orWhereHas('translations', function ($t) use ($search) {
                            $t->where('article_translation_title', 'like', "%{$search}%");
                        });
                });
            })
            ->orderBy('article_sorting')
            ->orderBy('created_at', 'desc')
            ->paginate(10)->onEachSide(1)->withQueryString();

        $categories = Ref::where('cat', 'ARTICLE_CAT')->orderBy('sort')->pluck('descr', 'code');
        $subcategories = Ref::where('cat', 'ARTICLE_SUBCAT')->orderBy('sort')->pluck('descr', 'code');
        $statuses = Ref::where('cat', 'ARTICLE_STATUS')->orderBy('sort')->pluck('descr', 'code');

        return view('backend.module.contentArticle.index', [
            'articles' => $articles,
            'categories' => $categories,
            'subcategories' => $subcategories,
            'statuses' => $statuses,
            'search' => $search,
        ]);
    }

    public function create()
    {
        $categories = Ref::where('cat', 'ARTICLE_CAT')->orderBy('sort')->pluck('descr', 'code');
        $subcategories = Ref::where('cat', 'ARTICLE_SUBCAT')->orderBy('sort')->get(['code', 'descr', 'parent']);
        $statuses = Ref::where('cat', 'ARTICLE_STATUS')->orderBy('sort')->pluck('descr', 'code');
        $languages = Ref::where('cat', 'LANGUAGE')->orderBy('sort')->pluck('descr', 'code');
        $portals = FrontendSite::where('status', true)->orderBy('name')->pluck('name', 'slug');
        $menuCategories = MenuCategory::dropdown();

        return view('backend.module.contentArticle.create', [
            'categories' => $categories,
            'subcategories' => $subcategories,
            'statuses' => $statuses,
            'languages' => $languages,
            'portals' => $portals,
            'menuCategories' => $menuCategories,
        ]);
    }

    public function store(ContentArticleRequest $request)
    {
        $imagePath = null;

        if ($request->hasFile('article_image')) {
            $file = $request->file('article_image');
            $name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
            $filename = $name . '_' . now()->format('Ymd') . '_' . substr(uniqid(), -5) . '.' . $file->getClientOriginalExtension();
            $imagePath = $file->storeAs('content-article', $filename, 'public');
        }

        $article = ContentArticle::create([
            'article_code' => $request->article_code,
            'article_date' => $request->article_date,
            'article_category' => $request->article_category,
            'article_subcategory' => $request->article_subcategory,
            'article_status' => $request->article_status,
            'article_url' => $request->article_url,
            'article_image' => $imagePath,
            'article_sorting' => $request->article_sorting ?? 0,
            'article_portal_category' => $request->article_portal_category,
            'article_start_date' => $request->article_start_date,
            'article_start_time' => $request->article_start_time,
            'article_end_date' => $request->article_end_date,
            'article_end_time' => $request->article_end_time,
            'menu_set' => $request->menu_set,
            'created_by' => auth()->id(),
            'updated_by' => auth()->id(),
        ]);

        if ($request->has('translations')) {
            foreach ($request->translations as $lang => $translation) {
                if (!empty($translation['title'])) {
                    ContentArticleTranslation::create([
                        'article_translation_parent_id' => $article->article_id,
                        'article_translation_title' => $translation['title'],
                        'article_translation_content' => $translation['content'] ?? '',
                        'article_translation_main' => $translation['main'] ?? 0,
                        'article_translation_language' => $lang,
                        'created_by' => auth()->id(),
                        'updated_by' => auth()->id(),
                    ]);
                }
            }
        }

        flash()->success('Article created successfully!');

        return redirect()->route('content-article.index');
    }

    public function edit($id)
    {
        $article = ContentArticle::with('translations')->findOrFail($id);
        $categories = Ref::where('cat', 'ARTICLE_CAT')->orderBy('sort')->pluck('descr', 'code');
        $subcategories = Ref::where('cat', 'ARTICLE_SUBCAT')->orderBy('sort')->get(['code', 'descr', 'parent']);
        $statuses = Ref::where('cat', 'ARTICLE_STATUS')->orderBy('sort')->pluck('descr', 'code');
        $languages = Ref::where('cat', 'LANGUAGE')->orderBy('sort')->pluck('descr', 'code');
        $portals = FrontendSite::where('status', true)->orderBy('name')->pluck('name', 'slug');
        $menuCategories = MenuCategory::dropdown();

        return view('backend.module.contentArticle.edit', [
            'article' => $article,
            'categories' => $categories,
            'subcategories' => $subcategories,
            'statuses' => $statuses,
            'languages' => $languages,
            'portals' => $portals,
            'menuCategories' => $menuCategories,
        ]);
    }

    public function update(ContentArticleRequest $request, $id)
    {
        $article = ContentArticle::findOrFail($id);

        $imagePath = $article->article_image;

        if ($request->hasFile('article_image')) {
            if ($imagePath && \Storage::disk('public')->exists($imagePath)) {
                \Storage::disk('public')->delete($imagePath);
            }

            $file = $request->file('article_image');
            $name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
            $filename = $name . '_' . now()->format('Ymd') . '_' . substr(uniqid(), -5) . '.' . $file->getClientOriginalExtension();
            $imagePath = $file->storeAs('content-article', $filename, 'public');
        }

        $article->update([
            'article_code' => $request->article_code,
            'article_date' => $request->article_date,
            'article_category' => $request->article_category,
            'article_subcategory' => $request->article_subcategory,
            'article_status' => $request->article_status,
            'article_url' => $request->article_url,
            'article_image' => $imagePath,
            'article_sorting' => $request->article_sorting ?? 0,
            'article_portal_category' => $request->article_portal_category,
            'article_start_date' => $request->article_start_date,
            'article_start_time' => $request->article_start_time,
            'article_end_date' => $request->article_end_date,
            'article_end_time' => $request->article_end_time,
            'menu_set' => $request->menu_set,
            'updated_by' => auth()->id(),
        ]);

        $article->translations()->delete();

        if ($request->filled('translations')) {
            foreach ($request->translations as $lang => $translation) {
                if (!empty($translation['title'])) {
                    ContentArticleTranslation::create([
                        'article_translation_parent_id' => $article->article_id,
                        'article_translation_title' => $translation['title'],
                        'article_translation_content' => $translation['content'] ?? '',
                        'article_translation_main' => $translation['main'] ?? 0,
                        'article_translation_language' => $lang,
                        'created_by' => auth()->id(),
                        'updated_by' => auth()->id(),
                    ]);
                }
            }
        }

        flash()->success('Article updated successfully!');

        return redirect()->route('content-article.index');
    }

    public function destroy($id)
    {
        $article = ContentArticle::findOrFail($id);

        if ($article->article_image && \Storage::disk('public')->exists($article->article_image)) {
            \Storage::disk('public')->delete($article->article_image);
        }

        $article->translations()->delete();
        $article->delete();

        flash()->success('Article deleted successfully.');

        return redirect()->route('content-article.index');
    }

    public function reorder(Request $request)
    {
        $ids = $request->input("ids", []);
        $page = (int) $request->input('page', 1);
        $perPage = 10;
        $offset = ($page - 1) * $perPage;
        foreach ($ids as $index => $id) {
            \App\Models\Backend\ContentArticle::whereKey($id)->update(["article_sorting" => $offset + $index + 1]);
        }
        return response()->json(["success" => true]);
    }

}