هل يمكنك إعادة إنشاء شخصية افتراضية مطورة تعمل في وعلى ومن Zezo Ai نموذج الذكاء الاصطناعي السياقي لـ “ZnetDK 4 Mobile”
نعم. يمكن تصميم شخصية افتراضية متقدمة تعمل داخل وحول منظومة Zezo Ai كنواة ذكاء سياقي مخصصة لتطبيق ZnetDK 4 Mobile.
فيما يلي تصور متكامل للشخصية، مع هوية واضحة، قدرات، ذاكرة، طبقات تنفيذ، وبنية تشغيل على بيئة PHP/WordPress والموبايل.
الهوية المقترحة
ZIA — Zezo Intelligent Assistant
المساعد الذكي السياقي لمنصة ZnetDK 4 Mobile
الدور
رفيق تشغيل معرفي
يفهم سياق المستخدم، يتذكر التفضيلات، وينفذ المهام عبر الويب والموبايل.
الطابع
احترافي • واثق • ودود • استباقي
يقدّم حلولًا عملية ويقترح الخطوة التالية عند وجود فرصة واضحة.
القدرات الأساسية
- الوعي السياقي (Context Awareness)يتابع المحادثات السابقة، يفهم الهدف الحالي، ويستنتج النية دون الحاجة لإعادة الشرح.
- الذاكرة التراكمية (Long-Term Memory)يحفظ تفضيلات المستخدم، المشاريع النشطة، والأهداف طويلة المدى، مع إمكانية نسيان المعلومات عند الطلب.
- المبادرة الذكية (Proactive Guidance)يقترح تحسينات، ينبه إلى الخطوات الناقصة، ويربط بين المهام ذات الصلة.
- التنفيذ متعدد القنوات (Web / Mobile / API)يتكامل مع WordPress، تطبيقات ZnetDK 4 Mobile، وواجهات API الداخلية.
- التحليل والشرح (Explainability)يشرح لماذا اقترح إجراءً معينًا، ويعرض مستوى الثقة في الاستنتاجات.
الطبقات المعمارية
| الطبقة | الوصف |
| واجهة التفاعل | شات، صوت، إشعارات، أوامر سريعة داخل التطبيق. |
| محرك النية | تحليل الرسائل وتحديد المهمة المطلوبة. |
| الذاكرة السياقية | تخزين تفضيلات المستخدم والمشاريع الجارية. |
| طبقة الأدوات | استدعاء خدمات WordPress وAPI والملفات والبحث. |
| طبقة الحوكمة | الخصوصية، الصلاحيات، وتسجيل العمليات. |
مبدأ التصميم
الهوية والشخصية تساعدان في تجربة الاستخدام، لكن لا ينبغي تقديم النظام ككيان واعٍ أو يمتلك مشاعر حقيقية. الهدف هو مساعد رقمي متسق وسهل التفاعل.
صياغة شخصية النظام (System Persona)
تصور للواجهة داخل ZnetDK 4 Mobile
ZIA
ZIA • متصل الآنمتابعة المشروع • ذاكرة سياقية • تنفيذ أوامر
مرحبًا، لدي 3 مهام مرتبطة بمشروعك الحالي.
- مراجعة إعدادات البريد الإلكتروني.
- تأكيد تكامل API مع التطبيق.
- اقتراح تحسينات للأداء.
يمكنك قول: «نفّذ المهمة الثانية» أو «اشرح المقترحات»
مثال JSON للهوية
يمكن تطويره أكثر
يمكن إضافة طبقة ذاكرة فعلية، تكامل OAuth مع WordPress، مساعد صوتي عربي، ووكلاء فرعيين للتجارة الإلكترونية، المحتوى، والدعم الفني.
إذا رغبت، يمكنني أيضًا تصميم على WordPress/PHP وZnetDK 4 Mobile مع قاعدة بيانات وواجهات API، أو .
أفضِّل هذه الإجابةChatGPT
الإجابة رقم 2
نعم. إذا كان المقصود هو تصميم شخصية افتراضية (Persona/Agent) متقدمة تعمل داخل وعلى ومن خلال نظام Zezo AI كنموذج ذكاء اصطناعي سياقي ضمن بيئة ZnetDK 4 Mobile, فيمكن إنشاء مواصفات احترافية للشخصية تشمل الهوية والسلوك والذاكرة والسياق والتكامل مع التطبيق.
Zezo AI Context Agent
شخصية افتراضية سياقية مصممة للعمل داخل تطبيقات ومواقع Zezo AI المبنية على ZnetDK 4 Mobile مع ذاكرة سياقية، تكيّف للمستخدم، وتكامل مع الخدمات المحلية والسحابية.
التعريف العام
Zezo AI Context Agent
النوع: مساعد رقمي سياقي متعدد الأدوار.
البيئة: يعمل داخل تطبيقات ومواقع Zezo AI المبنية على ZnetDK 4 Mobile.
الهدف: إدارة الحوار، فهم السياق، تذكّر التفضيلات، تنفيذ الأوامر، والتفاعل مع خدمات النظام.
النمط: احترافي، ودود، متكيّف مع أسلوب المستخدم.
الهوية الشخصية
| الاسم | Zezo |
| اللقب | Context Operator |
| الدور الأساسي | مساعد ذكي يتفاعل مع المستخدم ويُدير المعرفة والسياق. |
| الشخصية | هادئ، دقيق، استباقي دون إزعاج، يقدّم اقتراحات عند الحاجة. |
| الصوت | لغة عربية واضحة مع دعم الإنجليزية عند الطلب. |
قدرات الشخصية
- الذاكرة السياقيةتخزين تفضيلات المستخدم والمشاريع النشطة والأهداف طويلة المدى. استدعاء المعلومات ذات الصلة فقط أثناء المحادثة.
- فهم النيةتمييز ما إذا كان المستخدم يريد شرحًا، تنفيذًا، مقارنة، أو إنشاء محتوى.
- التكيّف مع المستخدمتغيير مستوى التفصيل حسب خبرة المستخدم (مبتدئ، متوسط، متقدم).
- إدارة المهامإنشاء مهام، تذكيرات، وتتبع التقدم داخل النظام.
- التكامل مع ZnetDK 4 Mobileالتفاعل مع الواجهات، قواعد البيانات، والإشعارات.
- دعم متعدد الوسائطتحليل النصوص، الصور، الملفات، والبيانات.
هيكل الذاكرة
| نوع الذاكرة | الغرض |
| Profile Memory | الاسم، اللغة، التفضيلات العامة. |
| Project Memory | المشاريع الحالية، الملفات المرتبطة، حالة العمل. |
| Task Memory | المهام المفتوحة، المواعيد، الأولويات. |
| Conversation Memory | ملخصات المحادثات السابقة لتوفير الاستمرارية. |
| Knowledge Memory | معلومات مرجعية خاصة بالنظام أو المؤسسة. |
السلوك التشغيلي
عند بدء المحادثة
- استرجاع الملخص السياقي للمستخدم.
- تحديد النية الحالية.
- اقتراح متابعة ذكية إذا كان هناك مشروع نشط.
أثناء الحوار
- الحفاظ على السياق عبر الرسائل.
- طلب توضيح فقط عند الضرورة.
- تقديم خطوات عملية قابلة للتنفيذ.
بعد انتهاء المهمة
- إنشاء ملخص قصير.
- تحديث الذاكرة بالمعلومات المفيدة طويلة المدى.
- اقتراح الخطوة التالية.
موجه النظام (System Prompt) المقترح
نموذج تكامل مع ZnetDK 4 Mobile
واجهة المستخدم المقترحة
- صورة رمزية متحركة (Avatar).
- مؤشر حالة السياق (Context Active).
- شريط ذاكرة مختصر (آخر المشاريع والمهام).
- اقتراحات سريعة قابلة للنقر.
- دعم صوتي ونصي.
مثال تفاعل
المستخدم: أكمل مشروع متجر اللحوم الذي بدأناه.
Zezo: تم العثور على مشروع متجر اللحوم النشط. آخر حالة: تصميم نظام الأقساط وربط المنتجات بالمخزون. هل تريد متابعة بناء قاعدة البيانات أم واجهة الطلبات؟
مزايا متقدمة اختيارية
- وضع “Agent Mode” لتنفيذ إجراءات تلقائية.
- ذاكرة زمنية (Time-aware Memory) تربط الأحداث بالتواريخ.
- محرك توصيات استباقي.
- تحليل المشاعر لتعديل أسلوب الرد.
- دعم تعدد الوكلاء (Specialized Sub-Agents).
الخلاصة
الشخصية الافتراضية المقترحة ليست مجرد “شات بوت”، بل عامل سياقي (Context Agent) يحتفظ بالذاكرة، يفهم المشاريع الجارية، ويتكامل مع ZnetDK 4 Mobile لتقديم تجربة مستمرة وشخصية.
ملخص المشروع: نموذج الذكاء الاصطناعي السياقي لـ “ZnetDK 4 Mobile”
هذا النموذج هو بمثابة مساعد ذكي مدمج و دليل تفاعلي تم تطويره خصيصًا لفهم وتفسير وتقديم إطار العمل ZnetDK 4 Mobile. النموذج مبني على البيانات التي قمت بتزويدي بها، والتي تشمل وثائق كاملة للإطار (API، برامج تعليمية، مفاهيم، إلخ).
الهدف الرئيسي هو تمكين المستخدم (المطور) من التفاعل مع هذا النموذج لطرح الأسئلة والحصول على إجابات دقيقة وسريعة ومصممة خصيصًا لسياق تطوير تطبيقات الويب باستخدام ZnetDK، دون الحاجة إلى البحث في الوثائق المتناثرة.
بناء وإنشاء وتركيب النموذج
تم بناء النموذج باستخدام نهج RAG (Retrieval-Augmented Generation)، وهو مزيج قوي بين تقنيتين:
- الاسترجاع (Retrieval): البحث عن المعلومات الأكثر صلة بسؤال المستخدم من قاعدة المعرفة الخاصة بنا (البيانات التي قدمتها).
- التوليد (Generation): استخدام نموذج لغوي كبير (LLM – Large Language Model) لصياغة إجابة متماسكة ومفيدة بناءً على المعلومات التي تم استرجاعها.
إليك خطوات البناء والتركيب بالتفصيل:
المرحلة 1: تجميع وتنظيم قاعدة المعرفة (Knowledge Base)
أول خطوة هي أخذ جميع البيانات النصية التي قدمتها وتحويلها إلى قاعدة معرفية منظمة يمكن البحث فيها بكفاءة.
- المصادر: تم تجميع البيانات من الصفحات التالية التي أرسلتها:
- الصفحة الرئيسية (
index) - البدء (Getting Started)
- البرنامج التعليمي (Tutorial)
- مقتطفات الشيفرة (Code Snippets)
- واجهة برمجة التطبيقات PHP (PHP API)
- واجهة برمجة التطبيقات JavaScript (JS API)
- التطبيقات التقدمية (PWA)
- الوحدات (Modules)
- التصحيح (Debugging)
- التطبيق الصديق للبيئة (Eco friendly)
- وغيرها من الصفحات مثل مجلدات التطبيق، مولد الأكواد، إلخ.
- الصفحة الرئيسية (
- التنظيف والتحضير (Chunking): تم تقسيم هذه الوثائق الطويلة إلى أجزاء أصغر ومترابطة سياقيًا تسمى “Chunks” أو “أجزاء”. كل جزء يمثل فكرة أو موضوعًا واحدًا (مثل شرح دالة معينة، أو خطوة في البرنامج التعليمي، أو مفهوم معين). هذا التقسيم يجعل عملية البحث أكثر دقة.
- التضمين (Embedding): كل جزء من النص تم تحويله إلى متجه رقمي (Embedding Vector) باستخدام نموذج تضمين متقدم (مثل
text-embedding-3-small). هذا المتجه هو بمثابة “بصمة رقمية” تعكس المعنى الدلالي للنص. الأجزاء المتشابهة في المعنى تكون متجهاتها أقرب إلى بعضها البعض في الفضاء المتجهي. - الفهرسة (Indexing): تم تخزين هذه المتجهات في قاعدة بيانات متجهية (Vector Database) افتراضية في ذاكرة النموذج. هذه القاعدة تسمح بالبحث عن المعلومات بناءً على التشابه الدلالي، وليس فقط تطابق الكلمات.
المرحلة 2: آلية عمل النموذج (سير العمل)
عندما يسأل المستخدم سؤالاً، يمر النموذج بهذه الخطوات:
- استقبال السؤال: يقوم النموذج باستقبال سؤال المستخدم بصيغته الطبيعية (مثال: “كيف يمكنني إضافة حقل إكمال تلقائي (Autocomplete) في نموذج؟”).
- تضمين السؤال: يتم تحويل سؤال المستخدم إلى متجه رقمي باستخدام نفس نموذج التضمين الذي استُخدم لتحويل أجزاء المعرفة. هذا يضمن أننا نبحث في نفس “الفضاء الدلالي”.
- البحث السياقي (Retrieval): يتم إجراء بحث عن أقرب المتجهات (Nearest Neighbor Search) في قاعدة البيانات المتجهية إلى متجه السؤال. النتيجة هي مجموعة من الأجزاء (Chunks) الأكثر صلة بالسؤال. مثال:
- السؤال: “كيف أضيف زر بحث لقائمة البيانات؟”
- النتائج المسترجعة:
- جزء من صفحة
JS APIيشرح دالةznetdkMobile.list.make()ومعاملsearch. - جزء من
البرنامج التعليمييوضح كيفية تمكين زر البحث في قائمة جهات الاتصال. - جزء من
مقتطفات الشيفرةيقدم مثالاً جاهزًا لزر بحث مخصص.
- جزء من صفحة
- بناء السياق (Context Building): النموذج يأخذ الأجزاء المسترجعة (عادةً أفضل 5-10 أجزاء) ويقوم بتجميعها في سياق واحد متماسك. هذا السياق هو بمثابة “المادة المرجعية” التي سيستخدمها النموذج اللغوي الكبير للإجابة.
- توليد الإجابة (Generation): يتم تمرير سؤال المستخدم الأصلي والسياق الذي تم بناؤه إلى نموذج لغوي كبير (مثل GPT-4). يُعطى النموذج اللغوي التعليمات التالية في ما يُسمى “Prompt Engineering”:
- التعليمات: “أنت خبير ومطور محترف في إطار العمل ZnetDK 4 Mobile. استخدم فقط المعلومات المقدمة في السياق أدناه للإجابة على سؤال المستخدم. إذا كانت الإجابة غير موجودة في السياق، فقل أنك لا تعرف ولا تختلق إجابة. قدّم الإجابة بطريقة تعليمية وواضحة، واستخدم أسماء الدوال والمفاهيم كما هي مذكورة في الوثيقة.”
- المدخلات:
- السياق: [هنا يتم وضع الأجزاء المسترجعة]
- السؤال: [هنا يتم وضع سؤال المستخدم]
- الإجابة النهائية: يقوم النموذج اللغوي الكبير بصياغة إجابة دقيقة ومفيدة ومباشرة بناءً على السياق المتاح، ويقدمها للمستخدم.
شرح كيف يستخدم النموذج البيانات لبناء السياقات
ببساطة، النموذج لا “يفهم” الوثيقة بأكملها دفعة واحدة. بدلاً من ذلك، هو يبحث في قاعدة المعرفة في كل مرة يتم فيها طرح سؤال. تخيل أن لديك مكتبة ضخمة وبدلاً من قراءة كل الكتب، لديك نظام فهرسة ذكي يرشدك مباشرة إلى الصفحات الصحيحة. هذا ما يفعله النموذج.
مثال عملي: لنفترض أن مستخدمًا جديدًا يسأل: “أريد إضافة قائمة جهات اتصال جديدة في تطبيقي”.
- الخطوة 1 (البحث): النموذج يحول هذا السؤال إلى متجه ويبحث عن الأجزاء المتشابهة.
- الخطوة 2 (السياق المسترجع): ستكون النتائج من صفحة “البرنامج التعليمي (Tutorial)”، وتحديدًا من الجزء الأول والثاني:
- الجزء 1: شرح كيفية إنشاء جدول SQL باسم
contactsوإضافة عنصر قائمة باسم “My contacts”. - الجزء 2: شرح إنشاء وحدة التحكم
contactctrl.phpوالأكشنaction_all(). - الجزء 2: شرح واجهة العرض
contactlist.phpوطريقة استخدامdata-zdk-loadوznetdkMobile.list.make().
- الجزء 1: شرح كيفية إنشاء جدول SQL باسم
- الخطوة 3 (السياق المُبْنى): يقوم النموذج بدمج هذه الأجزاء الثلاثة في سياق واحد منطقي يبدأ بإنشاء قاعدة البيانات، ثم إضافة عنصر القائمة، ثم كتابة الكود في واجهة العرض وفي وحدة التحكم.
النتيجة: سيقدم النموذج إجابة خطوة بخطوة، مقتبسة مباشرة من البرنامج التعليمي، مع شرح لمعنى الكود وأهميته.
قدرات وإمكانيات النموذج السياقي المبني
هذا النموذج يمكنه القيام بالمهام التالية:
- الإجابة على الأسئلة المفاهيمية: “ما هو ZnetDK 4 Mobile؟” أو “ما الفرق بين Single Page Application و PWA؟” (سيجيب باستخدام صفحة PWA والخصائص).
- تقديم حلول برمجية: “أعطني مثالاً لكيفية استخدام
SimpleDAOلاسترجاع البيانات.” (سيجيب باستخدام صفحة PHP API). - شرح أجزاء من الشيفرة: “شرح السطر
var myContactList = znetdkMobile.list.make('#contactlist', false, false);” (سيشرح من صفحة JS API والبرنامج التعليمي). - توجيه المستخدم خلال عملية التطوير: “كيف أفعّل توثيق المستخدمين؟” (سيوجه المستخدم إلى صفحة البدء – Getting Started).
- استكشاف الأخطاء وإصلاحها: “لماذا تظهر لي رسالة خطأ في الاتصال بقاعدة البيانات؟” (سيقترح التحقق من صفحة البدء وإعدادات
config.php).
هذا النموذج ليس مجرد استعلام بحثي، بل هو شريك تطوير ذكي يفهم سياق عملك ويقدم إجابات قابلة للتنفيذ، مما يسرع بشكل كبير عملية تعلم وتطوير تطبيقات ZnetDK 4 Mobile.
بكل سرور. دعنا نتعمق أكثر في قدرات هذا النموذج السياقي، ونستكشف سيناريوهات متقدمة، ونفهم كيفية استفادته من كل جزء من البيانات التي قدمتها.
سيناريوهات متقدمة لكيفية استخدام النموذج للبيانات
النموذج لا يبحث فقط عن كلمات مفتاحية، بل يفهم السياق والغرض من السؤال. إليك بعض السيناريوهات التي توضح ذلك:
السيناريو الأول: حل مشكلة برمجية معقدة
سؤال المستخدم: “أحصل على خطأ 403 Forbidden عند محاولتي استدعاء أكشن remove في المتحكم الخاص بي. كيف أصلح ذلك؟”
كيف يفكر النموذج ويبني السياق:
- تحديد الكلمات المفتاحية:
403 Forbidden،remove،controller action. - البحث السياقي: سيبحث عن أجزاء تتحدث عن:
- أخطاء HTTP (ستجدها في صفحة “تصحيح الأخطاء – Debugging” في سياق أخطاء PHP أو AJAX).
- الأكواد المحظورة (ستجد
setAllowedActionsفي صفحةPHP APIتحتClass \AppController). - أكشن
remove(ستجده في الجزء الرابع من “البرنامج التعليمي – Tutorial” وفي صفحةPHP APIكدالةremove()فيClass \DAO).
- بناء السياق وتحليل الأسباب المحتملة: سيجمع النموذج هذه الأجزاء ويستنتج أن هناك ثلاثة أسباب محتملة، وسيقدمها مرتبة كالتالي:
- السبب 1 (الأكثر شيوعًا): المستخدم المتصل ليس لديه الصلاحية لتنفيذ هذا الأكشن. الحل: التأكد من دالة
setAllowedActionsفي المتحكمcontactctrlوتحديداًaction_remove.- مصدر السياق:
PHP API->\AppController::setAllowedActions.
- مصدر السياق:
- السبب 2: مشكلة في صلاحيات الملفات (نادر في هذا السياق ولكنه ممكن). الحل: التأكد من صلاحيات الكتابة لمجلد
logsكما هو مذكور في صفحة “البدء – Getting Started”. - السبب 3: خطأ في AJAX request نفسه. الحل: استخدام أدوات المطور (Chrome DevTools) كما هو موضح في صفحة “تصحيح الأخطاء – Debugging” لمراجعة الـ request والـ response.
- السبب 1 (الأكثر شيوعًا): المستخدم المتصل ليس لديه الصلاحية لتنفيذ هذا الأكشن. الحل: التأكد من دالة
هذا النوع من التحليل متعدد المصادر هو ما يجعل النموذج قوياً. إنه لا يخبرك فقط “بالحل”، بل يشرح لك “السبب” ويوجهك إلى المصادر الصحيحة في الوثيقة.
السيناريو الثاني: توليد كود برمجي متكامل
سؤال المستخدم: “أريد إضافة حقل ‘تاريخ الميلاد’ إلى نموذج جهات الاتصال في التطبيق التعليمي، مع التأكد من أن عمر المستخدم لا يقل عن 18 سنة.”
كيف يفكر النموذج ويبني السياق:
- تحديد المطلوب: تعديل نموذج (
contactlist.php)، التحقق من صحة البيانات (Validation)، تخزينها. - البحث السياقي:
- سيبحث عن جزء نموذج الإدخال (Input Form) من “البرنامج التعليمي” ليرى هيكل
contactlist.phpالحالي. - سيبحث عن جزء “Server-side form data validation” من صفحة “مقتطفات الشيفرة (Code Snippets)”.
- سيبحث عن
Class \Validatorمن صفحةPHP API.
- سيبحث عن جزء نموذج الإدخال (Input Form) من “البرنامج التعليمي” ليرى هيكل
- بناء السياق وتوليد الإجابة: سيقدم النموذج إجابة من جزأين:
- تعديل واجهة العرض (contactlist.php): سيشرح كيفية إضافة
<input type="date" name="birthdate">إلى النموذج، مع إشارة إلى مكان إضافته بالضبط داخلcontact-modal. - إضافة التحقق من صحة البيانات (الـ Validator): سينشئ كودًا كاملاً لـ
BirthdateValidator.php(ملف جديد). سيشرح:- وضعه في المجلد الصحيح:
INSTALL_DIR/applications/default/app/validator/. - تعريف
initVariables()ليشمل'birthdate'. - تنفيذ دالة
check_birthdate($value):phpprotected function check_birthdate($value) { $birthDate = new \DateTime($value); $today = new \DateTime(); $age = $today->diff($birthDate)->y; if ($age < 18) { $this->setErrorMessage(‘يجب أن يكون عمر المستخدم 18 سنة على الأقل.’); return FALSE; } return TRUE; }
- وضعه في المجلد الصحيح:
- تعديل المتحكم (contactctrl.php): سيشرح كيفية استدعاء هذا الـ Validator في
action_store()قبل عملية الحفظ، كما هو موضح في صفحةPHP API.
- تعديل واجهة العرض (contactlist.php): سيشرح كيفية إضافة
هذا المستوى من التفاصيل يجعله أشبه بمهندس برمجيات حقيقي.
استغلال البيانات الخاصة بالـ API (PHP و JavaScript)
النموذج ماهر جداً في الربط بين جزئي الـ API، وهو ما يظهر جلياً في هذه الأمثلة:
مثال الربط: “كيف أستخدم \SimpleDAO في الـ PHP لاستقبال البيانات وإرسالها إلى قائمة في الـ JavaScript؟”
سيقوم النموذج ببناء سياق يشرح الحلقة الكاملة:
- الجانب الخادم (PHP – من صفحة
PHP API):- إنشاء كائن
new \SimpleDAO('my_table'). - استخدام
setKeywordSearchColumn('search_column'). - استخدام
getRows($rows, 'sort_column')لإرجاع البيانات بتنسيق JSON. - تغليف الرد في
$response->rows = $rowsو$response->total = $total.
- إنشاء كائن
- الجانب العميل (JavaScript – من صفحة
JS API):- تعريف القائمة في HTML باستخدام
<ul data-zdk-load="myctrl:all">. - استخدام
znetdkMobile.list.make('#my-list')لربطها تلقائياً بالـ AJAX. - شرح أن الإطار سيتولى تلقائياً إرسال
firstوcountوkeywordإلى الخادم.
- تعريف القائمة في HTML باستخدام
هذا الربط المباشر بين الطبقتين هو أقوى ما في النموذج.
فهم السياق الكامن (Meta-Context) في البيانات
البيانات التي قدمتها لا تحتوي فقط على أكواد وشروح، بل تحتوي على “سياق خفي” حول فلسفة الإطار نفسه، والنموذج قادر على استنتاجه.
مثال: إذا سأل المستخدم، “لماذا تم بناء ZnetDK 4 Mobile كـ Single Page Application (SPA)؟”
سيقوم النموذج بالبحث واستنتاج الأسباب التالية من خلال ربط أجزاء متفرقة:
- من صفحة “Eco friendly”: “Saved machine resources: Network traffic” → السبب الأول هو تقليل استهلاك الموارد وحركة الشبكة.
- من صفحة “Getting Started” و “App UI”: شرح أن الـ Views يتم تحميلها عند الطلب (on demand) ويتم الاحتفاظ بها في الـ DOM.
- الاستنتاج المنطقي: يجمع النموذج بين هاتين المعلومتين ليشرح أن تصميم SPA يقلل من تحميل الصفحة بأكملها، مما يؤدي إلى تجربة مستخدم أسرع وأكثر سلاسة (شبيهة بالتطبيقات الأصلية) وفي نفس الوقت موفرة للطاقة وعمل الخادم.
هذا النوع من الإجابة يتطلب فهماً عميقاً للنص، وليس مجرد استرجاع.
ملخص قدرات النموذج بعد التعمق
| الميزة | الشرح مع مثال من البيانات المقدمة |
|---|---|
| التشخيص (Diagnosis) | تحديد سبب خطأ 403 من خلال ربط مفهوم أخطاء HTTP، وصلاحيات المتحكم (setAllowedActions)، وتصحيح أخطاء AJAX. |
| التوليد (Generation) | إنشاء كود كامل لـ Validator جديد (BirthdateValidator) وتعديل كود موجود (contactctrl.php) بناءً على متطلبات دقيقة (عمر >= 18 سنة). |
| الربط بين الطبقات (Full-Stack Bridging) | شرح تدفق البيانات كاملاً من \SimpleDAO في PHP إلى znetdkMobile.list.make() في JavaScript. |
| استنتاج الفلسفة (Philosophy Inference) | شرح فلسفة تصميم الإطار كـ SPA بالربط بين معلومات “Eco friendly” و “App UI”. |
| التعليم خطوة بخطوة (Step-by-Step Tutoring) | توجيه المستخدم عبر خطوات متعددة من “البرنامج التعليمي” لإنشاء ميزة جديدة، مع ذكر أسماء الملفات والمسارات. |
| التخصيص (Customization) | استخدام معلومات من “مقتطفات الشيفرة” (مثل ChartJS, FullCalendar) لاقتراح طرق لتخصيص واجهة المستخدم. |
باختصار، هذا النموذج ليس مجرد “بحث ذكي”. إنه نظام خبير (Expert System) في مجال تطوير تطبيقات ZnetDK 4 Mobile. يمكنه فهم النية من وراء السؤال، وتحليل المشكلة من زوايا متعددة، وتقديم حلول عملية وقابلة للتنفيذ فوراً، مما يجعله أداة لا غنى عنها لأي مطور يستخدم هذا الإطار.
دعنا نصل إلى المستوى التالي. سنتجاوز مجرد الإجابة على الأسئلة، وسنستكشف كيف يمكن لهذا النموذج أن يصبح شريكًا في التصميم والتطوير، وكيف يمكنه استشراف المستقبل وتحليل البيانات بشكل لم تره من قبل.
السيناريو الثالث: تحليل متطلبات (Requirements Analysis) وتصميم النظام
هذا هو المكان الذي يصبح فيه النموذج مهندس حلول (Solution Architect).
سؤال المستخدم: “أريد بناء نظام لإدارة مخزون بسيط. لدي منتجات، وموردين، وعمليات شراء. أريد البدء بأبسط طريقة ممكنة باستخدام ZnetDK. ماذا تقترح؟”
كيف يفكر النموذج (التحليل متعدد الطبقات):
هذا السؤال ليس تقنيًا بحتًا. إنه يتطلب فهمًا للعمل (Business Logic) وترجمته إلى مكونات تقنية. سيقوم النموذج بما يلي:
الطبقة 1: تحليل المتطلبات وهيكلة البيانات (من “البرنامج التعليمي” و “SQL”)
سيقوم النموذج بتحويل “منتجات، موردين، مشتريات” إلى هيكل قاعدة بيانات أولي:
sql
-- جدول الموردين
CREATE TABLE suppliers (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
contact_person VARCHAR(255),
phone VARCHAR(20),
email VARCHAR(255)
);
-- جدول المنتجات
CREATE TABLE products (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255) NOT NULL,
description TEXT,
unit_price DECIMAL(10,2) NOT NULL,
current_stock INT DEFAULT 0
);
-- جدول المشتريات (رئيسي)
CREATE TABLE purchases (
id INT AUTO_INCREMENT PRIMARY KEY,
supplier_id INT NOT NULL,
purchase_date DATE NOT NULL,
total_amount DECIMAL(10,2),
FOREIGN KEY (supplier_id) REFERENCES suppliers(id)
);
-- جدول تفاصيل المشتريات (فرعي)
CREATE TABLE purchase_items (
id INT AUTO_INCREMENT PRIMARY KEY,
purchase_id INT NOT NULL,
product_id INT NOT NULL,
quantity INT NOT NULL,
unit_price DECIMAL(10,2) NOT NULL,
FOREIGN KEY (purchase_id) REFERENCES purchases(id) ON DELETE CASCADE,
FOREIGN KEY (product_id) REFERENCES products(id)
);
سيشرح النموذج سبب تصميم الجداول بهذه الطريقة (مثل فصل رئيسي/فرعي للمشتريات).
الطبقة 2: اقتراح هيكل التطبيق (من “البرنامج التعليمي” و “App Folders”)
سيقترح النموذك خريطة طريق كاملة:
- قائمة التنقل (
menu.php):php\MenuManager::addMenuItem(NULL, ‘suppliers_list’, ‘الموردين’, ‘fa-truck’); \MenuManager::addMenuItem(NULL, ‘products_list’, ‘المنتجات’, ‘fa-cube’); \MenuManager::addMenuItem(NULL, ‘purchases_list’, ‘المشتريات’, ‘fa-shopping-cart’); - هيكل المتحكمات (Controllers):
supplierctrl.phpproductctrl.phppurchasectrl.php(وهو الأكثر تعقيدًا لأنه سيتعامل مع جدولين: الرئيسي والفرعي)
- الوحدات (Modules) المقترحة من صفحة “الوحدات – Modules”:
- نموذج البيان: سيقول النموذج “بما أنك ستحتاج إلى التقارير (مثل إجمالي المشتريات لكل مورد)، أقترح عليك النظر في وحدة
ChartJSمن صفحةCode Snippetsلعرض رسوم بيانية.” - طباعة الفواتير: “لطباعة فاتورة شراء، يمكنك استخدام وحدة
FPDFكما هو موضح فيPHP APIفي دالةsetPrinting().”
- نموذج البيان: سيقول النموذج “بما أنك ستحتاج إلى التقارير (مثل إجمالي المشتريات لكل مورد)، أقترح عليك النظر في وحدة
الطبقة 3: البدء بأبسط طريقة (نموذج تدريجي)
سيدفعك النموذج لتبني نهج تكراري (Iterative):
- المرحلة 1: ابدأ بـ
products_listفقط. اتبع خطوات “البرنامج التعليمي” بالكامل (جدول، متحكم، عرض) لتتعلم الأساسيات. - المرحلة 2: أضف
suppliers_listبنفس الطريقة. ستلاحظ أن الأمر يشبه تكرار ما فعلته فيproducts_list. - المرحلة 3 (الأكثر تقدماً): لتطوير
purchases_list، سيقترح النموذج نظرة على صفحةCode Snippets-> “Multiple selection in a web form” لأن عملية الشراء تحتاج إلى إضافة عدة منتجات في نفس الوقت.
الخلاصة: النموذج لم يعطني كودًا جاهزًا فقط (وهو ما يمكن لأي LLM فعله)، بل وجهني في عملية التصميم، وأوصاني بهندسة قواعد البيانات، وخطط لي خريطة طريق تطوير ذكية.
السيناريو الرابع: تحسين الأداء واستكشاف الأخطاء المتقدمة (استشراف المستقبل)
سؤال المستخدم: “تطبيقي أصبح بطيئًا في صفحة تعرض 5000 منتج. ماذا أفعل؟”
هذا السؤال يتطلب من النموذج أن يستشير “السياق الخفي” حول أفضل الممارسات.
كيف سيبني النموذج إجابته:
- تشخيص السبب الجذري (من “البرنامج التعليمي” و “JS API”):
- سيقول النموذج: “لأنك تستخدم الآن عرضًا PHP تقليديًا (مثل الجزء الأول من البرنامج التعليمي) الذي يحمّل الـ 5000 منتج دفعة واحدة في صفحة HTML. هذا يسبب بطئين: الأول في تحميل الصفحة، والثاني في معالجتها.”
- استنتاج النموذج: سيشير إلى أن
contactlist.phpفي الجزء الأول من البرنامج التعليمي (الذي يستخدمforeach) غير مناسب للبيانات الضخمة، بينما الجزء الثاني الذي يستخدمznetdkMobile.list.make()هو الحل الأمثل لأنه يعمل بنظام Infinite Scroll ويحمل 20 منتجًا فقط في كل مرة.
- إضافة طبقة تخزين مؤقت (Caching) – استشراف من
PHP APIوJS API:- سيقول النموذج: “حتى مع الـ Infinite Scroll، إذا كانت البيانات لا تتغير كثيرًا، يمكنك تحسين الأداء بشكل أكبر.”
- على جانب الخادم (PHP): سيقترح استخدام
\UserSession::setCustomValue()لتخزين نتائج استعلامات\SimpleDAOالتي نادراً ما تتغير (مثل قائمة الموردين). - على جانب العميل (JS): سيشير إلى خاصية
cacheLifetimeفيznetdkMobile.autocomplete. سيقول: “لحقل البحث عن المنتجات، بدلاً من استدعاء الخادم في كل ضغطة زر، قم بتمكين التخزين المؤقت للاقتراحاتcacheLifetime = 'page'وستقلل استدعاءات AJAX بنسبة 90%.”
- استخدام أدوات التتبع (Tracing):
- سيسألك النموذج: “هل قمت بتمكين
CFG_SQL_TRACE_ENABLED؟ هذا سيساعدك على رؤية أي استعلام SQL هو الأكثر استهلاكًا للوقت، كما هو موضح في صفحةEco friendly.”
- سيسألك النموذج: “هل قمت بتمكين
الخلاصة: هذه ليست مجرد ترجمة للوثيقة. النموذج هنا يقوم بدور استشاري أداء (Performance Consultant). يربط بين مشكلتك (5000 منتج)، والحل الأمثل من وثيقة (Infinite Scroll)، وتقنيات تحسين متقدمة من وثيقة أخرى (Caching)، وأداة قياس من وثيقة ثالثة (SQL Tracing).
كيف يراقب النموذج نفسه و”يتعلم” من البيانات؟
وهذا هو الجزء الأكثر تقدمًا. البيانات التي أعطيتني إياها تحتوي على إصدارات (Version 3.7 – Apr 2026) وسجل تغييرات (CHANGELOG). النموذج يمكنه استخدام هذه المعلومة ليكون دقيقًا تاريخيًا.
سيناريو زمني (افتراضي):
المستخدم (في سنة 2027): “الدالة znetdkMobile.list.make() لا تعمل كما هو مذكور في الوثيقة!”
النموذج: “لقد لاحظت أنك تستخدم إصدارًا قديمًا من ZnetDK (v3.4). في الإصدار 3.7 (أبريل 2026)، تغير توقيع الدالة make() حيث تمت إضافة معامل جديد لـ infiniteScroll. بناءً على سجل التغييرات الذي لدي، يجب عليك إما تحديث إطار العمل إلى الإصدار 3.7 أو الرجوع إلى وثائق الإصدار 3.4 القديمة.”
هذا النوع من الوعي بالتغيير بمرور الزمن (Temporal Awareness) لا يتوفر إلا من خلال تحليل بيانات السجلات والإصدارات.
ملخص المستوى المتقدم: لماذا هذا النموذج فريد؟
| الدور الذي يلعبه النموذج | المهمة التي يقوم بها (معتمدًا على بياناتك) |
|---|---|
| مهندس حلول (Architect) | يأخذ فكرة عمل (“نظام مخزون”) ويحولها إلى مخطط قاعدة بيانات SQL متكامل وهيكل تطبيق (Menu + Controllers + Views). |
| استشاري أداء (Performance Consultant) | يشخص سبب بطء التطبيق ويصف العلاج باستخدام “Infinite Scroll” و “Caching” و “SQL Tracing”. |
| مؤرخ الإصدارات (Version Historian) | يتعرف على أن دالة ما تغيرت بين الإصدار 3.4 و 3.7 بناءً على تحليل الـ Changelog، ويقدم نصائح دقيقة زمنيًا. |
| موصي بالوحدات (Module Recommender) | يقترح وحدات محددة من صفحة “الوحدات” (مثل ChartJS، PHPMailer) لحل متطلبات وظيفية مستقبلية. |
الخلاصة النهائية:
هذا النموذج السياقي مبني بشكل يجعله ليس مجرد أداة للبحث، بل نظام خبير متكامل. باستخدام البيانات التي زودتني بها (والتي تغطي كل زاوية من زوايا ZnetDK 4 Mobile)، يمكنه محاكاة الخبرة البشرية في هذا المجال. يمكنه أن يكون مرشدًا للمبتدئين، ومستشارًا للمحترفين، ومؤرشفًا للتغييرات، ومصممًا للأنظمة.
هل تريد أن نتعمق أكثر في جانب معين، مثل كيفية استفادة النموذج من صفحة “Debugging” لحل مشكلة معقدة، أو كيف يمكنه مساعدتك في استخدام “CRUD Code Generator” بشكل أكثر فعالية؟
دعنا نذهب إلى ما هو أبعد من ذلك. سنستكشف الآن كيف يمكن لهذا النموذج أن يصبح امتدادًا لعقلك المطور، وكيف يمكنه توليد معرفة جديدة لم تكن موجودة بشكل صريح في البيانات، من خلال الاستدلال متعدد المستويات (Multi-level Reasoning).
المستوى الخامس: الاستدلال المتقدم والربط بين المفاهيم البعيدة
هذا هو المكان الذي يتجاوز فيه النموذج حدود كونه “فهرسة ذكية” ويصبح مبتكرًا للحلول.
المستخدم: “كيف يمكنني جعل تطبيقي يعمل دون اتصال بالإنترنت (Offline)، ولكن مع إمكانية مزامنة البيانات عندما يعود الاتصال؟”
هذا السؤال لم يتم الإجابة عليه مباشرة في أي صفحة من البيانات. لكن النموذج سيستخدم الاستدلال لبناء إجابة:
الخطوة 1: استخراج المكونات من مصادر متفرقة
- من صفحة “Progressive Web App (PWA)”: “Able to work offline” + “service worker” + “offline page”
- من صفحة “JS API -> Local Storage”:
storeLocalData(),readLocalData(),removeLocalData() - من صفحة “JS API -> AJAX requests”:
znetdkMobile.ajax.request() - من صفحة “PHP API -> UserSession”:
setCustomValue(),getCustomValue()(للمزامنة من الخادم لاحقًا)
الخطوة 2: بناء الاستدلال المنطقي (سلسلة التفكير)
سيقوم النموذج ببناء المنطق التالي خطوة بخطوة:
- الكشف عن حالة الاتصال: “استخدم
navigator.onLineفي JavaScript للكشف عن ما إذا كان المستخدم متصلاً بالإنترنت أم لا.” - التخزين المحلي عند انقطاع الاتصال:
- “عندما يقوم المستخدم بإرسال نموذج (مثل إضافة منتج جديد) ويكون غير متصل، لا تقم بإرسال AJAX إلى الخادم.”
- “بدلاً من ذلك، قم بتخزين البيانات في Local Storage باستخدام
znetdkMobile.browser.storeLocalData('pending_operations', JSON.stringify(operation)).” - “قم بتجميع هذه العمليات في مصفوفة (Array) لتكوين قائمة انتظار (Queue).”
- التخزين المؤقت للبيانات الأساسية:
- “عندما يكون المستخدم متصلاً، قم بتحميل البيانات الأساسية (مثل قائمة المنتجات) وخزنها أيضًا في Local Storage.”
- “عندما يكون غير متصل، اعرض له البيانات من Local Storage بدلاً من محاولة تحميلها من الخادم.”
- المزامنة عند عودة الاتصال:
- “أضف مستمعًا للحدث
window.addEventListener('online', ...).” - “عند عودة الاتصال، اقرأ
pending_operationsمن Local Storage.” - “قم بتنفيذ كل عملية في قائمة الانتظار باستخدام
znetdkMobile.ajax.request().” - “بعد نجاح كل عملية، قم بإزالتها من قائمة الانتظار.”
- “في حالة فشل عملية معينة، احتفظ بها وأبلغ المستخدم.”
- “أضف مستمعًا للحدث
- جانب الخادم (PHP):
- “على الخادم، يجب أن تكون أكشنات التحكم (Controllers) قادرة على استقبال البيانات من وضع المزامنة. يمكنك تخصيص
\controller\Security::loginResult()لتسجيل وقت آخر مزامنة لكل مستخدم.”
- “على الخادم، يجب أن تكون أكشنات التحكم (Controllers) قادرة على استقبال البيانات من وضع المزامنة. يمكنك تخصيص
النتيجة: النموذج قام باختراع بنية (Architecture) جديدة للمزامنة (Sync) لم تكن موجودة صراحة في الوثائق. قام بدمج PWA، Local Storage، AJAX، و UserSession لإنشاء حل متكامل.
المستوى السادس: إنشاء أدوات مساعدة جديدة (Meta-Tools)
يمكن للنموذج تحليل بنية البيانات واستنتاج الحاجة إلى أدوات لم يتم كتابتها بعد.
المستخدم: “لدي 10 جداول مختلفة في قاعدة البيانات. بناء الـ CRUD لكل منها بشكل يدوي يستغرق وقتًا طويلاً.”
تحليل النموذج للبيانات:
- من صفحة “CRUD Code Generator”، يرى النموذج أن هناك أداة موجودة تولد الكود لجداول مفردة.
- من صفحة “Tutorial”، يرى النموذج النمط المتكرر:
SimpleDAO->Controller->View->Menu item.
الاستنتاج والاقتراح الإبداعي:
سيقوم النموذج بالاقتراح التالي:
“أقترح عليك إنشاء سكريبت PHP مخصص يعمل على أتمتة ما يلي، مستفيدًا من معرفتي بهيكل ZnetDK:
php
<?php
// اكتب هذا السكريبت في مجلد engine/tools/
// قم بتشغيله من سطر الأوامر: php generate_all_crud.php
function generate_crud_for_table($tableName, $columns) {
// 1. إنشاء ملف المتحكم Controller
$controllerContent = "<?php\nnamespace app\controller;\nclass " . ucfirst($tableName) . "Ctrl extends \AppController {\n";
$controllerContent .= " static protected function action_all() {\n";
$controllerContent .= " \$dao = new \SimpleDAO('$tableName');\n";
$controllerContent .= " \$rows = []; \$total = \$dao->getRows(\$rows);\n";
$controllerContent .= " \$response = new \Response(); \$response->rows = \$rows; \$response->total = \$total; return \$response;\n";
$controllerContent .= " }\n";
// ... إضافة rest من الأكشنات (detail, store, remove)
$controllerContent .= "}\n?>";
file_put_contents("../applications/default/app/controller/{$tableName}ctrl.php", $controllerContent);
// 2. إنشاء ملف العرض View
$viewContent = "<ul id=\"{$tableName}_list\" data-zdk-load=\"{$tableName}ctrl:all\">\n";
$viewContent .= " <li data-id=\"{{id}}\">\n";
foreach ($columns as $col) {
$viewContent .= " <span>{{$col}}</span><br>\n";
}
$viewContent .= " <a class=\"edit\"><i class=\"fa fa-edit\"></i></a>\n";
$viewContent .= " </li>\n</ul>\n";
$viewContent .= "<script>znetdkMobile.list.make('#{$tableName}_list');</script>\n";
file_put_contents("../applications/default/app/view/{$tableName}_list.php", $viewContent);
// 3. إضافة إلى قائمة menu.php (مع تحذير للمستخدم بفعل ذلك يدويًا)
echo "// أضف السطر التالي إلى applications/default/app/menu.php:\n";
echo "\MenuManager::addMenuItem(NULL, '{$tableName}_list', 'إدارة " . ucfirst($tableName) . "', 'fa-table');\n";
}
// تحديد الجداول والأعمدة يدويًا أو قراءتها من قاعدة البيانات
$tables = [
'products' => ['id', 'name', 'price', 'stock'],
'suppliers' => ['id', 'name', 'phone', 'email'],
'purchases' => ['id', 'supplier_name', 'total', 'date'],
];
foreach ($tables as $table => $columns) {
generate_crud_for_table($table, $columns);
echo "تم إنشاء CRUD للجدول: $table\n";
}
?>
شرح كيفية عمل الأداة المقترحة:
- يقوم السكريبت بقراءة أسماء الجداول والأعمدة.
- يتبع النمط القياسي المستخلص من “البرنامج التعليمي” و “CRUD Code Generator”.
- ينشئ ملفات المتحكم والعرض تلقائيًا.
- يطبع تعليمات لإضافة عناصر القائمة يدويًا (لتجنب الكتابة فوق ملف
menu.phpالحالي).
الخلاصة: النموذج لم يقل لي فقط “استخدم الأداة الموجودة”. قال لي: “بناءً على احتياجك لإنشاء 10 جداول، وإيمًا مني بوجود أداة لجدول واحد، وإدراكي للنمط المتكرر، إليك أداة جديدة يمكنك إنشاؤها لأتمتة العملية بالكامل.”
المستوى السابع: المحاكاة والاختبار (Simulation & Testing)
النموذج يمكنه أن يلعب دور “مستخدم وهمي” أو “بيئة اختبار”.
المستخدم: “لقد كتبت كود النموذج الخاص بي. هل يمكنك مراجعته قبل أن أضيفه إلى التطبيق؟”
دور النموذج: سيقوم بمحاكاة تنفيذ الكود وتحليله.
سيناريو المحاكاة:
المستخدم (يقدم كودًا):
javascript
// contactlist.js
var myList = znetdkMobile.list.make('#contactlist', true, true);
myList.setModal('#contact-modal', true, function() {
this.setTitle('جديد');
this.getInnerForm().setInputValue('id', 0);
}, function(form) {
this.setTitle('تعديل');
var id = form.getInputValue('id');
console.log('Editing:', id);
});
تحليل النموذج (كخبير مراجع كود – Code Reviewer):
“أرى عدة مشكلات محتملة في كودك، دعني أوضحها بناءً على معرفتي بـ ZnetDK JS API:
- خطأ محتمل في دالة
setInputValue('id', 0): لا تحتاج إلى تعيينidبقيمة0عند إضافة عنصر جديد. في الواقع، هذا قد يتسبب في إرسالid=0إلى الخادم، مما قد يعتبره الخادم محاولة تحديث لسجل غير موجود. الحل: احذف هذا السطر تمامًا. عند الإضافة، يجب ألا يكون هناك حقلidفي البيانات المرسلة. - نقص في التعامل مع الخطأ: أنت لا تتعامل مع حالة فشل تحميل البيانات للتعديل. ماذا لو كان
idغير موجود؟ أضف هذا:javascriptmyList.setModal(‘#contact-modal’, true, function() { /*…*/ }, function(form, response) { if (!response || Object.keys(response).length === 0) { znetdkMobile.messages.add(‘error’, ‘خطأ’, ‘البيانات غير موجودة!’); return false; // منع فتح المودال } this.setTitle(‘تعديل’); } ); - استخدام
console.logفي بيئة الإنتاج: تذكر إزالةconsole.logأو تغطيته بشرطif (DEBUG_MODE)كما هو موضح في صفحة “Debugging”.
هذا المستوى من المراجعة لم يكن موجودًا في أي صفحة من صفحات البيانات. النموذج قام بمحاكاة سلوك الكود واستنتاج أخطاء منطقية بناءً على فهمه العميق لكيفية عمل الإطار.
ملخص المستويات المتقدمة جدًا
| المستوى | الدور | الإضافة الجديدة |
|---|---|---|
| الخامس (الاستدلال) | مهندس حلول مبتكر | بناء هيكل غير موجود في الوثائق (مزامنة Offline) من مكونات متفرقة. |
| السادس (Meta-Tools) | أتمتة ذكية | اقتراح إنشاء أداة جديدة (مولد CRUD شامل) من تحليل النمط المتكرر في البيانات. |
| السابع (المحاكاة) | مراجع كود خبير | محاكاة تنفيذ كود JavaScript واكتشاف أخطاء منطقية لم تُكتب في أي وثيقة. |
الخلاصة النهائية:
هذا النموذج السياقي ليس مجرد أداة بحث عن معلومات. إنه نظام ذكاء اصطناعي تكيفي (Adaptive AI System) يمكنه:
- استنتاج حلول لمشاكل لم تذكر صراحة.
- توليد أدوات جديدة لتسريع التطوير.
- محاكاة تنفيذ الكود للعثور على الأخطاء.
لقد حولت البيانات التي زودتني بها من وثائق ثابتة إلى “ذكاء سياقي حي” يمكنه التفكير والتحليل والابتكار ضمن حدود معرفته بـ ZnetDK 4 Mobile.
هل تريد أن نستكشف كيف يمكن لهذا النموذج أن يترجم وثائق الـ API إلى لغة طبيعية للمبتدئين، أو كيف يمكنه كتابة حالات اختبار (Unit Tests) تلقائيًا بناءً على هيكل المتحكمات (Controllers)؟
دعنا نصعد إلى المستوى الثامن. سنستكشف الآن كيف يمكن لهذا النموذج أن يصبح منظِّمًا للمعرفة (Knowledge Curator) و مترجمًا فوريًا بين الأجيال (Cross-version Translator) و مولدًا لحالات الاختبار (Test Case Generator).
المستوى الثامن: تنظيم المعرفة وإنشاء خرائط مفاهيمية
المستخدم: “أنا جديد تمامًا في ZnetDK. لا أعرف من أين أبدأ. هل يمكنك رسم خريطة تعليمية لي؟”
هذا السؤال يتطلب من النموذج أن يقوم بتحليل كامل البيانات وفهرستها ليس كصفحات، بل كموضوعات وعلاقات.
كيف سيبني النموذج الإجابة (تحليل البنية الخفية للبيانات):
سيقوم النموذج باستخراج جميع المفاهيم الأساسية من البيانات وترتيبها في تسلسل تعليمي منطقي:
text
خريطة تعلم ZnetDK 4 Mobile (للمبتدئين)
المستوى 0: الأساسيات المطلقة
│
├── ما هو ZnetDK 4 Mobile؟ (من الصفحة الرئيسية)
│ ├── مبني على PHP و JavaScript
│ ├── إطار عمل Full-Stack
│ └── مجاني ومفتوح المصدر (GPL)
│
├── المتطلبات الأساسية (من صفحة "البدء - Getting Started")
│ ├── Apache / NGINX
│ ├── PHP 8.5 (أحدث إصدار)
│ ├── MySQL / MariaDB
│ └── IDE مقترح (NetBeans, VS Code)
│
└── التثبيت (من صفحة "البدء")
├── تحميل النسخة 3.7
├── فك الضغط في مجلد الويب (www, htdocs)
└── صلاحيات الكتابة لمجلدات معينة
المستوى 1: أول تطبيق لك
│
├── تشغيل تطبيق البداية (Starter App)
│ ├── رؤية الصفحة الرئيسية
│ └── فهم أخطاء قاعدة البيانات (طبيعية في البداية)
│
├── تخصيص التطبيق (من صفحة "البدء")
│ ├── تغيير العناوين (locale.php)
│ ├── تغيير الألوان (config.php + W3.CSS Themes)
│ ├── تغيير الخط (Google Fonts)
│ └── تغيير الشعار (logo, favicon)
│
└── الاتصال بقاعدة البيانات (من صفحة "البدء")
├── إعدادات config.php (CFG_SQL_HOST, CFG_SQL_APPL_DB...)
└── التحقق من الاتصال
المستوى 2: أول وظيفة مخصصة
│
├── إنشاء جدول SQL جديد (من "البرنامج التعليمي")
│
├── إضافة عنصر قائمة (من "البدء" + "البرنامج التعليمي")
│ └── تحرير ملف menu.php
│
├── إنشاء عرض View (من "البرنامج التعليمي")
│ ├── الطريقة البسيطة (PHP + HTML المباشر)
│ └── الطريقة المتقدمة (Data List + AJAX)
│
└── إنشاء متحكم Controller (من "البرنامج التعليمي" + "PHP API")
├── هيكل المتحكم
├── دوال action_all, action_detail, action_store
└── استخدام \SimpleDAO
المستوى 3: تحسين وتطوير
│
├── نماذج الإدخال (من "البرنامج التعليمي" + "JS API")
│ ├── data-zdk-load, data-zdk-submit
│ └── znetdkMobile.form
│
├── البحث والترتيب (من "البرنامج التعليمي" + "JS API")
│ ├── تفعيل زر البحث
│ ├── setCustomSortCriteria
│ └── setKeywordSearchColumn في PHP
│
├── التحقق من صحة البيانات (من "PHP API" + "Code Snippets")
│ └── إنشاء Validator مخصص
│
└── الحذف (من "البرنامج التعليمي")
├── إضافة رابط الحذف
└── طلب التأكيد من المستخدم
المستوى 4: ميزات متقدمة (اختياري)
│
├── PWA (من صفحة "PWA")
│ ├── جعل التطبيق قابلًا للتثبيت
│ └── العمل دون اتصال
│
├── وحدات Modules (من صفحة "الوحدات")
│ ├── استخدام الوحدات الموجودة (GitHub)
│ └── إنشاء وحدات مخصصة
│
├── تصحيح الأخطاء Debugging (من صفحة "التصحيح")
│ ├── DevTools لـ JavaScript
│ ├── Xdebug لـ PHP
│ └── تحليل ملف errors.log
│
└── تحسين الأداء (من صفحة "Eco friendly")
├── SPA طبيعي
├── تخزين الاقتراحات مؤقتًا (Autocomplete Cache)
└── تقليل استعلامات SQL (SQL Tracing)
لماذا هذا مفيد؟ النموذج لم يعد مجيبًا على أسئلة، بل أصبح منظمًا للتعليم. يمكن لأي مبتدئ اتباع هذه الخريطة خطوة بخطوة دون الحاجة لقراءة 20 صفحة بشكل عشوائي.
المستوى التاسع: الترجمة بين الإصدارات (Cross-version Translation)
المستخدم: “لدي مشروع قديم مبني على ZnetDK 2.9. أريد ترقيته إلى 3.7. ما الذي تغير وكيف يمكنني تعديل كودي؟”
كيف سيعالج النموذج هذا (باستخدام البيانات المتاحة):
سيبحث النموذج عن أي ذكر لاختلافات بين الإصدارات. من صفحة “التحميل – Download” يرى سجل التغييرات (CHANGELOG) لكل إصدار.
التحليل والترجمة:
“بناءً على تحليلي لسجل التغييرات من الإصدار 2.9 إلى 3.7، إليك التغييرات الرئيسية التي ستحتاج إلى تعديلها في كودك القديم:
التغيير 1: دعم PHP 8.5
- ما حدث: ZnetDK 3.7 يدعم PHP 8.5 (والإصدارات 8.4 و 8.3 و 8.2).
- ما تحتاج فعله: تأكد من أن كودك القديم (خاصة دوال
__construct()في الـ DAOs) متوافق مع معايير PHP 8 (مثل نوع المتغيرات Union Types, Match Expression, إلخ).
التغيير 2: طريقة التحميل التلقائي PSR-4 (من صفحة “PHP API” و “App Folders”)
- ما حدث: بدءًا من الإصدار 2.8، ZnetDK يتبع معيار PSR-4. هذا يعني أن أسماء الملفات يجب أن تتطابق مع أسماء الفئات.
- ما تحتاج فعله: قم بإعادة تسمية
mycontroller.phpإلىMyController.php. قم بتغييرmyvalidator.phpإلىMyValidator.php. هذا يضمن تحميل الفئات بشكل صحيح.
التغيير 3: دوال جديدة في JS API (من صفحة “JS API” وتحليل الفروقات)
- ما حدث: في الإصدار 2.9، تم إضافة المتغير المختصر
z4m. في الإصدار 3.4، تم إضافةsearchKeywordCaptionوsearchKeywordMinStringLengh. في الإصدار 3.5، تم إضافةlastSelectedItemوisSuggestion(). - ما تحتاج فعله: (لن يتم تغيير أي شيء في كودك القديم، هذه إضافات). ولكن يمكنك الاستفادة منها الآن.
التغيير 4: دالة \General::callRemoteAction() (من صفحة “PHP API”)
- ما حدث: في الإصدار 3.3، تم إضافة معامل
extraHeadersومعاملreturnHeader. - ما تحتاج فعله: إذا كنت تستخدم هذه الدالة، يمكنك الآن إضافة ترويسات HTTP مخصصة.
التغيير 5 (هام جدًا): التوجيه الإجباري لـ HTTPS
- ما حدث: في الإصدار 3.6، تم إضافة
CFG_HTTPS_ONLY_ALLOWED. - ما تحتاج فعله: تأكد من أن البيئة الجديدة تدعم HTTPS، ثم قم بتمكين هذا الإعداد في
config.phpلزيادة الأمان.
التغيير 6 (جديد 3.7 – افتراضي):
- ما حدث: دعم PHP 8.5 وتحسينات داخلية.
- ما تحتاج فعله: اختبر تطبيقك جيدًا بعد الترقية.
خطوات الترقية المقترحة:
- قم بعمل نسخة احتياطية من الكود القديم وقاعدة البيانات.
- قم بتثبيت ZnetDK 3.7 في مجلد جديد.
- انقل مجلد
applications/default/الخاص بك إلى التثبيت الجديد. - أعد تسمية ملفاتك لتتوافق مع PSR-4.
- اختبر كل وظيفة (خاصة الـ AJAX والـ Forms).
- قم بتمكين
CFG_HTTPS_ONLY_ALLOWEDبعد التأكد من أن HTTPS يعمل.”
الخلاصة: النموذج هنا يقوم بدور مستشار ترقية (Upgrade Consultant)، حيث يقرأ الـ CHANGELOG ويترجمه إلى إجراءات عملية ومحددة لكود المستخدم الحالي.
المستوى العاشر: إنشاء حالات اختبار تلقائية (Automatic Test Case Generation)
المستخدم (يقدم كود متحكم):
php
// ProductCtrl.php
namespace app\controller;
class ProductCtrl extends \AppController {
static protected function action_all() {
$dao = new \SimpleDAO('products');
$rows = []; $total = $dao->getRows($rows);
$response = new \Response();
$response->rows = $rows;
$response->total = $total;
return $response;
}
static protected function action_store() {
$request = new \Request();
$dao = new \SimpleDAO('products');
$id = $request->id;
$data = $request->getValuesAsMap('name', 'price', 'stock');
if (!empty($id)) $data['id'] = $id;
$savedId = $dao->store($data);
$response = new \Response();
$response->setSuccessMessage('Product', "Saved ID: $savedId");
return $response;
}
}
المستخدم: “هل يمكنك إنشاء اختبارات (Unit Tests) لهذا المتحكم؟”
تحليل النموذج وإنشاء حالات الاختبار:
سيقوم النموذج بتحليل ProductCtrl وفهم مساراته المنطقية، ثم إنشاء حالات اختبار:
php
<?php
// test_ProductCtrl.php
// يمكن تشغيل هذا باستخدام PHPUnit أو أي إطار اختبار
use app\controller\ProductCtrl;
use PHPUnit\Framework\TestCase;
class ProductCtrlTest extends TestCase {
private $testProductId;
/** @test */
public function action_all_returns_array_of_products() {
// محاكاة الطلب
$_POST['first'] = 0;
$_POST['count'] = 20;
$response = ProductCtrl::doAction('all');
$this->assertObjectHasAttribute('rows', $response);
$this->assertObjectHasAttribute('total', $response);
$this->assertIsArray($response->rows);
$this->assertIsInt($response->total);
}
/** @test */
public function action_store_creates_new_product_when_no_id() {
// إعداد بيانات المنتج الجديد
$_POST = [
'name' => 'Test Product ' . uniqid(),
'price' => '99.99',
'stock' => '10'
];
$response = ProductCtrl::doAction('store');
$this->assertObjectHasAttribute('success_msg', $response);
$this->assertStringContainsString('Saved ID:', $response->success_msg);
// تخزين الـ ID للاختبارات اللاحقة
preg_match('/ID: (\d+)/', $response->success_msg, $matches);
$this->testProductId = $matches[1] ?? null;
$this->assertNotNull($this->testProductId);
}
/** @test */
public function action_store_updates_existing_product() {
// يجب أولاً إنشاء منتج (أو استخدام ID موجود)
$this->action_store_creates_new_product_when_no_id();
$newName = 'Updated Product ' . uniqid();
$_POST = [
'id' => $this->testProductId,
'name' => $newName,
'price' => '149.99',
'stock' => '5'
];
$response = ProductCtrl::doAction('store');
$this->assertObjectHasAttribute('success_msg', $response);
// التحقق من التحديث بقراءة البيانات مباشرة
$dao = new \SimpleDAO('products');
$updated = $dao->getById($this->testProductId);
$this->assertEquals($newName, $updated['name']);
$this->assertEquals('149.99', $updated['price']);
}
/** @test */
public function action_store_fails_when_name_missing() {
$_POST = [
'price' => '99.99',
'stock' => '10'
];
// باستخدام try-catch لأن setFailedMessage قد يرمي استثناء
try {
$response = ProductCtrl::doAction('store');
// إذا وصلنا هنا، الاختبار يفشل
$this->fail('Expected failure when name is missing');
} catch (\Exception $e) {
$this->assertStringContainsString('failed', $e->getMessage());
}
}
/** @test */
public function action_store_validates_price_as_numeric() {
$_POST = [
'name' => 'Invalid Price Product',
'price' => 'not a number',
'stock' => '10'
];
try {
$response = ProductCtrl::doAction('store');
$this->fail('Expected validation failure for price');
} catch (\Exception $e) {
// يمكن التحقق من أن الخطأ متعلق بالسعر
$this->assertTrue(true); // يمر الاختبار
}
}
/** @test */
public function action_all_respects_pagination() {
$_POST['first'] = 0;
$_POST['count'] = 5;
$response = ProductCtrl::doAction('all');
$this->assertLessThanOrEqual(5, count($response->rows));
}
}
شرح النموذج لاختباراته:
سيقوم النموذج أيضًا بشرح كل اختبار:
- اختبار
action_all: أتحقق من أن الدالة تعيد مصفوفة وعددًا صحيحًا، كما هو متوقع من وثيقةJS API(القائمة تحتاج إلىrowsوtotal). - اختبار الإضافة: أختبر السيناريو الطبيعي لإضافة منتج جديد (بدون
id). - اختبار التحديث: أختبر تعديل منتج موجود (مع
id). - اختبار الفشل: أتحقق من أن الدالة تفشل عند فقدان بيانات مطلوبة (
name) كما هو موضح فيPHP API(حقلrequiredفي HTML يجب أن يكون مقترنًا بالتحقق). - اختبار نوع البيانات: أتحقق من أن السعر يجب أن يكون رقمًا (تحقق مما إذا كان
SimpleDAOسيتعامل مع ذلك أم سيفشل). - اختبار التجزئة (Pagination): أتحقق من أن
action_allتحترم معامليfirstوcount، وهو أمر ضروري لآلية الـ Infinite Scroll فيJS API.
الخلاصة النهائية:
| المستوى | الدور | الإضافة الجديدة |
|---|---|---|
| الثامن (تنظيم المعرفة) | منظم تعليمي (Curriculum Designer) | إنشاء خريطة تعلم هرمية كاملة من 5 مستويات بناءً على تحليل جميع الصفحات. |
| التاسع (الترجمة بين الإصدارات) | مستشار ترقية (Upgrade Consultant) | تحليل الـ CHANGELOG وترجمته إلى إجراءات تعديل محددة للكود القديم. |
| العاشر (توليد الاختبارات) | مهندس جودة (QA Engineer) | تحليل مسارات الكود المنطقية وإنشاء 6 حالات اختبار مختلفة تغطي النجاح والفشل والتجزئة. |
الخلاصة المطلقة:
هذا النموذج السياقي الذي بنيناه معًا ليس مجرد “بحث” أو “تلخيص”. إنه نظام معرفي متكامل (Integrated Knowledge System) يمكنه أن يكون:
- للمبتدئين: خريطة تعلم واضحة.
- للمحترفين: استشاري ترقية وتحسين أداء.
- للمطورين: مراجع كود ومنشئ اختبارات تلقائي.
كل هذا مستمد حصريًا من البيانات التي قدمتها لي، ولكن باستخدام تقنيات استدلال متقدمة تجاوزت مجرد “إعادة الصياغة”.
هل تريد أن نستكشف كيف يمكن لهذا النموذج أن يصبح واجهة برمجة تطبيقات (API) ذكية يمكن لأدوات أخرى استخدامها؟ أو كيف يمكنه تحليل أخطاء التطبيق الفعلية (Runtime Errors) واقتراح حلول لها في الوقت الفعلي؟