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

Adnane Kadri

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

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

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

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

    51

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

  1. معروف ان عملية التشفير هي طريقة لحماية البيانات تستعمل خوارزمياتها مفتاحا للتشفير والغاءه. بالمختصر المفيد، كل مكون من مكونات لارافيل يستخدم التشفير encyption او يتضمنه يستخدم APP_KEY بشكل ما. مثال: ملفات تعريف الارتباط الجلسات كلمات المرور رموز csrf وطريقته في حماية البيانات بهذا الشكل هي في كونه وسيطا خفيا يظهر للتطبيق نفسه فقط. ففي حالة امتلاك طرف آخر لمفتاح التشفير سيمكنه صياغة قيم ملفات تعريف الارتباط والجلسات ورموز csrf واحداث مشاكل كبيرة بتطبيقك. كونه بهاته السرية يسد ثغرة أمنية كبيرة. ستجد انه مشار اليه اصلا كاعداد ضبط للتعامل مع التشفير في لارافيل. راجع: التشفير (Encryption) في Laravel. يمكن الاطلاع على انه يتم تحميله من قبل موفر خدمة التشفير في التطبيق، هذا الملف كائن بالمسار: Illuminate/Encryption/EncryptionServiceProvider.php
  2. وجدت الحزمة TheDragonCode/laravel-app مكافئة لما كان يقوم به الامر app:name. يمكن تثبيتها عن طريق: composer require dragon-code/laravel-app --dev ثم اعادة تنفيذ الامر: php artisan app:name <name> يمكن ايضا كفكرة، تعديل قيمة متغير البيئة APP_NAME عن طريق الوصول الى محتويات الملف واعادة كتابتها.
  3. اضافة لما اشار اليه المدرب حسن، قد لا تواجه مشكلة بتنفيذ php artisan down لأن التطبيق ينتقل من وضع التمكين الى وضع التعطيل. قد تكون هنالك مشكلة باعادة تمكينه مجددا فالوصول الى اين تقوم بتشغيل php artisan up قد يكون هو الآخر معطلا ضمن وضع التصحيح. لتجنب هاته المشكلة يمكنك استثناء عنوان ال IP الخاص بالجهاز الذي سيقوم باعادة التمكين مجددا. يوجد الخيار --alow php artisan down --allow=192.168.0.0 كطريقة ابسط اكثر. يمكنك مباشرة حذف ملف down الكائن بـ storage/framework. فعند تشغيل الامر php artisan down يتم انشاء هذا الملف. وعند الامر php artisan up سيتم حذفه. يمكنك عمل ذلك يدويا دون اللجوء لواجهة Artisan لتنفيذ هاته الاوامر.
  4. يمكن انشاء دور مدير مدرسة. حيث ان هذا الدور يمتلك صلاحية رؤية معلمي مدرسته فقط. ما المانع في ذلك؟ وقد لا يكون هنالك حاجة اساسا من موضوع الصلاحيات، لما لا تقومين فقط بتنفيذ استعلام يقوم بجلب بيانات المعلمين الخاصين بمدرسة المدير؟ $doctor = Doctor::find($target_doctor_id); $doctor_school = $doctot->school_id; $teachers = Teacher::where('school_id' ,$doctor_school)->get(); او يمكنك تنظيم العملية اكثر عن طريق علاقات Eloquent. حيث: كل مدرسة تمتلك العديد من المعلمين. => علاقة one to many كل مدرسة تمتلك مديرا واحدا. => علاقة one to one يكون ناتج الاستعلام مشابها لـ: $teachers_of_a_school = Doctor::find($target_doctor_id) ->school() ->teachers(); مقدمة إلى رابط الكائنات بالعلاقات Eloquent - موسوعة حسوب
  5. ابسط تعامل مع الأخطاء يكون عن طريق طباعتها في نافذة الطرفية console عن طريق console.log مثلما هو موضح في المثال السابق. ان كان هنالك مشكلة في تصديرها واستيرادها يمكن تعريفها ضمن ذات الملف app.js: function handleError(err) { console.log(err) } او مباشرة بدل handleError نفسها: if(err) { console.log(err) } سيكون هذا كفيلا بحل المشكلة وتشخيص الخطأ تشخيصا كاملا يظهر نص رسالته في نافذة console للخادم.
  6. بجانب ما اقترح المدرب عاطف، يمكنك الاستعانة بحزمة laravel-permission المقدمة من مجموعة spatie للتعامل مع الادوار والاذونات في تطبيقات لارافيل. تتعامل هاته الحزمة مع الصلاحيات وفق المنطق التالي: يمتلك المستخدم [دورا] ما. هذا الدور يمتلك مجموعة معينة من [الأذونات] التي يتم اسنادها له. يمكن اسناد دور ما لمستخدم ما. يمكن اسناد اذونة او صلاحية ما لدور ما. وتستخدم في مضمونها مفهوم البوابات والسياسات Gates & Policies. ويتم تعريف هاته الاذونات والادوار في ملفات مستقلة يمكن التعامل معها بشكل مستقل تماما. حيث يتم التحقق كل مرة يتم فيها استهداف حدث معين من التحقق مما اذا كان المستخدم الذي يقوم بالطلب يمتلك دورا من بين صلاحياته الوصول الى هذا المورد. مثال: يمتلك المستخدم "احمد" الدور "مدير مدرسة". هذا الدور يمتلك صلاحيات قراءة. محو، وتعديل الارشيف. عندما يحاول احمد الوصول للارشيف تحدث كامل العملية ويتم التحقق من ترخيصه. اعرف أكثر عن الترخيص (Authorization) في Laravel
  7. هنالك مشكلة في تشخيص الأخطاء لديك، فالوظيفة handleError غير معرفة لديك. يفترض ان تستوردها من الوحدة النمطية التي تختص بالتعامل مع الأخطاء لديك. او ان تعرفها كدالة ضمن app.js const { handleError } = require('./path/to/handle_errors_modules'); حيث يكون كـ: exports.handleError = (err) => { // معالجة الخطأ console.log(err) } قام المدربون بتوجيهك نحو الحل في سؤال سابق لك.
  8. يمكنك استعمال محرر JSHint لهذا الغرض، وهو أداة تساعد في اكتشاف الأخطاء والمشاكل المحتملة في شيفرة JavaScript نرفقها لها. اتذكر استعماله في مشروع مشابه. يحتوي واجهة تطبيق برمجية مرنة جدا، تقوم باستقبال شيفرات الجافاسكربت وتشخيص الاخطاء بها على نحو دقيق (موضع الخطأ من حيث السطر والمحرف ودرجة خطورته ونص رسالة الخطأ كاملا وغيرها).
  9. لا يمكن تعميم اجابة السؤال على كامل الشركات، فكل شركة تعتمد طريقة معينة. كما ان استعمال Laravel blade لا يعني التخلي عن واجهات التطبيق البرمجية API فقد يحدث ان نجد من يستعمل قوالب لارافيل في الاتصال بواجهات معينة. ولكن عموما، تقوم الشركات الكبرى بفصل تطبيقات الواجهات الأمامية عن تطبيقات الواجهات الخلفية بشكل تام، لأن هذا الفصل يمنح المواقع ميزة التوسع scalability ويضمن تشغيلها على كامل النظم والبيئات، فأغلب الشركات التقنية لا تتركز في الغالب على تطبيق ويب وفقط، بل نجدها تمتلك تطبيقا للأندرويد وتطبيقا للأيفون وغيره. فالتعامل هنا يكون مع خادم واحد والعديد من واجهات العملاء، هاته المركزية تقتضي الاتصال بها عن طريق طلبيات الـ HTTP وال JSON. هذا بجانب ان هاته الشركات في الغالب تحاول خدمة مفاهيم حديثة في كل من الجانبين. فنجد مثلا انها تعتمد مفاهيم مثل التصيير على المتصفح CSR و تطبيقات الصفحة الواحدة SPA و التصيير على الخادم SSR وغيرها. ورغم ان لارافيل اطار عمل ويب شامل إلا انه يبقى عاجزا عن تطبيق هاته المفاهيم لوحده تماما او على الاقل لن يكون افضل مما هو متخصص فيها بالضبط. مثال: اطر عمل الواجهة الامامية. هل يعني هذا أن استعمال laravel blade غير عملي؟ لا، ولكن لكل استعمال سياقه. ومتطلبات المشروع هي ما تحدد ما ان كنت ستقوم بناء واجهة ببيانات برمجية تصدر بياناتها كـ JSON او ان تستعمل لارافيل كتطبيق ويب شامل.للتعامل حتى مع الواجهات الامامية. وفيما يلي اسماء عملاقة تستعمل لارافيل كتطبيق ويب شامل: pfizer bbc mastercard
  10. يوجد الخاصية primaryKey لخدمة هذا الغرض: class User extends Eloquent { protected $primaryKey = 'ID'; } لأن لارافيل Eloquent سيفترض أن كل جدول يحتوي على عمود مفتاح أساسي باسم id. نقوم عن طريق هاته الخاصية بتجاوز هذا الافتراض.
  11. يمكنك استخدام قاعدة البيانات نفسه كدرايفر تخزين مؤقت لنتائج هاته الاستعلامات. اعداد قاعدة البيانات لتكون دريفر تخزين مؤقت تكون عن طريق اسناد القيمة database للمتغير CACHE_DRIVER في ملف متغيرات البيئة env. CACHE_DRIVER=database استعن بالامر: php artisan cache:table لإنشاء ملف تهجير يخص جدولي التخزين المؤقت في قاعدة البيانات. يكونان باسم cache و cache_locks بعد هذا ستحتاج البدء في استخدامه بشكل عادي. فبدل اعاد الاستعلام كل مرة كـ: public function index() { $data = [ 'latest_articles' => Article::orderBy('id' ,'desc')->limit(10)->get(), 'popular_articles' => Article::orderBy('stars' ,'desc')->limit(10)->get(), 'starred_categories' => Category::where('starred' ,true)->get(), 'latest_comments' => Comment::orderBy('id' ,'desc')->limit(10)->get(), ]; return view('yourview' ,compact('data')); } نقوم بـ: public function index() { $data = null; // التحقق من ما ان لم يتم من قبل تخزين هذا المفتاح مؤقتا if (!Cache::has('my_data_key')) { // اعادة الاستعلام $d = [ 'latest_articles' => Article::orderBy('id' ,'desc')->limit(10)->get(), 'popular_articles' => Article::orderBy('stars' ,'desc')->limit(10)->get(), 'starred_categories' => Category::where('starred' ,true)->get(), 'latest_comments' => Comment::orderBy('id' ,'desc')->limit(10)->get(), ]; // وضع نتائج الاستعلام في التخزين المؤقت Cache::put('my_data_key', $d , now()->addMinutes(180)); $data = $d; } else{ // جلب البيانات من التخزين المؤقت $data = Cache::get('my_data_key'); } return view('yourview' ,compact('data')); } او لننظم العملية اكثر فتصبح: /** * عرض الصفحة الرئيسية للموقع * * @return \Illuminate\Http\Response */ public function index() { $data = $this->loadData(); return view('yourview' ,compact('data')); } /** * تحميل البيانات من التخزين المؤقت * او اعادة تخزينها * * @return array */ private function loadData() { if (!Cache::has('my_data_key')) Cache::put('my_data_key', $this->queryDataFromDB() , now()->addMinutes(180)); return Cache::get('my_data_key'); } /** * تنفيذ استعلامات قواعد البيانات * المحددة * * @return array */ private function queryDataFromDB() { return [ 'latest_articles' => Article::orderBy('id' ,'desc')->limit(10)->get(), 'popular_articles' => Article::orderBy('stars' ,'desc')->limit(10)->get(), 'starred_categories' => Category::where('starred' ,true)->get(), 'latest_comments' => Comment::orderBy('id' ,'desc')->limit(10)->get(), ]; } التخزين المؤقت (Cache) في Laravel استفد اكثر من هاته الاجابة
  12. اكيد لن يكون يدويا، فأنت لن تقوم بعملية النسخ هي الأخرى بشكل يدوي. استعمل استعلام التحديث مع استعلام النسخ. نفذ الاستعلامات عن طريق PDO مثلا.
  13. هل تحاول نسخ سطر ما مع تغيير قيمة المفتاح foreign فيه الى قيمة أخرى؟ لما لا تنفذ استعلام UPDATE SET foreign_key_checks = 0; UPDATE order_clothes SET order_id='xyz' WHERE id='abc'; SET foreign_key_checks = 1; بعد استعلام النسخ وفقط: INSERT INTO order_clothes (c1, c2, ...) SELECT c1, c2, ... FROM order_clothes WHERE id = 1 لأن هذا ما تقوم به وظيفة النسخ في phpmyadmin على مستوى SQL يمكنك تعديلها هي الأخرى بما يوافق مرادك. SQL mysql
  14. ليس تماما، فمثلما اشار المدرب حسن ف VueJS في الاصل هو اطار عمل جافاسكربت موجه للواجهات الامامية، مفتوح المصدر ويتبنى معمارية MVVM أو model–view–viewmodel. ورغم تطويره لاستيعاب مفاهيم مثل التصيير على الخادم Server side rendering (بمساعدة NodeJS) الا انه لا يمكن الاعتماد عليه بشكل كلي لانشاء تطبيقات ويب شاملة. ستبقى تحتاج التعامل مع لغات او ادوات الواجهة الخلفية. Django، Nodejs أو PHP او غيرها. فهو موجه اساسا لبناء واجهات ويب تفاعلية توظف مفاهيم حديثة مثل التوجيه على المتصفح وتطبيقات الصفحة الواحدة وغيرها. أما بالنسبة لـ NodeJS فهو اطار عمل الواجهة الخلفية ينفذ جافاسكربت على مستوى الخادم. يستعمل في الغالب معمارية MVC أو model-view-controller. مكتوب أساسا بـ C و C++. وموجه للتعامل مع طلبيات الـ HTTP. قواعد البيانات وغيرها. يمكن الاعتماد على NodeJS بالكامل لبناء تطبيقات ويب شاملة، ولا يمكن ذلك بـ VUEJS وحده. مكان VueJS هو الواجهة الامامية، اما NodeJS فهو الواجهة الخلفية. يوجد اطار عمل ويب شامل مبني على كل من VueJS و NodeJs يسمى NuxtJS شبيه ومستلهم من NextJS الخاص بـ ReactJS. يوظف NodeJS في الخادم و VueJS في المتصفح ويسهل عملية انشاء تطبيقات ويب شاملة.
  15. لا أظن انه يوجد هنالك قاعدة معينة ثابتة فلكل منها استعمالاته وسياقاتها التي يخدمها. يكون استخدام toggle عمليا عندما نحتاج ازالة واضافة صنف ما مع الاعتبار لامتلاك العنصر للصنف من عدمه. فان كنا مثلا نخصص زرا للتبديل بين سمات الموقع : داكن وعادي. بحيث يتحكم في ذلك امتلاك العنصر body للصنف dark. سيمكن اسناد الوظيفة التي تقوم بعمل toggle للصنف الى حدث الضغط على زر التبديل بين الوضعين. يكون استخدام remove/add عمليا عندما نحتاج ازالة واضافة صنف ما دون الاعتبار لامتلاك العنصر للصنف من عدمه. أي ان التركيز هنا لا يكون على العنصر نفسه، وانما على حدث خارجي تماما. مثال: يوجد زر "الاشتراك في القائمة البريدية" في ترويسة الموقع، بحيث يقوم هذا الزر عند الضغط عليه باظهار نافذة منسدلة تحمل استمارة للاشتراك. تظهر ايضا زرا اغلاق يمكن من عليه اخفاء النموذج مجددا. التركيز الآن هو على دلالة الحدث الخارجي قبل العنصر نفسه. فعندما نضغط على زر الاظهار سيتم اعطاء الصنف "visible" لهذا العنصر. ثم عند الاخفاء سيتم ازالة الصنف "visible". add/remove تقبلان اكثر من معامل. بمعنى انه يمكن عن طريقهما التعامل مع اكثر من صنف وليس واحد فقط. h1.classList.add('green','black' ,'blue') أما toggle فلا، يمكنها التعامل مع صنف واحد فقط. h1.classList.toggle('red') بالمختصر، اذا كانت امتلاك الصنف للعنصر مهما في العملية فإن استعمال toggle سيكون أولى. وإلا فإنه سيمكن استعمال add/remove لاضافة وازالة عدد معين من الاصناف .
  16. فكرة المحادثات الخاصة اساسا هي في انها محادثات او غرف عامة يشترك بها مستخدمان فقط. فان كنت تعرف جدولا خاصا بالمحادثات يمكنك اضافة عمودين يميزان هذين المستخدمين له. وليكن user_one و user_two . Schema::create('conversitions', function (Blueprint $table) { $table->id(); $table->foreign('user_one')->references('id')->on('users')->onDelete('cascade'); $table->foreign('user_two')->references('id')->on('users')->onDelete('cascade'); $table->unique([ 'user_one', 'user_two' ]); $table->timestamps(); }); لاحظ انه يجب ان تكون الثنائية user_one و user_two فريدة فنحن لا نريد ان ننشئ اكثر من محادثة خاصة لكل مستخدمين. رغم هذا يجب تقييد عملية انشاء محادثة بشرط. لأنه ان كانت الثنائية: [ 'user_one' => 1, 'user_two' => 2 ] منشئة بالفعل فإنها لن تمنع من انشاء الثنائية: [ 'user_one' => 2, 'user_two' => 1 ] بمعنى أنه يجب عليك ان تتحقق قبل انشاء محادثة خاصة من: ما ان كان المستخدم ذي المعرف 1 (باعتباره user_one) يمتلك بالفعل محادثة مع المستخدم ذي المعرف 2 (باعتباره user_two) ما ان كان المستخدم ذي المعرف 2 (باعتباره user_one) يمتلك بالفعل محادثة مع المستخدم ذي المعرف 1 (باعتباره user_two) استعن بالاستعلام التالي: $existingConversation = Conversation::where([ [ 'user_one', '=', $first_id ], [ 'user_two', '=', $second_id ] ]) ->orWhere([ [ 'user_one', '=', $second_id ], [ 'user_two', '=', $first_id ] ]) ->first(); بعد هذا سنضمن ان هنالك ما يميز شيئا يجمع هذين المستخدمين بشكل فريد تماما. وليكن هو المعرف الخاص بالمحادثة. لنستعمله اذن في تكوين قناة خاصة private channel يشترك بها هاذان المستخدمان فقط. اعرف اكثر عن البث Broadcasting والقنوات الخاصة في لارافيل. سيمكنك استيعاب فكرة المحادثات الخاصة وسيمكنك ملائمة تخطيط قواعد البيانات وفق حاجتك.
  17. تفضيلات المستخدم فيما يخص وضع التصفح او السمة المفضلة او غيرها تخزن غالبا على المتصفح في التخزين المحلي له، ولا يتدخل لارافيل في ذلك الا في حالات خاصة. لأنها تخص المستخدم كزائر في اوضاع معينة. اما بالنسبة لتمييز المستخدمين عن بعض فيتم استعمال الجلسات ورموز الوصول access tokens وغيرها. قد يتم تخزين هاته الرموز في المتصفح وترسل في الترويسات او كمعاملات في طلبيات الـ HTTP القادمة من هذا المستخدم. بحيث يقوم التطبيق باستعمالها لفلترة معلومات تخص المستخدم او جلسته السابقة. وقد لا يتم الاعتماد اساسا على لارافيل او الواجهة الخلفية في ذلك، فيتم الاعتماد كليا على الجافاسكربت لتحليلها واستخراجها وحقنها مباشرة الى واجهة المستخدم بعد طلبه الصفحة او الموقع. وهو الأكثر شيوعا. فهي بيانات تخص المستخدم نفسه وتفضيلاته وليس المستخدم والموقع على حد سواء. عموما، يتحكم في هذا نوع هاته البيانات ومدى حساسيتها. بمعنى أنك لن تحتاج تمييز المستخدمين عن طريق لارافيل، لأن ذلك سيكون في الغالب عن طريق الجافاسكربت التي ستقوم بحقن بيانات معينة في ملفات تعريف الارتباط، الجلسات او التخزين المحلي تشير الى موقعك. هاته الثنائية: نطاق موقعك - متصفح المستخدم. تعطيه هذا التمييز بشكل تلقائي. ثم ستقاد باقي العملية عن طريق الجافاسكربت هي الأخرى.
  18. لأنك تقومين بتغيير حالة العنصر عند المرور عليه فقط. فأنت تقومين باظهاره واخفاءه عند المرور عليه فقط. أما المطلوب هو: اخفاءه عند المرور اظهاره عند المغادرة يقتضي هذا التعامل مع حدثي: مرور مؤشر الفأرة مغادرة مؤشر الفأرة
  19. هل حاولت الاستفادة من الحدث mouseleave لإظهار العنصر بعد اخفاءه؟ بداية، لن يكون هنالك حاجة من كل هاته الشيفرة: contslide.addEventListener("mouseover",(eo) => { const pNum=document.querySelector(".pNum") contslide.classList.toggle("aa") if( contslide.classList.contains("aa") ){ pNum.classList.toggle("pNum") } else{ pNum.classList.toggle("kk") } }) لأننا سنركز على ازالة الصنف الذي يتحكم في اظهار العنصر، وهو الصنف pNum. وبما انه هو الآخر سيتم ازالته واضافته فإنه لا يعد طريقة جيدة لتحديد العنصر المستهدف. ما رأيك في اعطاء معرف id بقيمة pNum للعنصر؟ <p id="pNum" class="pNum">1 - 5</p> يمكن تلخيص كامل الشيفرة في: contslide.addEventListener("mouseover",(eo) => { const pNum=document.querySelector("#pNum") pNum.classList.remove("pNum") }) بعد هذا سنأتي للحدث mouseleave كـ: contslide.addEventListener("mouseleave",(eo) => { const pNum=document.querySelector("#pNum") pNum.classList.add("pNum") }) فتكون كاملا: const contslide=document.querySelector(".contslide") contslide.addEventListener("mouseover",(eo) => { const pNum=document.querySelector("#pNum") pNum.classList.remove("pNum") }) contslide.addEventListener("mouseleave",(eo) => { const pNum=document.querySelector("#pNum") pNum.classList.add("pNum") }) أو اختصارا: const contslide=document.querySelector(".contslide") const pNum = document.querySelector("#pNum") const events = ['mouseover' ,'mouseleave']; events.forEach(function(event) { contslide.addEventListener(event ,(eo) => { pNum.classList.toggle("pNum") }) }) فهم الأحداث في جافاسكربت
  20. صفحة الملف الشخصي هي في الاصل صفحة ديناميكية متغيرة المحتوى مخزنة في الخادم يتم كل مرة عرض معلومات متغيرة فيها حسب المستخدم الذي يطلب هاته الصفحة من الخادم. فعندما يستقبل الخادم بيانات المستخدم الجديد اول مرة فإنه يقوم بتخزينها في قاعدة البيانات. ثم عندما يطلب هذا المستخدم الصفحة الخاصة به بعد تسجيل الدخول سيتم عرض الصفحة الديناميكية مع تغيير المواضع الديناميكية (مثل الاسم والبريد الالكتروني والصورة الشخصية) بما يوافق هذا المستخدم المسجل (أكيد انه يقوم الخادم بجلبها من قاعدة البيانات). يندرج كل هذا تحت مفهوم تطوير الواجهات والنظم الخلفية back end developpement. والأمر سيان في كامل لغات الواجهة الخلفية مثلها مثل asp.net . فقد تختلف اللغة وسياقها ولكن تبقى الطريقة والسبيل الى القيام بذلك واحد. أظنك جديد بتطوير الواجهات الخلفية. راجع الاجوبة على:
  21. يمكنك الاسعانة بجافاسكربت ايضا لتطبيق ذات الفكرة. فعند الضغط على العنصر يتم الانزلاق الى عنصر ما. نقوم بتحديد عنصر الرابط الفائق: <a href="" class="home-link"> home </a> var el = document.querySelector('.home-link'); ثم نسند الى حدث الضغط عليه حدث الانزلاق الى الحاوية المستهدفة. والتي هي الحاوية w في هاته الحالة: el.addEventListener('click' , () => { document.querySelector(".w").scrollIntoView(); })
  22. نلجئ عادة في هذا لاستخدام مساحات التخزين السحابية cloud storage. فهي المختصة عادة بتخزين الوسائط وتقديمها وفق سرعات محددة وقياسية. بجانب انها تكون اقل كلفة واحسن آداءا. يمكن في الغالب الاتصال بها عن طريق واجهات التطبيق البرمجية. بمعنى انك ستحصل على تخزين سحابي دون الاضطرار الى نقل الموقع الى الاستضافة المرافقة له. فملفات الموقع ستكون في مكان وملفات الوسائط في مكان. يعطي هذا أمانا اكثر وضمانا اكثر في حماية البيانات. فيما يلي أكثر خدمات التخزين السحابي شيوعا: Microsoft OneDrive Google Drive Dropbox Apple iCloud Drive cloudinary IDrive تعرف اكثر عن مفهوم السحابة والحوسبة السحابية cloud
  23. طريقة أخرى لحقن النص ضمن العنصر المستهدف هي في انشاء عقدة Node محتواها النصي هو السلسلة النصية التي نحاول حقنها. فبدل: let infoMal=`Nom de Maladie :${name} Age de Maladie :${Age}`; .. let z=document.createElement('p'); z.appendChild(infoMal); مباشرة، نقوم بانشاء عنصر span مثلا ونحقنه الى العنصر المستهدف: let infoMal=`Nom de Maladie :${name} Age de Maladie :${Age}`; .. let z=document.createElement('p'); let infoMalContainer = document.createElement(infoMal); // تحديد نص للعنصر infoMalContainer.textContent = infoMal; // حقن الحاوي z.appendChild(infoMalContainer); يمكن ايضا استعمال التابع createTextNode لتحويل السلسلة النصية المحصل عليها الى عقدة Node يمكن حقنها الى موضع في وثيقة HTML: let infoMal=`Nom de Maladie :${name} Age de Maladie :${Age}`; .. let z=document.createElement('p'); let infoMalContainer = document.createTextNode(infoMal); // حقن العقدة z.appendChild(infoMalContainer); توثيق Document.createTextNode ما هو الفرق بين خاصيتين createTextNode و innerHTML
  24. مبدئيا، لن يمكن كتابة جملة شرطية تقوم بايجاد القيمة الاصغر. فالعبارات الشرطية في البرمجة تقيد حدوث تو تنفيذ استعلام برمجي بشرط ما. ولا يمكن الاعتماد كليا على الشرط لهذا الغرض. مثال: if(condition) { // statement } أظنك تقصدين خوارزميات التكرار او الفلترة. فهي ما تختص أساسا بهذا الغرض. يرجى الاشارة الى اللغة البرمجية المستهدفة التي تريدين فيها المساعدة في كتابة الشيفرة.
×
×
  • أضف...