# Advanced Fields Usage Guide

تم إنشاء جدول `advanced_fields` بنجاح مع علاقة Polymorphic (morph).

## البنية

### الجدول (advanced_fields)
يحتوي على الحقول التالية:
- `id` - المفتاح الأساسي
- `advancedable_id` - معرف الموديل المرتبط
- `advancedable_type` - نوع الموديل المرتبط
- `name` - اسم الحقل (nullable)
- `title` - عنوان الحقل (nullable)
- `type` - نوع القيمة (text, textarea, media, trix)
- `value_text` - قيمة النص (nullable)
- `value_textarea` - قيمة النص الطويل (nullable)
- `value_media` - مسار الملف (nullable)
- `value_trix` - محتوى Trix Editor (nullable)
- `order` - ترتيب العرض (default: 0)
- `timestamps` - created_at & updated_at

## كيفية الاستخدام

### 1. إضافة العلاقة لأي Model (الطريقة السهلة باستخدام Trait)

مثال في `app/Models/Service.php`:

```php
<?php

namespace App\Models;

use App\Models\Traits\HasAdvancedFields;
use Illuminate\Database\Eloquent\Model;

class Service extends Model
{
    use HasAdvancedFields;
}
```

**الطريقة البديلة (بدون Trait):**

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\MorphMany;

class Service extends Model
{
    /**
     * Get all of the advanced fields for the service.
     */
    public function advancedFields(): MorphMany
    {
        return $this->morphMany(AdvancedField::class, 'advancedable')->orderBy('order');
    }
}
```

### 2. تحديث Nova Resource

مثال في `app/Nova/Service.php`:

```php
use Laravel\Nova\Fields\HasMany;
use App\Nova\AdvancedField;

public function fields(NovaRequest $request): array
{
    return [
        // ... حقول أخرى
        
        HasMany::make('Advanced Fields', 'advancedFields', AdvancedField::class),
    ];
}
```

### 3. الاستخدام في الكود

#### الطريقة الأساسية:

```php
// إنشاء advanced field جديد
$service = Service::find(1);
$service->advancedFields()->create([
    'name' => 'feature_1',
    'title' => 'Feature Title',
    'type' => 'text',
    'value_text' => 'Feature description',
    'order' => 1,
]);

// الحصول على جميع الحقول
$fields = $service->advancedFields;

// الحصول على القيمة حسب النوع
foreach ($fields as $field) {
    $value = $field->getValue(); // يرجع القيمة المناسبة حسب النوع
}

// البحث عن حقل محدد
$field = $service->advancedFields()->where('name', 'feature_1')->first();
```

#### باستخدام الـ Trait Methods (أسهل):

```php
$service = Service::find(1);

// إنشاء أو تحديث حقل
$service->setAdvancedField(
    name: 'price',
    type: 'text',
    value: '1000 جنيه',
    title: 'السعر',
    order: 1
);

// الحصول على حقل محدد
$priceField = $service->getAdvancedField('price');

// الحصول على قيمة الحقل مباشرة
$price = $service->getAdvancedFieldValue('price'); // يرجع: "1000 جنيه"

// حذف حقل
$service->deleteAdvancedField('price');
```

### 4. استخدام في Blade/Inertia

```php
// في Controller
$service = Service::with('advancedFields')->find($id);

return Inertia::render('Service/Show', [
    'service' => $service,
    'fields' => $service->advancedFields,
]);
```

```jsx
// في React Component
{service.fields?.map((field) => (
    <div key={field.id}>
        <h3>{field.title}</h3>
        {field.type === 'text' && <p>{field.value_text}</p>}
        {field.type === 'textarea' && <p>{field.value_textarea}</p>}
        {field.type === 'media' && <img src={field.value_media} alt={field.title} />}
        {field.type === 'trix' && <div dangerouslySetInnerHTML={{ __html: field.value_trix }} />}
    </div>
))}
```

## Nova Resource للـ AdvancedField

تم إنشاء Nova Resource منفصل للـ AdvancedField الذي يحتوي على:
- جميع الحقول المطلوبة (name, title, type, values)
- دعم dependsOn لإظهار الحقول حسب النوع
- علاقة MorphTo للعودة للـ parent model
- مخفي من القائمة الجانبية (`displayInNavigation = false`)

## Models التي يمكن إضافة العلاقة لها

يمكنك إضافة علاقة `advancedFields()` لأي من هذه الـ Models:
- ✅ `About` (تم إضافتها)
- `Service`
- `Project`
- `Blog`
- `Home`
- `Setting`
- أي Model آخر

**ملاحظة مهمة:** عند إضافة Model جديد، يجب تحديث `MorphTo` في `app/Nova/AdvancedField.php`:

```php
MorphTo::make('Advancedable')
    ->types([
        About::class,
        Service::class,  // أضف هنا
        Project::class,  // أضف هنا
        // المزيد...
    ])
```

## مثال كامل لإضافة العلاقة لـ Service

### 1. تحديث Model

```php
// app/Models/Service.php
use App\Models\Traits\HasAdvancedFields;

class Service extends Model
{
    use HasAdvancedFields;
}
```

### 2. تحديث Nova Resource

```php
// app/Nova/Service.php
use Laravel\Nova\Fields\HasMany;
use App\Nova\AdvancedField;

// في methods fields():
HasMany::make('Advanced Fields', 'advancedFields', AdvancedField::class),
```

### 3. الاستخدام

```php
$service = Service::find(1);

// الطريقة السهلة
$service->setAdvancedField('price', 'text', '1000 جنيه', 'السعر', 1);

// أو الطريقة التقليدية
$service->advancedFields()->create([
    'name' => 'price',
    'title' => 'السعر',
    'type' => 'text',
    'value_text' => '1000 جنيه',
    'order' => 1,
]);
```

## ملاحظات مهمة

1. **الترتيب**: استخدم حقل `order` لتحديد ترتيب عرض الحقول
2. **النوع**: حسب `type` يتم استخدام حقل القيمة المناسب فقط
3. **Polymorphic**: نفس الجدول يمكن استخدامه مع جميع الـ Models
4. **Laravel Nova**: يدعم إضافة/تعديل/حذف الحقول من لوحة التحكم
5. **File Storage**: الملفات يتم تخزينها في `storage/app/public/advanced-fields`
6. **Trait**: استخدم `HasAdvancedFields` للحصول على methods إضافية مفيدة

## Trait Methods المتاحة

عند استخدام `HasAdvancedFields` trait:

- `advancedFields()` - العلاقة الأساسية
- `getAdvancedField($name)` - الحصول على حقل محدد بالاسم
- `getAdvancedFieldValue($name)` - الحصول على قيمة حقل محدد
- `setAdvancedField($name, $type, $value, $title, $order)` - إنشاء أو تحديث حقل
- `deleteAdvancedField($name)` - حذف حقل محدد

## استخدام API Resource

لاستخدام Advanced Fields في API responses:

```php
// في Controller
use App\Http\Resources\AdvancedFieldResource;

public function show($id)
{
    $about = About::with('advancedFields')->findOrFail($id);
    
    return response()->json([
        'about' => $about,
        'fields' => AdvancedFieldResource::collection($about->advancedFields),
    ]);
}
```

**مثال على الـ Response:**

```json
{
    "about": {
        "id": 1,
        "created_at": "2026-02-07T09:00:00.000000Z",
        "updated_at": "2026-02-07T09:00:00.000000Z"
    },
    "fields": [
        {
            "id": 1,
            "name": "company_name",
            "title": "اسم الشركة",
            "type": "text",
            "value": "شركة المستقبل للتكنولوجيا",
            "order": 1,
            "created_at": "2026-02-07T09:00:00.000Z",
            "updated_at": "2026-02-07T09:00:00.000Z"
        },
        {
            "id": 2,
            "name": "description",
            "title": "وصف الشركة",
            "type": "textarea",
            "value": "نحن شركة رائدة في مجال التكنولوجيا...",
            "order": 2,
            "created_at": "2026-02-07T09:00:00.000Z",
            "updated_at": "2026-02-07T09:00:00.000Z"
        }
    ]
}
```

## استخدام مع Inertia.js

```php
// في Controller
use Inertia\Inertia;

public function show($id)
{
    $about = About::with('advancedFields')->findOrFail($id);
    
    return Inertia::render('About/Show', [
        'about' => $about,
        'fields' => AdvancedFieldResource::collection($about->advancedFields),
    ]);
}
```

```tsx
// في React Component
import { AdvancedField } from '@/types';

interface Props {
    about: About;
    fields: AdvancedField[];
}

export default function Show({ about, fields }: Props) {
    return (
        <div>
            {fields.map((field) => (
                <div key={field.id}>
                    <h3>{field.title}</h3>
                    {field.type === 'text' && <p>{field.value}</p>}
                    {field.type === 'textarea' && (
                        <p style={{ whiteSpace: 'pre-wrap' }}>{field.value}</p>
                    )}
                    {field.type === 'media' && (
                        <img src={`/storage/${field.value}`} alt={field.title} />
                    )}
                    {field.type === 'trix' && (
                        <div dangerouslySetInnerHTML={{ __html: field.value }} />
                    )}
                </div>
            ))}
        </div>
    );
}
```
