Bläddra i källkod

add model class

sark 1 månad sedan
förälder
incheckning
7e0f33fb21
3 ändrade filer med 213 tillägg och 0 borttagningar
  1. 63 0
      src/Enums/PageLayout.php
  2. 73 0
      src/Enums/SlotVolatility.php
  3. 77 0
      src/Models/Page.php

+ 63 - 0
src/Enums/PageLayout.php

@@ -0,0 +1,63 @@
+<?php
+
+namespace App\Enums;
+
+use App\Filament\Resources\Pages\Schemas\LayoutForms;
+use App\ViewModels\Pages as ViewModels;
+
+enum PageLayout: string
+{
+    case Default = 'default';
+    case FrontPage = 'front_page';
+
+    public function label(): string
+    {
+        return match($this) {
+            self::Default => 'Default',
+            self::FrontPage => 'Front Page',
+        };
+    }
+
+    public function route(): string
+    {
+        return match($this) {
+            self::Default => 'Default',
+            self::FrontPage => 'Front Page',
+        };
+    }
+
+    public function handlerClass(): string
+    {
+        return match($this) {
+            self::Default => '',
+            self::FrontPage => '',
+        };
+    }
+
+    public function formClass(): string
+    {
+        return match($this) {
+            self::Default => '',
+            self::FrontPage => '',
+        };
+    }
+
+    public static function selectOptions(): array
+    {
+        $options = [];
+        foreach (self::cases() as $case) {
+            $options[$case->value] = $case->label();
+        }
+        return $options;
+    }
+    
+    public static function isValid(string $layout): bool
+    {
+        foreach (self::cases() as $case) {
+            if ($case->value === $layout) {
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 73 - 0
src/Enums/SlotVolatility.php

@@ -0,0 +1,73 @@
+<?php
+
+namespace App\Enums;
+
+enum SlotVolatility: string
+{
+    case LOW = 'low';
+    case LOW_MEDIUM = 'low-medium';
+    case MEDIUM = 'medium';
+    case MEDIUM_HIGH = 'medium-high';
+    case HIGH = 'high';
+
+    public function label(): string
+    {
+        return match($this) {
+            self::LOW => 'Low',
+            self::MEDIUM => 'Medium',
+            self::HIGH => 'High',
+            self::LOW_MEDIUM => 'Low-Medium',
+            self::MEDIUM_HIGH => 'Medium-High',
+
+        };
+    }
+
+    public function score(): int
+    {
+        return match($this) {
+            self::LOW => 1,
+            self::LOW_MEDIUM => 3,
+            self::MEDIUM => 5,
+            self::MEDIUM_HIGH => 8,
+            self::HIGH => 10,
+        };
+    }
+
+    public function cssColorClass(): string
+    {
+        return match($this) {
+            self::LOW => 'best',           // Самая низкая волатильность - лучше всего
+            self::LOW_MEDIUM => 'medium-good',   // Низко-средняя волатильность
+            self::MEDIUM => 'good',        // Средняя волатильность
+            self::MEDIUM_HIGH => 'medium-bed',  // Средне-высокая волатильность
+            self::HIGH => 'bad',           // Высокая волатильность - хуже всего
+        };
+    }
+
+    public static function selectOptions(): array
+    {
+        $options = [];
+        foreach (self::sorted() as $case) {
+            $options[$case->value] = $case->label();
+        }
+        return $options;
+    }
+
+    public static function values(): array
+    {
+        return array_map(fn($case) => $case->value, self::cases());
+    }
+
+    public static function sorted(): array
+    {
+        // Получаем все случаи enum
+        $cases = self::cases();
+
+        // Сортируем по score (от меньшего к большему)
+        usort($cases, function($a, $b) {
+            return $a->score() <=> $b->score(); // Spaceship оператор: -1, 0, или 1
+        });
+
+        return $cases; // LOW, LOW_MEDIUM, MEDIUM, MEDIUM_HIGH, HIGH
+    }
+}

+ 77 - 0
src/Models/Page.php

@@ -0,0 +1,77 @@
+<?php
+
+namespace App\Models;
+
+use App\Enums\PageLayout;
+
+class Page 
+{
+    private $db;
+    
+    public function __construct()
+    {
+        $this->db = \db();
+    }
+    
+    public function getAll()
+    {
+        return $this->db->fetchAll("SELECT * FROM pages ORDER BY id DESC");
+    }
+    
+    public function getById($id)
+    {
+        return $this->db->fetchOne("SELECT * FROM pages WHERE id = ?", [$id]);
+    }
+    
+    public function getBySlug($slug)
+    {
+        return $this->db->fetchOne("SELECT * FROM pages WHERE slug = ?", [$slug]);
+    }
+    
+    public function create($data)
+    {
+        $sql = "INSERT INTO pages (name, slug, title, content, extra_fields, layout, is_homepage) VALUES (?, ?, ?, ?, ?, ?, ?)";
+        $params = [
+            $data['name'],
+            $data['slug'],
+            $data['title'] ?? null,
+            $data['content'] ?? null,
+            $data['extra_fields'] ? json_encode($data['extra_fields']) : null,
+            $data['layout'] ?? PageLayout::Default->value,
+            $data['is_homepage'] ?? 0
+        ];
+        
+        return $this->db->execute($sql, $params);
+    }
+    
+    public function update($id, $data)
+    {
+        $sql = "UPDATE pages SET name = ?, slug = ?, title = ?, content = ?, extra_fields = ?, layout = ?, is_homepage = ?, updated_at = CURRENT_TIMESTAMP WHERE id = ?";
+        $params = [
+            $data['name'],
+            $data['slug'],
+            $data['title'] ?? null,
+            $data['content'] ?? null,
+            $data['extra_fields'] ? json_encode($data['extra_fields']) : null,
+            $data['layout'] ?? PageLayout::Default->value,
+            $data['is_homepage'] ?? 0,
+            $id
+        ];
+        
+        return $this->db->execute($sql, $params);
+    }
+    
+    public function delete($id)
+    {
+        return $this->db->execute("DELETE FROM pages WHERE id = ?", [$id]);
+    }
+    
+    public function exists($slug, $excludeId = null)
+    {
+        if ($excludeId) {
+            return $this->db->fetchOne("SELECT id FROM pages WHERE slug = ? AND id != ?", [$slug, $excludeId]);
+        }
+        
+        return $this->db->fetchOne("SELECT id FROM pages WHERE slug = ?", [$slug]);
+    }
+}