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/ThemeRuleController.php

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use App\Models\Backend\ThemeRule;
use App\Models\Backend\ThemeSetting;
use App\Services\ThemeService;
use Illuminate\Http\Request;

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

        $rules = ThemeRule::when($search, function ($q) use ($search) {
            $q->where(function ($sub) use ($search) {
                $sub->where('rule_name', 'like', "%{$search}%")
                    ->orWhere('rule_description', 'like', "%{$search}%");
            });
        })
            ->orderBy('created_at', 'desc')
            ->paginate(10)
            ->onEachSide(1)
            ->withQueryString();

        return view('backend.module.theme.theme-rule.index', [
            'rules' => $rules,
            'search' => $search,
        ]);
    }

    public function show($id)
    {
        $rule = ThemeRule::findOrFail($id);

        return view('backend.module.theme.theme-rule.show', [
            'rule' => $rule,
        ]);
    }

    public function create()
    {
        return view('backend.module.theme.theme-rule.form', [
            'rule' => null,
        ]);
    }

    public function store(Request $request)
    {
        $request->validate([
            'rule_name' => 'required|string|max:250',
            'rule_description' => 'nullable|string|max:500',
            'rule_content' => 'required|string',
            'rule_status' => 'nullable|boolean',
        ]);

        $paramNames = $request->input('param_name', []);
        $paramDefaults = $request->input('param_default', []);
        $paramTypes = $request->input('param_type', []);
        $params = [];

        foreach ($paramNames as $i => $name) {
            if ($name) {
                $default = $paramDefaults[$i] ?? '';

                if (($paramTypes[$i] ?? '') === 'unit') {
                    preg_match('/^([\d]+)([a-zA-Z%]+)/', $default, $matches);
                    $default = [
                        'value' => $matches[1] ?? '0',
                        'unit' => $matches[2] ?? 'px',
                    ];
                }

                $params[] = [
                    'param_name' => $name,
                    'param_default' => $default,
                    'param_type' => $paramTypes[$i] ?? 'text',
                ];
            }
        }

        $rule = ThemeRule::create([
            'rule_name' => $request->rule_name,
            'rule_description' => $request->rule_description,
            'rule_content' => $request->rule_content,
            'rule_params' => !empty($params) ? json_encode($params) : null,
            'rule_status' => $request->boolean('rule_status', true),
            'created_by' => auth()->id(),
            'updated_by' => auth()->id(),
        ]);

        foreach ($params as $param) {
            ThemeSetting::create([
                'setting_rule_id' => $rule->rule_id,
                'setting_param_name' => $param['param_name'],
                'setting_param_type' => $param['param_type'],
                'setting_param_value' => $param['param_type'] === 'unit'
                    ? json_encode(['value' => $param['param_default'], 'unit' => 'px'])
                    : $param['param_default'],
                'setting_param_default' => $param['param_type'] === 'unit'
                    ? json_encode(['value' => $param['param_default'], 'unit' => 'px'])
                    : $param['param_default'],
            ]);
        }

        ThemeService::generateCss();

        flash()->success('Theme rule created successfully.');

        return redirect()->route('theme-rule.index');
    }

    public function edit($id)
    {
        $rule = ThemeRule::findOrFail($id);

        return view('backend.module.theme.theme-rule.form', [
            'rule' => $rule,
        ]);
    }

    public function update(Request $request, $id)
    {
        $rule = ThemeRule::findOrFail($id);

        $request->validate([
            'rule_name' => 'required|string|max:250',
            'rule_description' => 'nullable|string|max:500',
            'rule_content' => 'required|string',
            'rule_status' => 'nullable|boolean',
        ]);

        $paramNames = $request->input('param_name', []);
        $paramDefaults = $request->input('param_default', []);
        $paramTypes = $request->input('param_type', []);
        $params = [];

        foreach ($paramNames as $i => $name) {
            if ($name) {
                $default = $paramDefaults[$i] ?? '';

                if (($paramTypes[$i] ?? '') === 'unit') {
                    preg_match('/^([\d]+)([a-zA-Z%]+)/', $default, $matches);
                    $default = [
                        'value' => $matches[1] ?? '0',
                        'unit' => $matches[2] ?? 'px',
                    ];
                }

                $params[] = [
                    'param_name' => $name,
                    'param_default' => $default,
                    'param_type' => $paramTypes[$i] ?? 'text',
                ];
            }
        }

        $rule->update([
            'rule_name' => $request->rule_name,
            'rule_description' => $request->rule_description,
            'rule_content' => $request->rule_content,
            'rule_params' => !empty($params) ? json_encode($params) : null,
            'rule_status' => $request->boolean('rule_status', true),
            'updated_by' => auth()->id(),
        ]);

        ThemeSetting::where('setting_rule_id', $rule->rule_id)->delete();

        foreach ($params as $param) {
            ThemeSetting::create([
                'setting_rule_id' => $rule->rule_id,
                'setting_param_name' => $param['param_name'],
                'setting_param_type' => $param['param_type'],
                'setting_param_value' => $param['param_type'] === 'unit'
                    ? json_encode(['value' => $param['param_default'], 'unit' => 'px'])
                    : $param['param_default'],
                'setting_param_default' => $param['param_type'] === 'unit'
                    ? json_encode(['value' => $param['param_default'], 'unit' => 'px'])
                    : $param['param_default'],
            ]);
        }

        ThemeService::generateCss();

        flash()->success('Theme rule updated successfully.');

        return redirect()->route('theme-rule.index');
    }

    public function destroy(Request $request)
    {
        $rule = ThemeRule::findOrFail($request->id);
        $rule->delete();

        ThemeService::generateCss();

        flash()->success('Theme rule deleted successfully.');

        return redirect()->route('theme-rule.index');
    }
}