-
المساهمات
2852 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
38
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Hassan Hedr
-
تقريبًا wasChanged و isDirty تعملان بنفس الطريقة حيث تحددان فيما إذا تم تعديل خاصية ما ضمن النموذج أم لم يعدل شيء الفرق كالتالي: isDirty تعمل فقط قبل حفظ النموذج wasChanged تعمل حتى بعد حفظ النموذج حاول تعديل الشيفرة لديك إلى التالي بحسب الطريقة التي تريدها: $category->save(); // حفظ قبل if(!$category->wasChanged()){ ... أو كالتالي if(!$category->isDirty()){ ... $category->save(); // حفظ بعد أو if($category->isClean()){ ... $category->save(); // حفظ بعد
- 1 جواب
-
- 1
-
-
إذا نظرت لناتج التابع s فهو يعيد مصفوفة بنواتج مربعات الأرقام الممررة يمكنك التأكد من ذلك كما يلي print_r(s(3,5)); // [3, 5] مصفوفة لكن في حلقة الطباعة نحن نستخدم المصفوفة الناتجة ونمر على عناصرها بشكل مفرد، لذا قيمة square$ ستكون عدد وهو مربع أحد الأعداد foreach(s(3, 5) as $square) { // $square عدد echo $square . ','; }
-
التابع المذكور يقوم بالمرور على الأرقام الممررة له ويحسب مربع كل منها ويخزنه ضمن المتغير m$، الخطأ لديك هو عند تخزين تلك القيمة سيتم مسح القيمة السابقة لها وبالتالي لن نحصل سوى على آخر نتيجة فقط، بما أن استخدامك للتابع هو فقط لتمرير عدد مفرد يمكن كتابته لإرجاع نتيجة مفردة وليس مصفوفة كالتالي: function s($number) { return $number**2; } echo s(3).','; echo s(5); // 9, 25 أما في حالة إرجاع مصفوفة حصرًا يجب تغيير طريقة اسنادك للنتيجة لمتغير مصفوفة النتائج وإضافة قوسين مربعين، ويجب تغيير طريقة استعمال المصفوفة باعتبار أنها ترجع مصفوفة وليس عدد مفرد، لتصبح كالتالي: function s(...$numbers) { foreach ($numbers as $n) { $m[] = $n**2; } return $m; } foreach(s(3, 5) as $square) { echo s($square) . ','; }
- 8 اجابة
-
- 1
-
-
وضع الشيفرة كاملة في أقل عدد من الملفات أفضل من ناحية الأداء (نسبيًا) للموقع، حيث لن يحتاج الموقع عند الوصول إليه سوى لطلب ملف واحد فقط من المصدر، بينما إذا تطلب الأمر إرسال العديد من الطلبات سيؤثر ذلك على سرعة وأداء الموقع الأولية من ناحية الأداء نعم، يفضل تقليل عدد الملفات التي ستطلب من قبل الموقع ووضع الشيفرة كاملة في ملف واحد على الناحية الأخرى الملفات الطويلة تؤثر على المطور وتعيق عملية التطوير ومن الأسهل وجود العديد من الملفات الصغيرة كل منها وحدة منفصلة صغيرة وواضحة، لكن في بعض الحالات الاستثنائية تكون مضطرًا لوجود ملف ما طويل لا نتكلم عن ذلك هنا، من ناحية سهولة التطوير لا، فيجب تقسيم الشيفرة لقطع صغيرة بسيطة الفهم (قد تكون بعدة ملفات منفصلة أو ملف واحد لكن بوحدات كتوابع منفصلة صغيرة سهلة الفهم). ما الحل إذًا؟ الحل النهائي للمحافظة على الأداء وسهولة التطوير بآن معًا هو استخدام المحزّمات Bundlers، حيث تقوم بكتابة الشيفرة وتركز على الوضوح وسهولة التطوير ما أمكن، ويقوم المحزم خلال مرحلة البناء بدمج الوحدات (الملفات) التي قمت بكتابتها معًا في ملف واحد لرفع سرعة أداء الموقع، هكذا نكون حافظنا على الأداء وسهولة التطوير يمكنك استخدام Webpack لتطبيق ذلك، يمكنك الاستفادة من قراءة المقالات التالية:
- 3 اجابة
-
- 2
-
-
يمكن أيضًا استخدام طريقة float وسيتم تعويم العنصر على يسار العناصر التي تسبقه، في حال كان سؤالك عن لماذا لم ينفع تحديد عرض العنصر ب 50% لوضع العناصر بجانب بعضها فالسبب هو خاصية display وقيمتها الافتراضية ل div
- 3 اجابة
-
- 1
-
-
يفضل التعامل مع القيمة الافتراضية لها وهي content-box أي أن عرض وارتفاع العنصر محدد بصندوق المحتوى فقط، الحواشي الداخلية Padding وعرض الإطار إن وجدو لا يتم احتسابهم من قياس العنصر نفسه، عند تعيينك للخاصية box-sizing بالقيمة border-box قد يكون لك غرض ما من ذلك، مثلًا في حال كنت تبني رسومات تحتاج فيها أن لا يؤثر قياس الحاشية أو الإطار الخارجي عليها، مثلًا تحديد عناصر بمكان معين بتلك الخاصية كالتالي: .graphics * { box-sizing: border-box; } يمكنك الاستفادة من قراءة المقال التالي:
- 1 جواب
-
- 1
-
-
يعتمد ذلك على السوق الذي تبحث على عمل ضمنه، فالكثير من الشركات كانت وما زالت تبني أنظمتها وتطبيقاتها باستخدام Ruby، شركة حسوب نفسها (المالكة لموقع الأكاديمية) تطلب كل فترة مبرمج تطبيقات خبير بلغة روبي، فهي لغة قوية وتملك ميزات استخدام سهلة نسبيًا ويمكنك بواسطتها بناء تطبيقات (خاصة تطبيقات الويب باستخدام Ruby on Rails) قوية، ابدأ بالقراءة بنفسك والاتطلاع على اللغة أولًا لأخذ فكرة عامة عنها يمكنك الاستفادة من المقالات التالية: يوجد أيضًا دورة تطوير تطبيقات الويب باستخدام لغة Ruby تأخذ بيدك من الصفر إلى أن تصبح قادرًا على بناء تطبيقات كاملة باستخدام تلك اللغة.
-
يمكن تبديل كلمة أفضل بكلمة "أنسب" حيث أن لكل حالة وكل مشروع ما يناسبها بين الطريقتين، من ناحية البساطة float ليس فيه مزايا كبيرة ويناسب بعض الحالات الصغيرة ويتفرد بميزة تعويم العناصر لتداخل مع النصوص ضمن الصفحة وهو أمر لا يمكن لنموذج flex-box اتمامه أما flex-box مناسب أكثر لتنسيق تموضع العناصر ومحاذاتها حيث يحتوي على الكثير من المزايا لتخصيص ذلك وتطبيقاته أكثر، يمكنك الاستفادة من قراءة المقالات التالية
- 2 اجابة
-
- 1
-
-
السمعة تعكس المساهمات الفعالة للمستخدم، فكلما كانت نقاط سمعة المستخدم أعلى كلما كان له تاريخ في تقديم فائدة أكثر لباقي المستخدمين ويمكن الثقة بمساهماته من أجوبة أو أسئلة أو مقالات مكتوبة بأنها ذات قيمة على الأغلب هي فقط إشارة إلى جودة مساهمات المستخدم من أسئلة أو أجوبة مفيدة ومدى تقدير المستخدمين لمساهماته تلك
- 1 جواب
-
- 1
-
-
محدد الخاصية root في CSS يشير إلى العنصر الجذر في شجرة المستند الحالي DOM، عادة يكون ذلك العنصر هو العنصر html المثال المذكور يساوي التالي في مستند جذره العنصر html :root { --maincolor : red; } /* يساوي */ html { --maincolor : red; } يمكنك الاستفادة من قراءة المقال التالي:
- 1 جواب
-
- 1
-
-
بما أن الاستعلام الأساسي لعرض القائمة هو من جدول wishlist select * from wishlist ... فالأسطر في نتيجة هذا الاستعلام هي أسطر من wishlist مباشرة والحقل id هو خاص بسجل wishlist وليس المنتج، يمكنك تعديل اسم الحقل id لجدول المنتجات وإعطاءه اسم مختلف كالتالي: select wishlist.*, product.id as 'product_id', product.name ... from wishlist inner join product on wishlist.prodect = product.id where user_id = '$user_id' لكن يجب ذكر كافة الحقول التي ستحتاجها من جدول product مكان النقاط "..."، نتيجة الاستعلام السابق يمكنك الحصول على معرف wishlist من الحقل id ومعرف product من الحقل product_id
- 1 جواب
-
- 1
-
-
هذا يعتمد على القصد من كلمة "سيتوقف"، إذا كان القصد منها سيتم حذفها ولن يستطيع أحد استخدامها فهذا غير صحيح، المكتبة موجودة دائمًا ومستخدمة في الكثير من المشاريع. أما إذا كان القصد أن الطلب عليها في سوق العمل سيتوقف بشكل نهائي فهذا غير صحيح العديد من المشاريع يتم استخدام المكتبة ضمنها والقرار في استخدامها يرجع للمشروع وطبيعته فهي مكتبة بسيطة تسهل على المستخدم امكانية التعامل مع شجرة DOM ضمن صفحات الويب لتعديلها والاستعلام منها المكتبة مكتبة مفتوحة المصدر يمكن لأي أحد تحميلها واستخدامها ضمن مشاريعه متى ما يشاء
-
أنماط التصميم Design Patterns هي أنماط متشابهة تم ملاحظتها خلال حل الكثير من المشاكل البرمجية، وتم دراستها وتوثيقها وشرح استخداماتها ويمكن استخدامها عند مواجهة نفس المشاكل المتكررة لتساعدنا في حلها. النمط المضاد Anti Pattern هو أي نمط لا يهدف لحل مشكلة ما بل يخلق مشاكل أو يزيدها تعقيدًا، وأيضًا ملاحظة تلك الأنماط المضادة وشرح مساوءها يجعلنا نتجنب استخدامها للتخفيف من المشاكل. النمط المضاد هو نمط يجب تجنب استخدامه، يمكنك الاستفادة من قراءة المقال التالي للتعرف على أنماط التصميم:
- 2 اجابة
-
- 1
-
-
يجب أولًا التأكد من تثبيت بيئة NodeJS بشكل سليم، يمكن تحميله من موقعه الرسمي، للتأكد عند تنفيذ الأمر التالي يجب أن يظهر رقم نسخة مدير الحزم npm بنجاح: npm -v بعدها يمكنك التوجه للمجلد الذي سيحوي على مجلد المشروع وتنفيذ الأمر التالي: npx create-react-app my-app سيتم إنشاء مشروع ReactJS ضمن مجلد جديد بالاسم my-app ضمن المسار الحالي، يمكنك التوجه لداخل المجلد وتشغيل المشروع عبر تنفيذ الأوامر التالية: cd my-app npm start
-
إذا أردت تخزين المصفوفة ضمن حقل واحد في جدول ضمن قاعدة البيانات يمكنك الاستفادة من خاصية التحويل التلقائي في لارافل Casting، ضمن النموذج الخاص بالجدول نقوم بتعريف نوع التحويل للخاصية بفرض أن الخاصية تسمى data نحدد نوع التحويل كالتالي: class MyModel extends Model { protected $casts = [ 'data' => 'array', // لتحويل الحقل لمصفوفة ]; } بعدها يمكنك التعامل مع الخاصية بشكل طبيعي ضمن المشروع فتعين قيمة مصفوفة لتلك الخاصية ويمكنك استخراجها منها كالتالي: $model = User::first(); // الخيار $data من نوع مصفوفة $data = $model->data; // يتم تحويل القيمة المسندة تلقائيًا $model->data = ['option_1' => '...'];
- 2 اجابة
-
- 1
-
-
للوصول لجسم الطلب عبر المتغير POST_$ يجب أن يكون جسم الطلب من النوع multipart/form-data, أي الطلب سيحوي ترويسة Content-Type كالتالي: Content-Type: multipart/form-data إذا كان نوع جسم الطلب application/json فيجب الوصول إليه كالتالي: <?php $data = json_decode(file_get_contents("php://input")); echo $data->name, ' ', $data->age; // Mohssen 23
- 1 جواب
-
- 2
-
-
إذا كانت القيم المتاحة ل country هي فقط 1 و 2 و 3 يكفي فقط جعل الحقل city مطلوبًا دومًا كالتالي: <input type="text" name="city" required /> أما في حال وجود خيارات أخرى يمكن تحقيق ذلك باستخدام جافاسكريبت ضمن نفس الصفحة، نسجل استماع لحدث تغيير قيمة country ونتحقق من القيمة الجديدة ونعين فيما إذا كان الحقل city مطلوبًا على أساسها كالتالي: <script> document.querySelector('input[name=country]') // country اختيار العنصر .addEventListener('change', function (e) { // تسجيل استماع لحدث تغيير القيمة const selectedCountry = e.target.value; // القيمة الجديدة const cityRequried = ['1', '2', '3'].some(value => value == selectedCountry); // حقل المدينة مطلوب const city = document.querySelector('input[name=city]'); // حقل المدينة if (cityRequried) city.setAttribute("required","required"); // جعل الحقل مطلوبًا else city.removeAttribute("required"); // جعل الحقل اختياري }) </script>
-
يمكن ذلك بحسب المطلوب ضمن المشروع، فقد تقرر تخزين البيانات الثابتة نسبيًا ضمن قاعدة بيانات MongoDB (مثل معلومات المستخدمين)، وتختار بيانات أخرى وتيرة طلبها والاستعلام عنها عالية وتخزنها ضمن خادم Redis (كمعلومات اسعار الأسهم أو العملات ضمن تطبيق مختص لذلك)، الهدف من ذلك الفصل هو رفع سرعة وأداء النظام والقرار بذلك يجب أن يكون حل لمشكلة تواجه المشروع وليس فقط لاستخدام تلك التقنية يمكنك الاستفادة من قراءة المقال التالي:
- 3 اجابة
-
- 1
-
-
يمكن الاستعانة بالدوال glob لتوليد قائمة بالملفات المطلوب حذفها، والتابع unlink لحذف كل ملف من قائمة الملفات تلك، يمكن كتابة شيفرة لذلك كالتالي (مع استبدال مسار مجلد all_images): <?php $files = glob('path/to/all_images/*'); // جميع الملفات ضمن ذلك الملف foreach($files as $file){ unlink($file); // حذف الملف } أو يمكن كتابة السابق بطريقة أقصر كالتالي عبر الاستعانة بالتابع array_map للمرور على الملفات بدلًا من حلقة foreach: <?php array_map('unlink', array_filter((array) glob("path/to/all_images/*"))); ثم عليك تنفيذ النص البرمجي السابق بحسب الجدولة المطلوبة ضمن مشروعك لحذف الملفات
- 3 اجابة
-
- 1
-
-
مسار NodeJS يعتمد على معرفتك المسبقة ب ReactJS حيث تم تطوير الواجهات الأمامية للمشروع المستخدم باستخدام ReactJS، لكن في المشاريع الأخرى الاعتماد هذا ليس شرطًا لذا يجب فهم الغرض من كل منهما على حدى: ReactJS: مكتبة يمكن الاستعانة بها لبناء الواجهات الأمامية لصفحات HTML، يمكنك بناء موقع كامل (بطرف العميل) باستخدام تلك المكتبة فقط دون الحاجة لاستخدام NodeJS NodeJS: بيئة عمل تمكننا من تطوير تطبيقات وبرامج باستخدام جافاسكريبت، يمكنك بناء نظام كامل (بطرف الخادم) ضمن تلك البيئة دون الحاجة لاستخدام ReactJS، كتطبيق خادم يوفر واجهة برمجية API
-
يمكنك حذف المسار form/ والذي يشير للدالة index ضمن المتحكم، يكفي الاعتماد على مسار واحد، أولا حاول جعل المتغير ضمن المسار إختياري لتخديم أول عرض للصفحة كالتالي: Route::get('form/{view?}', [Formcontroller::class, 'showForm']); وفي دالة المتحكم تقوم إما بعرض النموذج المختار عبر المعامل أو تختار نموذج عشوائي، مع اختيار اسم لنموذج عشوائي آخر حالي كالتالي: public function showForm($view = null) { $forms = [ 'forms.formA', 'forms.formB', 'forms.formC', 'forms.formD' ]; $next_form_name = $forms[array_rand($forms)]; $current_form = view($view ?? $forms[array_rand($forms)]); return view('form', compact('current_form', 'next_form_name')); } وضمن ملف العرض form يجب عرض المحتوى current_form بشكل حرفي حتى يتم إظهار النموذج بشكل سليم كالتالي: @extends('layouts.app') @section('content') <div class="container"> <div class="row"> <div class="col-lg-6"> <div> Click here to show a random form </div> <a class="btn btn-primary text-center" href="/form/{{$next_form_name}}"> Submit</a> </div> <div class="col-lg-6"> {!! $current_form !!} </div> </div> </div> @endsection ويجب تعديل كل ملفات عرض النماذج وإزالة القالب الرئيسي منها layouts.app حتى لا يتم تكرار الشريط العلوي
- 3 اجابة
-
- 1
-