HEX
Server: Apache/2.4.58 (Ubuntu)
System: Linux ip-172-26-0-120 6.17.0-1009-aws #9~24.04.2-Ubuntu SMP Fri Mar 6 23:50:29 UTC 2026 x86_64
User: ubuntu (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: /var/www/html/spion/app/Http/Controllers/TemplateController.php
<?php

namespace App\Http\Controllers;

use App\Models\Industry;
use App\Models\Template;
use Illuminate\Http\Request;
use Yajra\DataTables\Facades\DataTables;

// use DataTables;

class TemplateController extends Controller
{
    public function index(Request $request)
    {
        if ($request->ajax()) {
            $query = Template::query();
    
            // if ($request->search_keyword) {
            //     $query->where('title', 'like', '%' . $request->search_keyword . '%');
            // }
    
            // if ($request->status_filter && $request->status_filter !== 'all') {
            //     $query->where('status', $request->status_filter);
            // }
    
            $templates = $query->latest()->get();
    
            return DataTables::of($templates)
                ->addColumn('main_image', function ($template) {
                    return $template->getFirstMediaUrl('main_image');
                })
                ->addColumn('screenshots', function ($template) {
                    $mediaItems = $template->getMedia('screenshots');
                    return $mediaItems->map(function ($media) {
                        return $media->getUrl();
                    })->toArray(); 
                })
                
                // ->addColumn('screenshots', function ($template) {
                //     return $template->getMedia('screenshots')->map(function ($media) {
                //         return $media->getUrl();
                //     });
                // })
                ->addColumn('tags', function ($template) {
                    return implode(', ', json_decode($template->tags, true));
                })
                ->addColumn('features', function ($template) {
                    return implode(', ', json_decode($template->features, true));
                })
                ->addColumn('action', function ($template) {
                    return '<a href="' . route('template.edit', $template->id) . '" class="btn btn-warning btn-sm">Edit</a>
                            <form action="' . route('template.destroy', $template->id) . '" method="POST" style="display: inline-block;">
                                ' . csrf_field() . method_field('DELETE') . '
                                <button type="submit" class="btn btn-danger btn-sm" onclick="return confirm(\'Are you sure?\')">Delete</button>
                            </form>';
                })
                ->rawColumns(['main_image', 'screenshots', 'action'])
                ->make(true);
        }
    
        return view('admin.template.index');
    }
    
    public function create(){
        $industries = Industry::all(); // Fetch all industries
        return view('admin.template.create', compact('industries'));
    }
    public function store(Request $request)
    {
        // dd($request->all());
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'description' => 'required|string',
            'image' => 'required|image|mimes:jpeg,png,jpg|max:2048',
            'screenshots_image.*' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
            'tags' => 'required|array',
            'tags.*' => 'string|max:255',
            'features' => 'required|array',
            'features.*' => 'string|max:255',
            'industry_id' => 'required|exists:industries,id',

        ]);

        $template = Template::create([
            'title' => $validated['title'],
            'description' => $validated['description'],
            'tags' => json_encode($validated['tags']),
            'features' => json_encode($validated['features']),
            'industry_id' => $validated['industry_id'],
            'status' => $request->status ?? 1,
        ]);

        $template->addMediaFromRequest('image')->toMediaCollection('main_image');

        if ($request->hasFile('screenshots_image')) {
            $files = $request->file('screenshots_image');
            if (is_array($files)) {
                foreach ($files as $file) {
                    $template->addMedia($file)->toMediaCollection('screenshots');
                }
            } else {
                // dd('Not an array of files.');
            }
        }

        return redirect()->route('template.index')->with('success', 'Template created successfully!');
    }
    public function edit($id)
    {
        $template = Template::findOrFail($id);  // Find the template by ID
        $tags = json_decode($template->tags, true);  // Decode tags array
        $features = json_decode($template->features, true);  // Decode features array
        $industries = Industry::all();
        // Get the media for main image and screenshots
        $mainImage = $template->getFirstMediaUrl('main_image');
        $screenshots = $template->getMedia('screenshots');

        return view('admin.template.edit', compact('template', 'tags', 'features', 'mainImage', 'screenshots','industries'));
    }
    public function update(Request $request, $id)
    {
        // dd($request->all());
        // Validate the request
        $validated = $request->validate([
            'title' => 'required|string|max:255',
            'description' => 'required|string',
            'image' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
            'screenshots_image.*' => 'nullable|image|mimes:jpeg,png,jpg|max:2048',
            'tags' => 'required|array',
            'tags.*' => 'string|max:255',
            'features' => 'required|array',
            'features.*' => 'string|max:255',
            'industry_id' => 'required|exists:industries,id', 

        ]);
        // dd($validated);
        // Find the template by ID
        $template = Template::findOrFail($id);

        // Update the template attributes
        $template->update([
            'title' => $validated['title'],
            'description' => $validated['description'],
            'tags' => json_encode($validated['tags']),
            'features' => json_encode($validated['features']),
            'industry_id' => $validated['industry_id'], 
            'status' => $request->status ?? 1,
        ]);

        // Update the main image if a new one is uploaded
        if ($request->hasFile('image')) {
            $template->clearMediaCollection('main_image'); // Clear the previous main image
            $template->addMediaFromRequest('image')->toMediaCollection('main_image');
        }

        // Update the screenshots if new ones are uploaded
        if ($request->hasFile('screenshots_image')) {
            $template->clearMediaCollection('screenshots'); // Clear previous screenshots
            $files = $request->file('screenshots_image');
            foreach ($files as $file) {
                $template->addMedia($file)->toMediaCollection('screenshots');
            }
        }

        return redirect()->route('template.index')->with('success', 'Template updated successfully!');
    }


    public function destroy($id)
    {
        $template = Template::findOrFail($id);
    
        $template->clearMediaCollection('main_image');
        $template->clearMediaCollection('screenshots');
    
        $template->delete();
    
        return redirect()->back()->with('success', 'Template deleted successfully!');
    }
}