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

Adnane Kadri

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

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

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

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

    52

كل منشورات العضو Adnane Kadri

  1. ما هي حالة الاستخدام التي تحاول اختبارها تحديدا؟ ما تحاول القيام به غير واضح اساسا.
  2. هل قمت بكتابة اي شيفرات او بانشاء اي مهام يمكن توجيهها للطريقة الموصوفة؟
  3. لا، لا يقبل التابع assertDatabaseMissing ولا التابع assertDatabaseHas مصفوفة متعددة الابعاد Multi-dimensional، يجب تمرير مصفوفة ثنائية البعد بالخصائص والقيم المراد استبعادها او البحث عنها فقط.
  4. أظن أن معرفة بسيطة بجزئيتي جدولة المهام وطوابير الانتظار في لارافيل سيكون كافيا لتصور شيفرة كاملة عن العملية الموضحة اعلاه.
  5. ما تحاول القيام به هنا غير واضح جيدا. اذ يفترض من تابع الاختبار ان يعبر عن حالة استخدام واضحة وجلية. فلا نقول: public function testUserProduct() بل نقول: public function test_user_can_create_a_product() أو: public function test_user_can_archive_a_product() أو ما الى ذلك (بالطبع لا اقصد طريقة الكتابة). بالنسبة لحالة الاختبار الأولى فأنت تحاول التأكد ان قاعدة البيانات لا تمتلك اي سجل في جدول supervisors يمتلك قيمة فارغة في عمود sup_id. لا مشكلة بذلك. أما بالنسبة لحالة الاستخدام الثانية، فأنت تقوم بتحديد كورس معين ثم تقوم بالتأكد من ان الكورس غير موجود .. فالعملية هنا غير منطقية أساسا، أظنك تحتاج اعادة صياغة حالة الاختبار. بما أنك تقوم باختبار قواعد البيانات، فيفضل استعمال اتصال قاعدة بيانات in-memory مثل اتصال sqlite وذلك عن طريق الغاء تعليق الاسطر التالية في ملف phpunit.xml: <env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value=":memory:"/>
  6. جرب تحديد عنصر الفيديو المستهدف ثم قم بايقافه عن طريق الاستعانة بالوظيفة pause: let targetVideo = document.querySelector('#myVideo') targetVideo.pause() قد تحتاج ايضا اعادة عداد الوقت الى الصفر: targetVideo.currentTime = 0 العنصر <video>
  7. يمكنك معاملة هاته الدالة كميزة. واختبارها كحالة استخدام عن طريق اختبارات الميزة في لارافيل. لنقل ان الدالة الخاصة بك يتم الاشارة اليها عن طريق المسار: Route::get('/example/{byear}' , [MyController::class ,'countAge']) ستحتاج اول الأمر انشاء حالة اختبار Test case عن طريق تنفيذ: php artisan make:test CountAgeTest ستلاحظ انشاء ملف جديد بداخل مجلد tests/Feature الخاص بتطبيق لديك. محتوى الملف سيكون مشابها لـ: <?php namespace Tests\Feature; use PHPUnit\Framework\TestCase; class CountAgeTest extends TestCase { /** * A basic test example. * * @return void */ public function test_basic_test() { $this->assertTrue(true); } } في العادة يعبر الصنف CountAgeTest عن مجموع حالات الاستخدام التي تندرج تحت هذا الهدف وهو حساب العمر. فعلى سبيل المثال يتفرع عن هذا الهدف: حالة ان يتم تقديم سنة اكبر من الحالية (2040 مثلا)، كيف نتوقع ان يتم التعامل معها؟ حالة ان يتم تقديم عدد سالب. حالة ان يتم تقديم سلسلة نصية بدل عدد. حالة ان يتم تقديم عدد عشري عوض عدد صحيح موجب. كل هاته الحالات تسمى حالات استخدام تتبع عن الهدف الأساسي الذي هو حساب العمر. (قد يمثل Task او Goal في مخططات حالات الاستخدام ان كنت معتادا على العمل في فرق). فأنت سنحتاج نمذجة هاته الحالات ومن بينها الحالة التي وصفتها. لنأخذ الخاصة بك كمثال: في لارافيل يتم وصف حالات الاختبار كتوابع تبدأ اما ب test : <?php namespace Tests\Feature; use PHPUnit\Framework\TestCase; class CountAgeTest extends TestCase { /** * */ public function test_if_age_can_be_counted() { // } } او مميزة بتعليق @test ويسمى annotation: <?php namespace Tests\Feature; use PHPUnit\Framework\TestCase; class CountAgeTest extends TestCase { /** @test*/ public function age_can_be_counted() { // } } بنية حالة الاختبار تتبع غالبا نمطا مشابها: /** @test*/ public function age_can_be_counted() { # 1 - تحضير البيانات # 2 - القيام بال action والخروج بنتيجة # 3 - استعمال التوكيدات assertions للتأكد من حصول شيء معين } مثال: /** @test*/ public function age_can_be_counted() { # 1 - تحضير البيانات $exampleByear = 1960; $ageNow = 62; # 2 - القيام بال action والخروج بنتيجة $response = $this->get('/example/'.$exampleByear); # 3 - استعمال التوكيدات assertions للتأكد من حصول شيء معين $response->assertStatus(200); // التأكد من ان كود حالة الطلب يعبر عن طلب ناجح $this->assertEquals( $response->getContent(), $ageNow ) } لاحظ استعمال التوكيد assertStatus و assertEquals وهما تابعان يوفرهما لارافيل ضمن سلسلة من التوابع يمكن الاستفادة منها لاختبار نتائج مختلفة. أخيرا، لن تحتاج الا طباعة الأمر: php artisan test أو: vendor/bin/phpunit أو: phpunit لتشغيل الاختبارات، خرج الأمر هو ما سيعبر عن اما نجاح او فشل حالة الاختبار. مقدمة إلى التعامل مع الاختبارات في Laravel
  8. يمكنك الاستعانة بمفهوم جدولة المهام Task scheduling و طوابير الانتظار Queue لتنفيذ او جدولة مهمة اسناد الراكب الى السائق المستهدف والتحقق من قبول ذلك. فيكون منطق العملية مشابها لـ: عند تقديم طلب من طرف الراكب او العميل يتم اضافة مهمة اسناد الراكب للسائق الى طابور انتظار يتم مباشرة التحقق من تنفيذ او قبول المهمة عن طريق ارفاق ما يسمى بخيار تواتر frequency option للمهمة المجدولة، اذ يتم التحقق من ما ان تمت المهمة المقصودة كل مدة n من الزمن. في حالة عدم قبول اسناد المهمة خلال المدة n يتم اعادة الاسناد الى سائق آخر وهكذا. بالطبع فإن هذا هو المنطق العام للعملية. يمكنك التوسع في الفكرة أكثر. جدولة المهام (Task scheduling) في Laravel
  9. للاستفادة قصوى من محتوى كل درس يفضل التطبيق العملي مع ما يقوم به المدرب خلال هذا الدرس. وهذا حتى بالنسبة للمسارات النظرية من مثل مسارات الأساسيات، على أنه سيتم فيما بعد مماررسة كل هاته الأساسيات في المسارات التطبيقية اللاحقة أين سيكون من الواجب عليك الممارسة العملية سواء للاستفادة من محتوى الدورة او كشرط لاجتياز الامتحان والتحصل على الشهادة فيما بعد.
  10. هل تقصد أنك تريد "تحديد دروس الفصل القادم التي لم يتم تنزيلها بعد الموافقة لمستوى الطالب"؟
  11. يحدث هذا لأنك تحاول استعمال تضمين وحدة نمطية مصدرة تصديرا معنونا (named export) في حين أنك تقوم بتصدير وحدة data كوحدة افتراضية. ما تحتاج القيام به هو اما: اعادة تصدير الوحدة data بشكل معنون فيكون: // data.js export const data = { // you data object } او استيراد وحدة data بشكل افتراضي فيكون: import data from './data.js' تعرف عن الوحدات في Typescript
  12. npm هو مدير حزم ووحدات Node بجانب كونه آداة CLI. يقوم npm بالتعامل مع نوعين من التثبيتات: global installs وهي الحزم ووالوحدات التي يتم تثبيتها على الجهاز ولا يختص بها مشروع معين. local install وهي الحزم والوحدات التي يتم تثبيتها على مشروع معين ويكون استعمالها حصرا بذاك المشروع. اما بالنسبة لـ npx فهو منفذ لحزم node دون الحاجة الى ان تكون هاته الحزم مثبتة. اذ يكفي ان تكون مسجلة ضمن حزم node المقبولة. ويعتبر استعماله عمليا عند الحاجة الى تنفيذ حزمة معينة مرة واحدة فقط خلال زمن المشروع، فعلى سبيل المثال: لا يبدوا من المنطقي ان نقوم بتثبيت الوحدة المسؤولة عن توليد مشروع react جاهز ثم نشغلها. سيكون من الافضل لو يتم مباشرة تنفيذها لتوليد المشروع. لأنه لا حاجة من بقاءها ضمن المشروع. يوجد ايضا nvm الذي هو مدير نسخ نود Node Version Manager الذي يمكن بواسطته ادارة نسخ متعددة من NodeJS في آن واحد.
  13. تحدث المشكلة في الغالب بسبب ان المصفوفة sizes تحتوي على مصفوفة اخرى متداخلة nested فهي مصفوفة multi dimensional. وللمرور على عناصر مصفوفة مثل التي لديك اظن انك تحتاج المرور على الكائنات بداخل اول مصفوفة. فيكون: foreach ($sizes[0] as $size) { .. الباقي أيضا قد تحتاج طباعة size من داخل حلقة foreach لفهم كيفية المرور على عناصره.
  14. مثل هاته المشكلة شائعة عند استعمال بوتستراب. اذ يرجع عدم اشتغال هذا المكون الى احد السببين في الغالب: هو أن ملف جافاسكربت الخاص ببوتستراب لديك غير مضمن او مضمن بشكل جزئي او غير صحيح. أو: هو أنك تصف المكون على طريقة نسخة معينة من بوتستراب في حين أنك تستعمل نسخة مخالفة. للتأكد من الأول تأكد من أن ملفك يحتوي على تضمين لملف جافاسكربت بوتستراب ومرفقاته jQuery و popper.js، اما عن طريق cdn: <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/popper.js@1.12.9/dist/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://cdn.jsdelivr.net/npm/bootstrap@4.0.0/dist/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> او عن طريق مدير الحزم npm: npm install bootstrap وبالطبع في هاته الحالة ستحتاج تضمينه بملف جافاسكربت التطبيق لديك: require 'bootstrap'; ومن ثم تحزيمه: npm run dev أما عن الاحتمال الثاني فيجب التأكد من مطابقة سياق كل نسخة: ان استعملت بوتستراب 5 احرص على ان تعرف خواص القائمة المنسدلة كـ: data-bs-toggle="dropdown" اما ان استعملت بوتستراب 4 فهو ذات السياق الذي لديك.
  15. تحسين الأرشفة والظهور على محركات البحث لا يختص به موقع دون الآخر وانما تتحكم في الموضوع مجموعة من العوامل والنقاط نذكر منها: أنشئ ملف خارطة الموقع sitemap.xml أنشئ ملف robots.txt أنشئ محتواك بعناية واحرص الا يحتوي اخطاء املائية اختر كلمات مفتاحية قليلة المنافسة لزيادة حظوظك تابع جمهور الموقع من على تحليلات قوقل وحاول استقصاء اهتماماتهم قم بانشاء روابط داخلية في موقعك حدث محتواك بشكل دوري يمكنك ايضا الاستعانة بمختص بذلك في مستقل او خمسات مثلا.
  16. هل جربت تشفير هاته الملفات باستعمال base64 لنقلها كسلاسل نصية عادية؟ اذ سيمكن حقن هاته الملفات كسلاسل base64 ضمن الكائن الخاص بك بشكل عادي جدا. ومن ثم سيمكن نقله الى الخادم الذي سيتولى عملية الغاء التشفير بشكل منفصل ومستقل تماما (رغم انه يمكن تخزين هاته السلاسل الناتجة الا انه لا يعد تطبيقا جيدا). أظن انها افضل مقاربة للتعامل مع هذا النوع من الكائنات. صادفنا قبل مدة ليست بالكثيرة احد المشاكل المشابهة التي وجدنا فيها هذا الحل كعملي جدا. خصوصا وانه لا يمكن انشاء nested data forms لارسالها للخادم إلا بشكل يتلاعب كثيرا بهيكلة النموذج الذي نتعامل معه. ملخص العملية: عند رفع ملف ما، يتم تشفيره الى سلسلة base64 على جانب العميل. يتم حقن ناتج التشفير في الكائن المراد ارساله للخادم يستقبل الخادم الكائن كمصفوفة multi dimensional عن طريق المرور على عناصر هاته المصفوفة يقوم بالغاء تشفير هاته السلاسل اما كملفات او كصور ويقوم بحفظها الى قرص التخزين. تحقن مسارات الملفات الى قرص التخزين مكان السلاسل المشفرة الناتج: نقل سليم للملفات دون تجاوز هيكلة الكائن او طريقة ارساله.
  17. نعم لن تواجه اي مشكلة بذلك، أتوقع ان شكل البيانات التي يتم حقنها الى كل من ملفي العرض index.blade.php مختلفتان، ولذلك فإن سيتم تصيير الصفحة في كل حالة بطريقة مختلفة عن الأخرى. فان كان الموجه الاول يعرض الصفحة كـ: return view('index' ,compact('data1')); و الموجه الثاني يعرضها كـ: return view('index', compact('data2')); فإنك ستحتاج بطريقة ما للتحقق من ما ان كان متغير ما ممررا لتصيير الصفحة: @if(isset($data1)) .// طريقة العرض الاولى @elseif(isset($data2)) .// طريقة العرض الثانية @endif ورغم امكانية تطبيق الفكرة الا أنه لا يعد تطبيقا جيدا للشيفرة النظيفة، فهو لا يحترم مبدأ فصل المهام seperating of concerns بالدرجة الأولى. بالاضافة الى مبدأ المسؤولية الواحدة single responsibility. اذ يمكنك على كل حال فصل الاختلاف فقط. وان كان هنالك تشابه بين طريقتي العرض فيمكنك الاحتفاظ بالتشابه في ملف مكون منفصل وتصيير مكونات الاختلاف في كل مرة.
  18. جرب ايضا استعراض الاستعلام كاملا قبل تنفيذه عن طريق ذات الوظيفة السابقة dd: $number = request()->courseNumber; $query = 'select Course_name from .... WHERE Has_Pre IN ('.$number.')'; dd($query); هل يمكنك التقاط صورة للناتج؟
  19. يمكنك استعراض قيمة المتغير الممرر والتأكد من ان هنالك معاملا يتم تمريره بالفعل في تابع المتحكم المستهدف عن طريق الوظيفة dd: $number = request()->courseNumber; dd($number); هل يظهر الرقم المرسل هنا بشكل عادي؟
  20. بالطبع ان التعليق السابق لا يعني نسخ الاستعلام بشكل مباشر (النقاط مثلا تعني بقية الاستعلام مثل ما تصفه)، فهو توضيح لطريقة حقن متغير في سلسلة نصية. ان كانت المشكلة في علامة التنصيص يمكنك تجاهلها عن طريق استعمال علامتي تنصيص بدل واحدة "" أيضا سيتطلب منك هذا معرفة بلارافيل ولغة PHP
  21. انتبه الى وجود خطأ في توصيف اسم احد الجداول المستهدفة: $query = 'SELECT * FROM pack_items JOIN tenders t on pack_items.tender_id = t.id WHERE tender_id = '.$id; ^^^^^^^^^ اظنك تقصد tenders. اذا كنت تحاول تعريف اسم مستعار Alias لجدول tenders فبالطبع لا تنسى الكلمة المفتاحية AS فيكون الاستعلام صحيحا كـ: $query = 'SELECT * FROM pack_items JOIN tenders AS t on pack_items.tender_id = t.id WHERE tender_id = '.$id; او مباشرة: $query = 'SELECT * FROM pack_items JOIN tenders on pack_items.tender_id = tenders.id WHERE tender_id = '.$id;
  22. الفكرة الأولى من مخططات التدفق او خارطة الانسياب هي في تنظيم عملية تدفق البيانات التي تطبق في نقل البيانات من المدخلات الى المخرجات دون التركيز في التفاصيل الدقيقة. فهي الوسيلة لتمثيل خطوات معينة من بداية خوارزمية الى نهايتها، وبالتالي تضمن: أخذ تصور واضح لكاملة للخطوات المطلوبة لتطبيق فكرة معينة بشكل يسهل عليه تحليل المعطيات والمتطلبات الى خطوات برمجية. تسهيل التعامل مع العمليات التي تحتاج خوارزميات معقدة يكثر فيها التشعب والاحتمالات الكثيرة. تمتلك مخططات التدفق بعض العناصر المتفق على دلاليتها للاشارة الى شيء ما، فعلى سبيل المثال: يدل السهم ← في المخطط على اتجاه الانسياب المنطقي للبرنامج وبالتالي يعرف اسبقية خطوة على خطوة اخرى. استفد اكثر من الاجابات على سؤال مماثل: ايضا تعرف على مجموعة برمجيات لرسم وتمثيل مخططات التدفق:
  23. ستحتاج طبعا التوجيه الى تابع المتحكم المعني من داخل الاستمارة بحيث يكون الرقم مرفقا ضمن الطلب. فإن كان التابع index من المتحكم CourseController هو ما يحوي هاته الشيفرة، بحيث يوجه المسار التالي اليه: Route::post('/path' ,[CourseController::class ,'index'])->name('my.path'); فإنك ستحتاج الاشارة الى هذا المسار في الاستمارة: <form action="{{ route('my.path') }}" method="POST"> @csrf @method('POST') <input name="courseNumber" /> .. الباقي ثم استقبال هذا المعامل في المتحكم المعني: $number = request()->courseNumber; $x = DB::select('select Course_name from .... WHERE Has_Pre IN ('.$number.')')
  24. طريقة نمذجة البيانات في جدول تعتمد على هيكلة هاته البيانات بدرجة أولى، يمكن عمل حلقة foreach للمرور على ناتج الاستعلام وطباعة البيانات بالشكل التالي: <table> @foreach($s as $courseName) <tr> <td> {{ $courseName['firstCol'] }} </td> <td> {{ $courseName['secondCol'] }} </td> </tr> @endforeach </table> أيضا قد تحتاج الاستعانة بالأسماء المستعارة Aliases في SQL لتنظيم هيكلة الناتج: $s =DB::select(' select c.Course_name as FirstCol, pc.Course_name as SecondCol from courses c inner join prerequsites p on c.course_id=p.course_id inner join courses pc on p.Has_Pre=pc.Course_id'); ولما لا، استعمال باني الاستعلامات Query Builder في لارافيل لكتابة الاستعلام بشكل أكثر تنظيما: DB::table('courses') ->select('courses.Course_name as FirstCol', 'courses.Course_name as SecondCol') ->join('prerequsites' , 'courses.course_id' , '=' , 'prerequsites.course_id') ->join('courses','prerequsites.Has_Pre','=','courses.Course_id') ->get(); كيف تستخدم منشئ الاستعلامات Query builder للتخاطب مع قاعدة البيانات في Laravel منشئ الاستعلامات في Laravel حسب ويكي حسوب قوالب Blade في Laravel
  25. لا يمكن تشخيص سبب الخطأ او أخذ تصور كامل عنه دون الاطلاع على الشيفرة المسؤولة. يررجى ارفاق تفاصيل اكثر عن المشكلة.
×
×
  • أضف...