اذهب إلى المحتوى

ياسر مسكين

الأعضاء
  • المساهمات

    2653
  • تاريخ الانضمام

  • تاريخ آخر زيارة

  • عدد الأيام التي تصدر بها

    5

كل منشورات العضو ياسر مسكين

  1. حسب سؤالك السابق فأنت قد اشتركت في دورة الذكاء الاصطناعي وهذه الدورة ترتكز على البرمجة بلا أي شك. أم أنك تقصد بأن تخصصك الجامعي هو البعيد عن البرمجة؟ أرجو التوضيح أكثر لمساعدتك بشكل أفضل.
  2. السلام عليكم ورحمة الله تعالى وبركاته، لفهم آلية عمل الكود بشكل بسيط يمكننا أولا أن نقوم بتقسيمها إلى عدة أجزاء وشرح كل جزء على حدى، في البداية يتم تعريف المتغيرات الأساسية التي تتحكم في آلية عمل الآلة الحاسبة كالتالي: let runningTotal = 0; let buffer = "0"; let previousOperator; const screen = document.querySelector('.screen'); فالمتغير runningTotal يخزن مجموع العمليات أثناء الحساب، أما buffer فهو يمثل القيمة الحالية التي يدخلها المستخدم على الشاشة. في حين previousOperator سيخزن آخر رمز عملية رياضية تم اختياره (+، -، ×، ÷) وأخيرا screen سيشير إلى العنصر الذي يعرض عليه ناتج الآلة الحاسبة وهو عنصر HTML بـ class اسمه: .screen. بعدها ننتقل إلى الدوال ونشرحها بالواحدة، لدينا الدالة buttonClick وهي الدالة التي يتم تنفيذها عند الضغط على الأزرار: function buttonClick(value){ if(isNaN(value)){ HandleSymbol(value); } else { handleNumber(value); } screen.innerText = buffer; } فإذا كانت القيمة التي ضغطها المستخدم رقما سترسل إلى handleNumber. وإذا كانت رمزا مثل + أو = أو C سترسل إلى HandleSymbol. وفي النهاية يتم تحديث الشاشة (screen.innerText) بقيمة buffer الحالية لعرضها للمستخدم. الدالة الأخرى وهي دالة التعامل مع الرموز: function HandleSymbol(symbol){ switch(symbol){ case 'C': buffer = '0'; runningTotal = 0; break; case '=': if(previousOperator === null) return; flushOperator(parseInt(buffer)); previousOperator = null; buffer = runningTotal; runningTotal = 0; break; case '←': if(buffer.length === 1){ buffer = '0'; } else { buffer = buffer.substring(0, buffer.length - 1); } break; case '+': case '-': case '÷': case '×': handleMath(symbol); break; } } وهي دالة تتعامل مع الرموز غير الرقمية فمثلا إذا ضغط المستخدم على C سيتم مسح كل شيء وإعادة القيم إلى وضعها الابتدائي أما إذا ضغط = سيتم تنفيذ العملية الحسابية بناء على القيم السابقة. أما الرمز ← فيستخدم لحذف آخر رقم من buffer وإذا كان الرمز أحد العمليات الرياضية الأساسية، ترسل إلى handleMath للتحضير لتنفيذ العملية. الدالة الأخرى هي دالة معالجة العمليات الحسابية: function handleMath(symbol){ if(buffer === '0') return; const intBuffer = parseInt(buffer); if(runningTotal === 0){ runningTotal = intBuffer; } else { flushOperator(intBuffer); } previousOperator = symbol; buffer = '0'; } هنا عند عند اختيار رمز عملية رياضية ما ك (+، -، ×، ÷)، سيتم تنفيذ هذه الدالة لكن بداية سيتم التحقق من أن المستخدم أدخل قيمة أم لا ثم يتم تحويل ال buffer إلى عدد صحيح. فإذا كانت هذه أول عملية سيتم تعيين هذا الرقم إلى runningTotal أما إذا كان هناك نتيجة سابقة سيتم تنفيذ العملية السابقة عبر flushOperator وفي النهاية سيتم تخزين العملية الحالية، ويتم تفريغ ال buffer استعدادا للرقم الجديد.
  3. السلام عليكم ورحمة الله تعالى وبركاته، ميزة السحب والإفلات عادة ما تكون مفعلة افتراضيا في معظم البيئات ولكن بما أنها غير مفعلة معك، فأرجو اتباع الخطوات الآتية أولا يجب التأكد من تحديث جميع الحزم إلى آخر إصدار: sudo apt update && sudo apt upgrade في حال كنت تستخدم تستخدم Debian 12 بواجهة GNOME أعد تشغيل مدير الملفات Nautilus بكتابة الأمر في الطرفية (Terminal): nautilus -q وإذا لم يشتغل معك أعد ضبط إعدادات Nautilus بحذف مجلد الإعدادات المؤقت: rm -rf ~/.local/share/nautilus nautilus -q وفي حال استمرت المشكلة تأكد من أنه ليس عندك أي إضافات (Extensions) في GNOME ممكن تعطل السحب والإفلات لذا جرب تعطيل الإضافات مؤقتًا من تطبيق "Extensions".
  4. السلام عليكم ورحمة الله تعالى وبركاته، حاليا أكاديمية حسوب لا توفر ميزة خاصة بتشكيل فرق العمل بين الطلبة، لأنّ المحتوى التعليمي من المقرّر أن يتعلمه كلّ طالب على حدى ليتم اختبار مهاراته ومكتسباته فيما بعد للحصول على الشهادة. أما في حال كنت ترغب في تكوين فريق للعمل خارج إطار الدورة فذلك ممكن من خلال قسم أسئلة وأجوبة أين يمكنك أن تجد الكثير من المستخدمين المهتمين بذلك. وأيضا يمكنك إيجادهم أيضا في مدونة حسوب i/o فهي مدونة نقاشية ويمكنك أن تجد أعضاء مميزين هناك.
  5. السلام عليكم ورحمة الله تعالى وبركاته، أرجو مراجعة شروط اجتياز الامتحان والتقدم للحصول على الشهادة قبل البدء في دراسة المسارات، يمكنك مراجعتها من هنا: الامتحان والحصول على الشهادة أما بخصوص سؤالك، فالتطبيقات العملية إما أن تكون موجودة في نهاية الدروس على شكل تمارين وواجبات يقدمها المدرب للطلبة. أو على شكل مسارات بعينها وأما التطبيقات التي يجب عليك رفعها فهي تخص المشاريع العملية ويمكنك الاستطلاع أكثر من خلال هذا المصدر: ولكن أنصحك بالتطبيق العملي على كلّ الدروس والمشاريع وليس فقط المطلوب رفعها للتقييم.
  6. وعليكم السلام ورحمة الله تعالى وبركاته، بخصوص المسائل المالية ومسائل إعادة الدورة يمكنك تقديم طلبك مباشرة إلى مركز مساعدة أكاديمية حسوب فهم المخوّلون في الخوض والفصل في هذا النوع من الطلبات وسيرافقونك في ذلك بكل صدر رحب.
  7. السلام عليكم ورحمة الله تعالى وبركاته، ليس واضحا بشكل جيد ما اسم الثيم الذي تشير إليه لكن على كل حال توجد العشرات من الثيمات التي يوفرها موقع vscodethemes يمكنك الانتقال إلى شريط البحث في أعلى الموقع والاختيار من هناك أي ثيم تريد ثم تقوم بتثبيته كما أنه يمكنك التحكم في تدرج الألوان على حسب رغبتك بحيث يمكنك الاختيار والفلترة على حسب لغة البرمجة التي تريد: أو على حسب شيوع وشهرة الثيم بحد ذاته من ناحية الاستخدام والتقييم: وهنا يمكنك البحث واختيار الألوان الأكثر رواجا أيضا:
  8. يمكنك التعديل على إعدادات الشفافية من خلال إعدادات محرر الأكواد نفسه دون استخدام إضافات خارجية، وذلك من خلال الذهاب إلى: File > Preferences > Settings ثم البحث عن "window opacity" في شريط البحث وهناك ستجد الإعداد التالي: Window: Title Bar Style والإعداد: Window: Opacity هنا يجب تغيير قيمة Window: Opacity إلى رقم أقل مثلا لنضعه 0.8 أو 0.9 حيث أن 1.0 يعني عدم الشفافية و 0.0 يعني الشفافية الكاملة.
  9. السلام عليكم ورحمة الله تعالى وبركاته، في مرحلة التعلم لا أنصح أبدا باستخدام أدوات الذكاء الاصطناعي أو توليد الأكواد، من الأفضل البدء بتعلم الخوارزميات وكتابة الأكواد بنفسك لفهم المنطق والهيكلة واكتساب القدرة على حل المشاكل المعقدة التي تحتاج إلى تفكير تحليلي عميق ومنطقي. وأفضل الطرق نجاعة هي التي تمزج بين التطبيق العملي والدروس النظرية وهذا ما تقدمه الأكاديمية من خلال دوراتها المختلفة. وأقترح عليك مراجعة هذه الإجابات لمعرفة أفضل الطرق لدراسة البرمجة:
  10. السلام عليكم ورحمة الله تعالى وبركاته، أفضل طريقة لإضافة تباعد بين السطور هي استخدام القيم الرقمية مع خاصية line-height فهذه الطريقة هي الأكثر مرونة وعملية لأنها تتكيف تلقائيا مع أحجام الخطوط المختلفة دون الحاجة لتعديل القيم يدويا. فعندما تكتب التالي: line-height: 1.5 فهذا يعني أن المسافة بين السطور ستكون 1.5 ضعف حجم الخط المستخدم، فإذا كان حجم الخط 16px فسيصبح التباعد 24px تلقائيا، وإذا غيرت حجم الخط إلى 20px فسيصبح التباعد 30px دون تدخل منك وهذا ما يجعل التصميم متجاوبا ومتسقا عبر جميع العناصر وهذه بضعة أمثلة على استعمالها: p { font-size: 16px; line-height: 1.6; } h2 { font-size: 24px; line-height: 1.3; } .large-text { font-size: 20px; line-height: 1.8; }
  11. هل تقصد أداة "أنا" التابعة لمنصة حسوب؟ برنامج إدارة المشاريع "أنا" أرجو توضيح استفسارك لكي نساعدك بشكل أفضل.
  12. السلام عليكم ورحمة الله وبركاته، نعم بالفعل توجد أدوات ومشاريع مفتوحة المصدر توظف الذكاء الاصطناعي في مجال الأمن السيبراني ومن أبرزها Zeek لتحليل حركة الشبكة، وSecurity Onion التي تدمج عدة تقنيات للكشف والتحليل، كما توجد مشاريع مثل Deep Exploit التي تعتمد على التعلم المعزز لاختبار الاختراق، وMaltrail لاكتشاف التهديدات في حركة المرور الشبكي باستخدام قواعد الذكاء الاصطناعي. وكلّ هذه الأدوات تستخدم في مجالات متعددة مثل كشف التسلل، التحليل السلوكي، وتحديد التهديدات غير المعروفة وغيرها من المجالات. يمكنك التعمق في المجال أيضا من هنا:
  13. السلام عليكم ورحمة الله تعالى وبركاته، ال MCP أو ما يعرف ب Model Context Protocol لا يمكن أن تكون بديلا لل APIs التقليدية لأنها عبارة عن بروتوكول متخصص تم تصميمه خصيصا لتسهيل تفاعل نماذج الذكاء الاصطناعي مع مصادر البيانات والأدوات الخارجية بطريقة موحدة ومعيارية. وقد انتشرت MCP بسرعة لأنها تحل مشكلة جوهرية في النظام البيئي لل AI وهي تعقيد ربط النماذج بمختلف مصادر البيانات، حيث توفر واجهة موحدة تمكن المطورين من إنشاء "خوادم MCP" بحيث تقوم بعرض البيانات والوظائف بصيغة مفهومة لنماذج الذكاء الاصطناعي دون الحاجة لكتابة كود تكامل مخصص لكل مصدر بيانات. وأما عن الفرق الجوهري بينهما فيكمن في أنّ APIs التقليدية مصممة للتفاعل بين التطبيقات والخدمات، بينما MCP مصممة خصيصا لتمكين نماذج الذكاء الاصطناعي من فهم والتفاعل مع البيانات مما يعني أن MCP تكمل APIs ولا تستبدلها. فهي تعمل كطبقة تجريد تسهل على المطورين ربط أدوات الذكاء الاصطناعي بمصادر البيانات المختلفة بطريقة معيارية وقابلة للتشغيل البيني، مما يفسر الاهتمام المتزايد بها في مجتمع المطورين العاملين مع تطبيقات الذكاء الاصطناعي حاليا.
  14. السلام عليكم ورحمة الله تعالى وبركاته، يمكنك إيجاد أي موضوع تبحث عنه من خلال مقالات أكاديمية حسوب في جزء "الذكاء الاصطناعي" من هنا: مقالات حول مجال الذكاء الاصطناعي وتعلم الآلة وفي حال أردت متابعة أي تقنية معينة مثلا آخر تطورات ChatGPT يمكنك الذهاب لموقع openAI مباشرة وهكذا مع باقي التقنيات، فأفضل موقع يمكنك البحث فيه هو الموقع الرسمي الخاص بالتقنية نفسها. أو يمكنك استعمال موقع Google Scholar ثم البحث من خلال كلمات مفتاحية مثل: "latest AI research 2025" وستجد آخر النتائج.
  15. وعليكم السلام ورحمة الله وبركاته، يمكنك تحسين مهاراتك في حل المشكلات البرمجية بأي لغة تريد وليس فقط لغة جافا سكريبت وذلك بالاعتماد على مواقع متخصصة مثل Codewars و Exercism، حيث توفر تحديات مصممة خصيصا لكل مستوى، من المبتدئ إلى المتقدم وهي تدعم العديد من اللغات. أما إذا كنت تبحث عن تحديات تقيّم حلك وتقدّم شروحات يمكنك تجربة موقع HackerRank وLeetCode فهما مثاليان لذلك، إذ يقدمان نظام تصحيح تلقائي وتحليلات مفصلة. يوجد أيضا Coderbyte وهو يتميز بجمعه بين التحديات والمقالات التعليمية يمكنك الاعتماد عليه أيضا.
  16. السلام عليكم ورحمة الله وبركاته، بالنسبة لمتطلبات اجتياز الاختبار الخاص بالشهادة فهي تشترط إتمام أربع مسارات كاملة ولا يهم هنا الترتيب. يمكنك الاطلاع عليها من هنا: الامتحان والحصول على الشهادة بما أنك متمكن من لغة جافا سكريبت فيمكنك تخطي المسار الأول والبدء من مسار: أساسيات البرمجة.
  17. يمكنك ذلك بسهولة من خلال الضغط على زر Ctrl + S في لوحة المفاتيح لديك حينما تكونين داخل ملف الكود داخل VSCode أو أي محرر أكواد آخر تستخدمينه، في حال كنت تعملين على VSCode ستلاحظين زوال الدائرة البيضاء أعلى الملف عند حفظ الملف ثم يمكنك رؤية التغييرات التي تحدث بعد ذلك. وفي حال كان سؤالك متعلقا بأحد الدروس الرجاء الانتقال أسفل الدرس وإضافة سؤالك مرفقا بتفاصيل أكثر هناك في خانة التعليقات المخصصة لذلك
  18. السلام عليكم ورحمة الله تعالى وبركاته، حسب ماهو مبين في الصورة فيبدو أنه تمرين لاختبار ما وحسب قوانين الأكاديمية فالأسئلة الاختبارية وأسئلة الامتحانات لا يتم الإجابة عنها هنا أرجو المحاولة بنفسك وفي حال لم تفهم أي مفهوم أو أي جزئية يمكننا شرحها لك. بالتوفيق.
  19. السلام عليكم ورحمة الله وبركاته، بخصوص FormData فهي الطريقة المثلى والمعتمدة لإرسال الملفات، وطريقتك في حفظ الملفات بها صحيحة تماما لحل مشكلة فقدان الملفات عند الإلغاء. أما بخصوص استراتيجية الرفع للملفات الصغيرة والمتوسطة فالأفضل هو التجميع ثم الرفع الموحد (تحديد الملفات + زر رفع) وذلك لتقليل الضغط على الخادم وإمكانية إرسال بيانات إضافية، أما للملفات الكبيرة فالأفضل الرفع الفوري لكل ملف مع إمكانية الحذف من الخادم. وبخصوص تقنيات الإرسال فتقنية XMLHttpRequest هي تقنية قديمة ومعقدة بعض الشيء بالرغم من توفر دعمها الجيد. أنصحك باستخدام Fetch فهي الخيار الأمثل حاليا كونها حديثة وبسيطة وتدعم async/await. أما Ajax فهو مصطلح عام يشمل الطرق غير المتزامنة وليست تقنية منفصلة وإذا قصدت jQuery Ajax فهي قديمة وغير محبذة حاليا. يمكنك التوسع أكثر في الأمر من هنا:
  20. الحل صحيح بشكل عام ويحقق المتطلبات الأساسية للتمرين. فقد استخدمت Random Forest كتقنية كلاسيكية والشبكة العصبية كما طلب في التمرين وطبقت مقياس MAE بشكل صحيح. بعد رؤيتي لجزء تقسيم البيانات يبدو لي أن ذلك قد تم بالطريقة المحددة. وبالنسبة للنتائج الخاصة بمعالجة البيانات هي صحيحة خاصة من خلال استخراج الميزات من التاريخ والوقت مثل الساعة ويوم الأسبوع وإضافة متغير نهاية الأسبوع لذا حسب تحليلي فالتصورات البيانية مناسبة وتساعد في فهم البيانات بشكل جيد. لكن لدي ملاحظة بسيطة بحيث أن هناك عدم اتساق في معالجة البيانات الفئوية فقد استخدمت pd.get_dummies() مرة و OneHotEncoder مرة أخرى ولم تقم بطباعة النتائج النهائية للمقارنة بين النموذجين بوضوح يمكنك أيضا تحسين أداء النماذج من خلال ضبط المعاملات واستخدام تقنيات أخرى ينصح بها.
  21. السلام عليكم ورحمة الله وبركاته، بالطبع فهو حساب واحد سواء أدخلت بالهاتف من خلال المتصفح الذي في هاتفك أو من خلال الحاسوب. بالنسبة لفقدانك كلمة السر يمكنك استعادتها من خلال كتابة بريدك الإلكتروني المسجل في الأكاديمية من خلال التوجه نحو صفحة تسجيل الدخول، ثم اضغط على فقدت كلمة المرور أو من هنا: https://accounts.hsoub.com/reset_password وبعد إدخال البريد الإلكتروني لحسابك اضغط على إرسال ثم توجه إلى بريدك الإلكتروني الذي أدخلته للحصول على تعليمات استعادة كلمة المرور. ثم قم بفتح الرسالة الواردة من حسوب ثم اضغط على الزر المشار إليه ب "استعادة كلمة المرور" ثم أدخل: كلمة المرور الجديدة في المربع الأول أعد إدخال كلمة المرور الجديدة في المربع الثاني للتأكيد ثم اضغط على تغيير بعد ذلك سيتم توجيهك إلى صفحة تسجيل الدخول ويمكنك إدخال البريد الإلكتروني وكلمة المرور الجديدة لتتمكن من دخول حسابك وستظهر لك تبويبة الدورات بشكل عادي.
  22. الدوال find وfindIndex في لغة جافا سكريبت وfindOne في قواعد البيانات مثل MongoDB تستخدم للبحث عن عناصر داخل مجموعة بناء على شرط معين، ولكن يجب التنويه أنّ لكل منها هدف مختلف. فدالة find تستخدم في المصفوفات وتعيد أول عنصر يطابق الشرط المحدد، مما يجعلها مناسبة عندما نريد الوصول إلى كائن أو قيمة محددة من بين عدة عناصر. أما findIndex فهي تعيد فهرس أو كما نقول موقع أول عنصر يطابق الشرط، وليس العنصر نفسه، ونستخدمها عندما نحتاج إلى معرفة موضع العنصر داخل المصفوفة مثلا لتحديثه أو حذفه. لكن من جهة أخرى نرى أن findOne تستخدم عادة مع قواعد البيانات مثل MongoDB) وترجع أول مستند (document) يطابق الشرط المعطى، وهي مفيدة للبحث عن سجل واحد فقط مثل مستخدم معيّن أو منتج حسب معرف أو اسم. مثلا هنا على سبيل المثال في: const user = users.find(u => u.id === 5); لاحظ أنه يعيد الكائن نفسه بينما هنا: users.findIndex(u => u.id === 5); سيعيد الرقم مثل 2، أي موقعه فقط بينما في MongoDB: db.users.findOne({ id: 5 }) سيعيد أول سجل يطابق هذا الشرط من قاعدة البيانات.
  23. السلام عليكم ورحمة الله وبركاته، في JavaScript سابقا كانت لا توجد خاصيات وصول مثل private و public و protected كما في Java أو PHP. وجميع الخصائص والدوال في الكائنات تكون قابلة للوصول من الخارج افتراضيا لكن مع ES202 تم إدخال الحقول الخاصة (Private Fields) باستخدام الرمز # قبل اسم الخاصية مثلا نكتب: #privateProperty وهذا يجعل من الخاصية غير قابلة للوصول من خارج الكلاس لكن كما قلت لك قبل ذلك كان المطورون يستخدمون اتفاقيات تسمية مثل البدء بشرطة سفلية _property للإشارة إلى أن الخاصية "خاصة" ولكن هذا مجرد اتفاق وليس فرضا تقنيا حقيقيا.
  24. وعليكم السلام ورحمة الله تعالى وبركاته، بصراحة فإن اختيار الدورة المناسبة يحتاج لكثير من التفاصيل من المهم أولا أن ندرك أن بناء المهارات في مجال الواجهات الأمامية يمر بخطوتين أساسيتين الأولى هي التمكن من الأدوات الأساسية ك HTML، CSS، وJavaScript، إلى جانب مكتبات مثل jQuery وبيئات العمل ك Bootstrap وWebpack، وهي المهارات التي تغطيها دورة "تطوير واجهات المستخدم" وتمنحك قدرة على تنفيذ تصاميم ثابتة وتحويلها إلى صفحات تفاعلية بسيطة دون الحاجة إلى أطر حديثة. أما الخطوة الثانية فهي التعمق في تقنيات متقدمة مثل React وNext.js، والتي تركز عليها دورة "تطوير التطبيقات باستخدام JavaScript"، وتمنحك فرصة لبناء تطبيقات متكاملة أكثر تعقيدا. لذا في حال كنت في بداية الطريق، ننصح بشدة أن تبدأ بتأسيس معرفتك بالأساسيات أولا، حتى لا تواجه صعوبات لاحقا عند التعامل مع مكتبات مثل React. بخصوص الميزانية يوجد عرض جديد تم إطلاقه وهو عرض: "طوّر مهاراتك بفرصة مضاعفة" أين يمكنك الاشتراك في دورتين بسعر دورة واحدة وهذا عرض جيد ولا يأتي دائما فهو يتم عرضه على فترات فقط. يمكنك الاطلاع عليه أكثر من هنا: https://academy.hsoub.com/offers/double-skills-2025/
  25. السلام عليكم ورحمة الله وبركاته، عندما نرغب في حفظ مستخدم جديد وربط مجموعة من الصور به في Laravel فإن الخطوة الأهم هي ضمان تنفيذ العمليات بترتيب صحيح أي أن نقوم أولا بحفظ المستخدم ثم نربط الصور باستخدام المعرف (ID) الذي حصل عليه. وللقيام بذلك بطريقة فعالة، نبدأ بتعريف العلاقة بين النموذجين أي في نموذج المستخدم User.php نضيف دالة images() تخبر Laravel أن المستخدم يمتلك عدة صور، وذلك عبر علاقة hasMany كالتالي: public function images() { return $this->hasMany(Image::class, 'fk_user_id'); } أما في نموذج الصور Image.php فنعرّف علاقة عكسية باستخدام belongsTo، حتى تتمكن الصورة من معرفة المستخدم المرتبطة به: public function user() { return $this->belongsTo(User::class, 'fk_user_id'); } وبعد ضبط العلاقات ننتقل إلى تنفيذ عملية الحفظ داخل المتحكم Controller وأول ما نقوم به حينها هو التحقق من صحة البيانات القادمة من النموذج، بما في ذلك الصور، باستخدام التابع validate هكذا: $user = User::create([ 'name' => $validated['name'], 'email' => $validated['email'], 'password' => Hash::make($validated['password']), ]); ثم نتحقق ما إذا كانت هناك صور مرفقة مع الطلب فإذا وجدت، نقوم بتخزين كل صورة في مجلد مخصص باستخدام store()، ثم نربطها بالمستخدم الجديد باستخدام العلاقة images() التي عرفناها سابقا: if ($request->hasFile('images')) { foreach ($request->file('images') as $file) { $path = $file->store('user_images', 'public'); $user->images()->create([ 'path' => $path, 'original_name' => $file->getClientOriginalName(), ]); } } وأخيرا نعيد ردا يفيد بأن كل شيء تم بنجاح: return response()->json(['message' => 'User and images saved successfully']); أما في واجهة المستخدم أي في ال form فيجب التأكد من أن الحقل الخاص بالصور يقبل ملفات متعددة، وذلك باستخدام multiple مع اسم يحتوي على أقواس مربعة بهذا الشكل: <input type="file" name="images[]" multiple>
×
×
  • أضف...