# Resource System

نظام الموارد هو أحد أهم المفاهيم المعمارية في Chamilo 2.0. يوفر تجريداً موحداً لجميع محتويات الدورة — الوثائق، والتمارين، ومسارات التعلم، ومنشورات المنتدى، وغيرها.

## المفهوم الأساسي

يُمثل كل جزء من محتويات الدورة بواسطة **ResourceNode**. هذا يمنح جميع أنواع المحتوى مجموعة مشتركة من الإمكانيات:

* **التحكم في الرؤية** — إظهار/إخفاء عن المتعلمين
* **التحكم في الوصول** — يتحقق التصويتات الأمنية من الصلاحيات عبر ResourceNode
* **تخزين الملفات** — تُخزن الملفات المرفقة عبر ResourceFile
* **هيكل الشجرة** — تشكل ResourceNodes شجرة (علاقات أب-ابن)
* **سجل التدقيق** — المُنشئ، تاريخ الإنشاء، تتبع التعديلات

## الكيانات الرئيسية

### ResourceNode (`src/CoreBundle/Entity/ResourceNode.php`)

الكيان المركزي. كل كيان محتوى لديه علاقة واحد لواحد مع ResourceNode.

الحقول الرئيسية:

| Field           | Type         | Description                     |
| --------------- | ------------ | ------------------------------- |
| `id`            | integer      | المفتاح الأساسي                 |
| `uuid`          | UUID v4      | معرف فريد لاستخدام API          |
| `title`         | string       | العنوان المعروض                 |
| `creator`       | User         | المستخدم الذي أنشأ هذه المورد   |
| `resourceFile`  | ResourceFile | الملف المرفق (إن وجد)           |
| `resourceType`  | ResourceType | نوع المورد (وثيقة، اختبار، إلخ) |
| `parent`        | ResourceNode | الأب في شجرة الموارد            |
| `children`      | Collection   | ResourceNodes الفرعية           |
| `resourceLinks` | Collection   | روابط الرؤية والوصول            |

تستخدم الشجرة استراتيجية **materialized path** الخاصة بـGedmo للاستعلامات الهرمية الفعالة.

### ResourceFile (`src/CoreBundle/Entity/ResourceFile.php`)

تخزن بيانات الملف الفعلية للمورد:

| Field          | Type    | Description         |
| -------------- | ------- | ------------------- |
| `id`           | integer | المفتاح الأساسي     |
| `title`        | string  | اسم الملف الأصلي    |
| `mimeType`     | string  | نوع MIME            |
| `originalName` | string  | اسم التحميل الأصلي  |
| `size`         | integer | حجم الملف بالبايتات |
| `crop`         | string  | بيانات القص (للصور) |

يتم التعامل مع تخزين الملفات بواسطة Flysystem، لذا يمكن أن تكون الملفات على القرص المحلي، أو S3، أو Azure، أو GCS حسب الإعدادات.

### ResourceLink

يتحكم في الرؤية والوصول لكل سياق. هناك 3 أنواع سياق رئيسية:

1. Course
2. Session
3. Group (في دورة)

لذلك، يعكس كيان ResourceLink مزيج هذه الأنواع الثلاثة من السياقات ويحدد رؤية لهذا السياق الكامل:

| Field        | Type    | Description                    |
| ------------ | ------- | ------------------------------ |
| `course`     | Course  | الدورة التي ينتمي إليها المورد |
| `session`    | Session | الجلسة (null للدورة الأساسية)  |
| `group`      | CGroup  | المجموعة (null للدورة بأكملها) |
| `visibility` | integer | مرئي، غير مرئي، أو محذوف       |

هذا يسمح لنفس ResourceNode بأن يكون له رؤية مختلفة في سياقات مختلفة (مثل: مرئي في جلسة واحدة لكنه مخفي في أخرى).

يتم تعيين هذا تلقائياً عند استخدام الواجهة وقرر، على سبيل المثال، أن مورداً ما هو مورد خاص بجلسة وسيكون مرئياً لجميع المجموعات في دورة معينة في جلسة معينة، لكنه غير مرئي في الدورة الأساسية أو في جلسة أخرى.

افتراضياً، تكون الموارد المرئية في الدورة الأساسية مرئية أيضاً في جميع جلسات تلك الدورة، لكن يمكن لمدرس الدورة أن يقرر إخفاء مورد عن جلسة معينة. في هذه الحالة، سنسترد الرؤية الخاصة لهذا المورد في هذه الجلسة ونرى أن لها قيمة رؤية 0، لذا لن يظهر العنصر للمتعلمين في هذه الجلسة، بينما عدم وجود رؤية خاصة بالجلسة في جلسات أخرى سيجعل المورد يستخدم رؤية الدورة الأساسية (وسيظهر المورد للمتعلمين).

## تكامل API Platform

يُعرض ResourceNode كمورد API Platform مع أمان:

```php
#[ApiResource(
    operations: [
        new Get(security: "is_granted('VIEW', object)"),
        new Put(security: "is_granted('EDIT', object)"),
        new Delete(security: "is_granted('DELETE', object)"),
        new GetCollection(security: "is_granted('ROLE_USER')"),
    ]
)]
```

## كيفية ربط كيانات المحتوى

كيانات محتوى الدورة (CDocument، CQuiz، CLp، إلخ) تمتد `AbstractResource` أو تنفذ `ResourceInterface`، مما يمنحها علاقة `resourceNode`:

```php
// In CDocument entity:
#[ORM\OneToOne(targetEntity: ResourceNode::class)]
private ResourceNode $resourceNode;
```

عند إنشاء CDocument، يتم إنشاء ResourceNode تلقائياً معه، مما يوفر إدارة موارد موحدة.

## الآثار العملية

عند العمل مع محتويات الدورة:

1. **إنشاء المحتوى** — إنشاء كيان المحتوى و ResourceNode الخاص به
2. **التحقق من الصلاحيات** — استخدام تصويتات الأمان الخاصة بـResourceNode
3. **إدارة الملفات** — إرفاق الملفات عبر ResourceFile
4. **التحكم في الرؤية** — إنشاء/تعديل ResourceLinks
5. **بناء الشجرات** — استخدام علاقة الأب-الابن في ResourceNode لهياكل المجلدات (مثل: مجلدات الوثائق)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.chamilo.org/2.x-ar/dlyl-almtwr/developer-guide/backend/resource-system.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
