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

Mustafa Suleiman

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

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

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

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

    365

كل منشورات العضو Mustafa Suleiman

  1. عليك بتفعيل خاصية Less secure app access من خلال الرابط التالي: https://myaccount.google.com/lesssecureapps?pli=1 لكن في حال أنك قمت بتفعيل خاصية المصادقة الثنائية من قبل two-factor-authentication فعليك بتعطيلها أو التوجه إلى: إعدادات الأمان Security في حساب جوجل لديك. ثم اختر Signin in to Google أو تسجيل الدخول لجوجل. ثم اختر App passwords أو كلمات المرور للتطبيقات. ستجد خيار باسم app أو التطبيق ثم Other أو أخرى، ثم اختر Custom name and click Generate أو اسم مخصص وانقر فوق إنشاء. ثم في الكود لديك قم بتغيير كلمة المرور لللإيميل بكلمة المرور التي حصلت عليها من الخطوات السابقة.
  2. هل تظهر لك أي إضافة في خانة الإضافات هنا وليس من الإعدادات:
  3. عليك بتفقد الإضافات لديك وحذف أي إضافة متعلق بـ Twig ثم إعادة تشغيل المحرر، وفي حال استمرت المشكلة عليك بالتوجه إلى الإعدادات كما أخبرك عمر، ثم الضغط الأيقونة الخاصة بعرض ملف settings.json ثم البحث عن أي إعدادات خاصة بـ Twig ثم حذفها ثم الحفظ وإعادة تشغيل المحرر. وفي حال استمرت المشكلة من الأفضل حذف VScode تمامًا ثم إعادة تثبيت آخر إصدار مرة أخرى، وبخصوص Twig عليك باستخدام الإضافة التالية حيث لا يوجد بها مشكلة التعليقات التي ظهرت لديك: https://marketplace.visualstudio.com/items?itemName=mblode.twig-language-2 وأيضًأ تأكد من الأسفل في المحرر أنه تم إختيار الصيغة الصحيحة للملف وهي HTML كالتالي:
  4. أهلاً بك أمير، الأمور المالية لا يمكن لأحد مساعدتك بها سوى مركز الدعم الخاص بأكاديمية حسوب، أرجو منك التحدث إليهم وإخبارهم بما تريد وسيتم مساعدتك. وسيتم الرد عليك في غضون 24 إلى 48 ساعة فلا تقلق بخصوص ذلك.
  5. طالما أنك حددت وجهتك وهي العمل على مواقع العمل الحر، فعليك بتفقد المطلوب أي المهارات المطلوبة لتنفيذ المشاريع المعروضة، وذلك ما يجب أن تفعله دائمًا عندما تريد العمل في مجال معين حيث تبحث عن المشاريع أو وصف الوظيفة ثم تنظر لنوعية المشاريع الأكثر طلبًا أو المهارات واللغات الأكثر طلبًا في سوق العمل والخبرة المطلوبة ثم تقرر ما الذي تريد تعمله والعمل به لا العكس. وبخصوص مصادر لتعلم بايثون فقد شرحت الأمر بشكل مفصل هنا: وبعد تعلم المهارات المطلوبة، عليك بإنشاء معرض أعمال إحترافي، ولكن ما هي طبيعة تلك الأعمال؟ بالطبع أعمال مشابهة أو مماثلة للمشاريع المطلوبة على الموقع الذي تريد العمل عليه، فأنت تريد اكتساب ثقة صاحب المشروع وهو يريد رؤية نماذج سابقة لأعمال مشابهة وليس مجرد نماذج تدريبية صغيرة ليست إحترافية. ثم عليك تعلم كيف تقوم بكتابة عرض إحترافي على المشاريع وقد أوضحت الأمر هنا:
  6. السؤال غير واضح، هل تقوم بإنشاء قالب، أم تعمل على تعديل الموقع من خلال CSS؟ في حال كنت تعمل على تعديل الموقع من خلال CSS في متجر سلة فليس متاح لك تعديل أكواد HTML، أي تعديل الكلاسات، بل تستطيع إختيار العناصر من خلال الكلاسات ثم تنسيقها كما تريد من خلال CSS. أما في حال كنت تعمل على تطوير قالب فعليك استخدام محرك Twilight الخاص بمنصة سلة وبالطبع معرفة بالآتي:HTML, CSS, JS ثم معرفة بمحرك قوالب Twig، وهو نظام قوالب يستخدم في برمجة الويب للمساعدة في إنشاء وإدارة قوالب HTML، وتم تطوير Twig بلغة برمجة PHP وهو جزء من إطار عمل Symfony لتطوير تطبيقات الويب. وستجد مزيد من التوضيح هنا: وأيضًا من خلال المستند الرسمي: https://salla.stoplight.io/docs/twilight-themes-documentation/44069a6e14851-meet-the-twilight
  7. تستطيع استخدام دالة map لإنشاء مصفوفة جديدة من الرموز المحفوظة، وبعد ذلك استخدام تلك المصفوفة لإنشاء قائمة من عناصر <li> وجعل عناصر <li> قابلة للنقر عن طريق إضافة سمة onClick إليها، ثم استخدام وظيفة onClick لإدخال الرمز تلقائيًا في حقل إدخال <input>. وإليك مثال: const codes = [ "1234567890", "abcdeghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZ" ]; const codeList = codes.map((code) => ( <li key={code} onClick={() => { // إدخال الرمز تلقائيًا في حقل الإدخال input.value = code; }}> {code} </li> )); return ( <div> <ul>{codeList}</ul> <input id="input" /> </div> ); وسيعرض الكود قائمة من عناصر <li>. يمكن النقر على كل عنصر <li> لإدخال الرمز تلقائيًا في حقل الإدخال <input>. وإليك مثال كامل آخر مع استخدام حالة State للمكون: import React, { useState } from 'react'; function App() { const [items, setItems] = useState([]); // حالة لتخزين العناصر المحفوظة const [selectedItem, setSelectedItem] = useState(''); // حالة لتخزين العنصر المحدد const handleAddItem = () => { if (selectedItem) { setItems([...items, selectedItem]); setSelectedItem(''); } }; const handleItemClick = (item) => { setSelectedItem(item); }; return ( <div> <div> <input type="text" value={selectedItem} onChange={(e) => setSelectedItem(e.target.value)} /> <button onClick={handleAddItem}>إضافة</button> </div> <ul> {items.map((item, index) => ( <li key={index} onClick={() => handleItemClick(item)}> {item} </li> ))} </ul> <input type="text" value={selectedItem} onChange={(e) => setSelectedItem(e.target.value)} /> </div> ); } export default App;
  8. رسالة الخطأ تخبرك أنه لم يتم التعرف على قاعدة البيانات Unknown database 'stdz'، قم بالتأكد من قاعدة البيانات موجودة بالفعل وإن لم تجدها عليك إنشائها، وأظن أنها كانت لديك باسم std وليس stdz. وأتفهم ما تريد الوصول إليه، لكن لن يتم عرض الرسالة not connected والصحيح هو استخدام الكود التالي لعرض رسالة Database 'hsubgram' does not exist في حالة لم يتم إيجاد قاعدة بيانات بذلك الاسم : <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <?php if(isset($_POST["con"])){ $servername = 'localhost:3306'; // Hostname only $username = 'root'; $password = ''; $database = 'hsubgram'; // Connect to the server $conn = mysqli_connect($servername, $username, $password); if (!$conn){ die("Connection failed: " . mysqli_connect_error()); } // Check if the selected database exists $db_check_query = "SELECT SCHEMA_NAME FROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = '$database'"; $db_check_result = mysqli_query($conn, $db_check_query); if (!$db_check_result) { die("Database check failed: " . mysqli_error($conn)); } if (mysqli_num_rows($db_check_result) == 0) { die("Database '$database' does not exist."); } mysqli_close($conn); echo "Connected to database: $database"; } ?> <form method="POST"> <center> <input type="submit" value="connect" name="con"> </center> </form> </body> </html>
  9. استبدل الجزء الخاص بتوليد الأسئلة بالتالي: // Generate 3 random questions const randomQuestions = []; const repeatedQuestions = []; while (randomQuestions.length < 3) { const randomIndex = Math.floor(Math.random() * questions.length); if (randomQuestions.indexOf(questions[randomIndex]) === -1 && repeatedQuestions.indexOf(questions[randomIndex]) === -1) { randomQuestions.push(questions[randomIndex]); } } وأنت بحاجة إلى تعلم أساسيات HTML و JS ستفيدك المقالات التالية:
  10. الأمر بسيط أنت بحاجة إلى إنشاء عنصر وليكن div في HTML ثم ضع له كلاس من أجل إختياره فيما بعد من خلال جافاسكريبت وعرض الأسئلة به. وفي جافاسكريبت نقوم بإنشاء مصفوفة من الأسئلة ثم إنشاء حلقة للإختيار عشوائيًا من بين الأسئلة كالتالي: <!DOCTYPE html> <html> <head> <title>Quiz</title> </head> <body> <div class="questions"></div> <script > // Create an array of questions const questions = [ "ما هي عاصمة فرنسا؟", "ما هي عدد سكان الصين؟", "ما هو اسم الرئيس الحالي للولايات المتحدة؟", "ما هو الرمز الكيميائي للمياه؟", "ما هو جذر 16؟", "ما هي مجموع 1 + 1؟", "ما هو اسم الكوكب الأقرب إلى الشمس؟", "ما هو اسم أكبر محيط في العالم؟", "ما هو اسم أعلى جبل في العالم؟", "ما هو اسم أعمق خندق في المحيط في العالم؟" ]; // Generate 3 random questions const randomQuestions = []; for (let i = 0; i < 3; i++) { const randomIndex = Math.floor(Math.random() * questions.length); randomQuestions.push(questions[randomIndex]); } // Display the random questions document.querySelector(".questions").innerHTML = randomQuestions.join("<br>"); </script> <body> </html>
  11. المشكلة بسبب وجود عنصر <section> كفرع مباشر لعنصر <Routes> داخل الكود، وفي React Router v6، يجب أن تحتوي عناصر <Routes> على عناصر <Route> فقط أو <React.Fragment> كعناصر داخلية أو كأطفال childrens. لذلك عليك باستخدام <Route> للـ <section> أيضًا بدلاً من وضع <Routes> داخل <section>. import { Route, Routes } from 'react-router-dom'; function App() { return ( <> <Navbar /> <Routes> <Route path="/" element={<Landing />} /> <Route path="/login" element={<Login />} /> <Route path="/register" element={<Register />} /> </Routes> </> ); } وبالتالي ولم يعد هناك <Routes> داخل <section> وتم وضع جميع الـ <Route> مباشرة داخل <Routes> الرئيسي، مما سيحل مشكلة الخطأ الذي كنت تواجهه. https://reactrouter.com/en/6.15.0/upgrading/v5
  12. ما علاقة موقع سلة بالأمر، سلة هي منصة لإنشاء مواقع التجارة الإلكترونية وتوفر قوالب للتعديل عليها من خلال CSS وJS. لا يوجد منصة توفر لك أنت ترفع موقعك الخاص وتوفير بوابة دفع لك، وإذا أردت يمكنك تطوير قالبك على متجر سلة وقد تم شرح الأمر هنا: أفضل وأشهر بوابات الدفع أما إذا أردت إنشاء موقع من خلال HTML, CSS, JS فعليك برفعه على استضافة حتى لو مجانية، ثم استخدام أحد بوابات الدفع وقد تم شرح الأمر بالتفصيل هنا:
  13. أرجو منك تعديل السطر الخاص بعنوان قاعدة البيانات حيث أن المنفذ لديك هو 82 بينما المنفذ الإفتراضي لقاعدة بيانات MySQL هو 3306، لذلك أولاً حاول تعديل الرابط ليصبح كالتالي: $servername = 'localhost'; // اسم المستضيف فقط ومن المفترض أن يتم الإتصال لكن أنا في الصورة أن المنفذ هو 4306 لذلك عليك بتعديل الرابط إلى التالي: $servername = 'localhost:4306';
  14. 1- نطاق المعامل this ليس محليًا أو عالميًا أو أي شيء آخر بل يعتمد على السياق الذي يتم استخدامها فيه. أي إذا استخدمنا this في دالة محلية، فستيشير إلى الكائن الذي تم استدعاء الدالة منه، وإذا تم استخدام this في دالة عالمية، فستيشير إلى الكائن window لأنه الكائن العالمي. 2- هناك عدة طرق لمعرفة قيمة المعامل this دون طباعته في ال console. الطريقة الأولى هي استخدام دالة typeof، مثلاً حاول تجربة كتابة: typeof this سيعيد نوع الكائن الذي تشير إليه this. طريقة أخرى هي استخدام دالة Object.prototype.toString، فعند كتابة التالي: Object.prototype.toString.call(this) سيعيد سلسلة تمثل الكائن الذي تشير إليه this. وإليك بعض الأمثلة على كيفية استخدام المعامل this: في دالة محلية، تشير this إلى الكائن الذي تم استدعاء الدالة منه، ففي المثال التالي، تشير this إلى الكائن myObject. var myObject = { name: "Muhannad " }; function myFunction() { console.log(this.name); // Logs "Muhannad " } myFunction(); // Logs "Muhannad " في دالة عالمية، تشير this إلى الكائن window وفي الكود التالي، تشير this إلى الكائن window. function myFunction() { console.log(this.name); // Logs "window" } myFunction(); // Logs "window" أما في دالة كائن، تشير this إلى الكائن نفسه، وفي المثال التالي، تشير this إلى الكائن myObject. const myObject = { name: "Muhannad ", myFunction: function() { console.log(this.name); // Logs "Muhannad " } }; myObject.myFunction(); // Logs "Muhannad " وكنصيحة لتفهم طبيعة كلمة this عليك أن تفهم ماذا يعني الـ prototype في جافاسكريبت فهى نقطة هامة وأساسية في اللغة يغفل عنها الكثير. وقد قمت بشرح الأمر بشكل مفصل هنا:
  15. ستحتاج إلى استخدام ميزة HTML5 Geolocation والتي تسمح لك بطلب موقع المستخدم الحالي من متصفح الويب الخاص به، وبمجرد الحصول على الموقع، يمكنك استخدامه للقيام بأشياء مثل عرض الخريطة في الموقع الحالي للمستخدم أو إرسال إشعار للمستخدم بأن موقعه معروف. وإليك مثال للكود: <!DOCTYPE html> <html> <head> <title>Geolocation Example</title> </head> <body> <script> // This code will get the user's current location function getLocation() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition(showPosition, showError); } else { alert("Your browser does not support geolocation."); } } // This function will be called when the user's location is retrieved function showPosition(position) { const lat = position.coords.latitude; const lng = position.coords.longitude; // You can do something with the user's location here, // such as display it on a map or send an alert alert("Your location is: " + lat + ", " + lng); } // This function will be called if an error occurs while getting the user's location function showError(error) { switch (error.code) { case 1: alert("The user did not grant permission to get their location."); break; case 2: alert("The user's browser does not support geolocation."); break; case 3: alert("The user's browser is unable to get the user's location."); break; } } </script> <input type="button" value="Get Location" onclick="getLocation();"> </body> </html> عند النقر فوق الزر "الحصول على الموقع"، سيطلب الكود موقع المستخدم الحالي. إذا منح المستخدم الإذن، فسيستخدم الكود الموقع لعرضه على الخريطة أو إرسال إشعار للمستخدم بأن موقعه معروف. وإذا لم يمنح المستخدم الإذن، فسيعرض الكود رسالة تشير إلى أن المستخدم لم يمنح الإذن. ,هناك طريقة أخرى لتحديد موقع شخص ما باستخدام جافاسكربت تتضمن استخدام خاصية navigator.geolocation.watchPosition() والتي تسمح لك بمراقبة موقع المستخدم الحالي وتلقي الإشعارات عندما يتغير الموقع. وإليك مثال للكود: <!DOCTYPE html> <html> <head> <title>Geolocation Example</title> </head> <body> <script> // This code will watch the user's location and notify you when it changes function watchPosition() { navigator.geolocation.watchPosition(showPosition, showError); } // This function will be called when the user's location changes function showPosition(position) { const lat = position.coords.latitude; const lng = position.coords.longitude; // You can do something with the user's location here, // such as display it on a map or send an alert alert("Your location is: " + lat + ", " + lng); } // This function will be called if an error occurs while getting the user's location function showError(error) { switch (error.code) { case 1: alert("The user did not grant permission to get their location."); break; case 2: alert("The user's browser does not support geolocation."); break; case 3: alert("The user's browser is unable to get the user's location."); break; } } </script> <input type="button" value="Get Location" onclick="watchPosition();"> </body> </html> وwatchPosition() تعمل على مراقبة تغييرات الموقع الجغرافي للمستخدم وتقديم تحديثات مستمرة بشأن الموقع الجديد، وتعمل الواجهة على مراقبة الموقع عبر جهاز GPS أو شبكات Wi-Fi أو تقنيات الهاتف المحمول. وهي مفيدة في التالي: تتبع حركة المستخدم وتحديث التطبيق بناءً على موقعه الحالي. تخصيص تجربة المستخدم عندما يتحرك بين مواقع مختلفة، مثل تقديم محتوى متعلق بالموقع أو توجيهات للتنقل. تحديد موقع جهاز مفقود أو مسروق. يمكن استخدامها في تطبيقات لتتبع النشاطات البدنية مثل الجري أو ركوب الدراجات. يمكنك تحسين دقة الموقع بمرور الوقت حيث يمكن للتطبيق التفاعل مع تحسينات أفضل لتحديد الموقع عندما تصبح متاحة.
  16. المشكلة في العنوان الخاص بالإتصال بقاعدة البيانات عليك بتعديل المنفذ.
  17. أولاً تأكد من أن سيرفر MySQL يعمل بشكل سليم من خلال الأمر التالي في منفذ الأوامر CMD وليس Powershell: netstat -an | findstr ":3306 ومن المفترض أن تجد نتيجة وإذا لم يكن هناك أي إدخالات لبروتوكول TCP على المنفذ 3306، فهذا يعني أن خادم MySQL غير قيد التشغيل. بعد ذلك عليك بالتحقق من عدم وجود الأسباب التالية: عنوان خادم MySQL غير صحيح. اسم مستخدم MySQL غير صحيح. كلمة مرور MySQL غير صحيحة. قاعدة البيانات غير موجودة. منفذ MySQL غير صحيح والإفتراضي الصحيح هو 3306. تأكد من تشغيل قاعدة البيانات وسيرفر PHP مثل Apachi في Xampp ومن الأسهل لك استخدام بيئة تطوير Laragon فهى أسهل في الاستخدام: https://github.com/leokhoa/laragon/releases/download/6.0.0/laragon-wamp.exe
  18. المشكلة أن الكود الخاص بك يستغرق وقتًا طويلاً جدًا للتنفيذ، ويمكنك محاولة زيادة حد وقت التنفيذ في الملف php.ini. إليك كيفية القيام بذلك: افتح الملف php.ini في محرر النصوص. ابحث عن العبارة max_execution_time. قم بزيادة القيمة إلى رقم أعلى. على سبيل المثال ، يمكنك تغييرها إلى 36000إذا كنت تريد السماح للكود بالتنفيذ لمدة 36000 ثانية. احفظ الملف واخرج من المحرر. أعد تشغيل خادم PHP مثل apache . ومن المفترض أن تجد ملف PHP.ini في المسار التالي C:\xampp\php\php.ini وفي حال استمرار المشكلة حاول تفقد أين تقع المشكلة وهي في ملف db-connect.php لذلك حاول كتابة بيانات الإتصال بقاعدة البيانات بشكل صحيح.
  19. أنت تحاول طرح الأسئلة في قسم أسئلة البرمجة وليس التعليق أسفل فيديو الدورة في التعليقات، ستجد أسفل الفيديو مكان للتعليق، بينما هنا في قسم أسئلة البرمجة نطرح الأسئلة العامة. وتسهيلاً عليك، بخصوص سؤالك، الخورازمية والشيفرة الزائفة بحاجة إلى المزيد من التوضيح، أي تصبح الخوارزمية كالتالي: بدء البرنامج تحميل الواجهات والشخصية والجوائزة والخرائط جعل المتغيرات :الجوائز = 0 واخذ المفتاح =0 وعداد الوقت =0 وضع اللعب في الاحداثيات (مكان البداية ) كرر باستمرار اذا زر اليمن مضغوط تحرك نحو اليمين اذا زر اليسار مضغوط تحرك نحو اليسار اذا زر الاعلى مضغوط حرك نحو الاعلى اذا الاعب ملامس الإرض لاتتحرك الى الاسفل وإلأ تحرك نحو الاسفل اذا لامس الاعاب السقف تحرك نحو الاسفل اذا اللاعب لمس الجائزة الكنز زد متغير الجوائز 100 والا اذا لمس الجائزة الكتاب زد متغير الجوائز 1000 والا زد زد متغير الجوائز 10 اذا لمس اللاعب المفتاح اخفى المفتاح وزد متغير المفتاح1 اذا لامس العب الباب وكان كتغير المفتاح 1 انتقل الى الخريط التالي اذا لامس اللعب الحفرة او الفخة اطبع لقد خسرت اخرج من الحلقة و انهي البرنامج اذا دخل اللاعب الباب الثاني الموجود في الخريط الثانية وكان متغير المفتاح=2 اطبع لقد فزت وعدد الجوائز وعداد الوقت اخرج من الحلقة و انهي البرنامج وبالنسبة للشيفرة الزائفة نحاول كتابتها لتصبح قريبة من اللغة البرمجية ولكن بشكل بسيط كأننا نتحدث لشخص، كالتالي: و الخوارزمية هي تصور للبرنامج أو اللعبة التي سنُنشئها وبالتالي حتى لو كان هنالك خطوات ناقصة يمكن إضافتها فيما بعد على الخوارزمية، والشيفرة الزائفة فائدتها تعلم أساسيات البرمجة من خلال تنمية مهارة التفكير المنطقي قبل كتابة الكود أي كتابة المنطق الخاص بالبرنامج ثم تحويله إلى كود، كما أنها تُستخدم من قبل المبرمجين ذوي الخبرة لتخطيط برامجهم قبل كتابتها بلغة برمجة محددة، ودائمًا خطوة كتابة الكود هي الخطوة الأخيرة فلا نبدأ أبدًا بكتابة الكود إلا في حال كان الأمر متكرر من قبل.
  20. السؤال غير واضح، هل تريد إنشاء بوابة دفع، أم تريد منصة لبيع القالب الذي تود إنشائه؟
  21. ربما المشكلة لديك هي أنك تستورد المكتبة بشكل غير صحيح، حيث أن الاستيراد الصحيح هو كالتالي: import PyPDF2 لاحظ أنك كتبت حرف p صغير بينما الاستيراد الصحيح هو حرف P كبير. ولا تنسى تحميل المكتبة من خلال الأمر التالي في حال استمرت المشكلة: pip install PyPDF2 وتأكد من إختيار مترجم بايثون الصحيح من الأسفل في vscode في حال قمت بإنشاء بيئة إفتراضية: حيث ستجد كلمة venv، أو في حالة لم تقم بإنشاء بيئة إفتراضية عليك بإختيار المترجم الصحيح مثل Python311 أو Python310
  22. بخصوص التعامل مع ملفات PDF باستخدام JavaScript فيما يتعلق بقراءة وعرض المحتوى، تستطيع الإعتماد على مكتبات مثل pdf.js لقراءة وعرض محتوى ملفات PDF داخل متصفح الويب، ويمكن للمستخدمين عرض محتوى الملف، ولكنهم لا يمكنهم تنزيل الملف أو تعديله. فيما يتعلق بتعديل وإنشاء ملفات PDF، بإمكانك استخدام مكتبات مثل pdf-lib لإنشاء وتعديل ملفات PDF باستخدام JavaScript، وإضافة نصوص، صور، روابط، وغيرها من العناصر إلى ملفات PDF. التعامل مع ملفات PDF باستخدام Laravel بخصوص رفع الملفات، باستطاعتك إنشاء نموذج في تطبيق Laravel يسمح للمستخدمين برفع ملفات PDF، أو استخدام مكتبة مثل Laravel Filesystem لإدارة رفع وتخزين الملفات. ولتحويل ملفات إلى نص أو صور، استخدم مكتبات مثل spatie/pdf-to-image لتحويل صفحات ملفات PDF إلى صور أو استخراج النصوص منها لتخزينها أو عرضها. وللتحكم في الوصول والقراءة، من الممكن تنفيذ سياسات وصول تحدد من يمكنه تنزيل الملفات ومن يمكنه رؤيتها فقط، أيضًا تنفيذ تحقق الهوية وتسجيل الدخول للتحكم في الوصول إلى الملفات. اختيار الخيار الأفضل بين JavaScript وLaravel يعتمد على ما إن كنت ترغب في تعامل سريع وديناميكي مع ملفات PDF داخل متصفح الويب، فإن JavaScript خيارًا جيدًا، أما إن كنت تبني تطبيق ويب متكامل مع العديد من الوظائف بجانب التعامل مع ملفات PDF، فإطارLaravel مفيد لتوفير تجربة مستخدم متكاملة. للتأكد من أن الوثائق المرتبطة بالقراءة فقط غير قابلة للتنزيل، عليك بتنفيذ الإجراءات المناسبة في الجانب الخادم لمنع تنزيل الملفات وفقًا للسياسات التي تحددها.
  23. يوجد طرق مختلفة مثل طلبات متعددة باستخدام Ajax وإتصال مفتوح لجلب التحديثات SSE ومقبس(WebSockets ) بين الخادوم والمتصفح. واالأفضل هو استخدام تقنية تسمى WebSockets لجلب الإشعارات في الوقت الفعلي، وWebSockets هي بروتوكول يسمح للعملاء والخوادم بإجراء اتصالات ثنائية الاتجاه في الوقت الفعلي، مما يعني أن الخادم يمكنه إرسال إشعارات إلى العميل دون الحاجة إلى إعادة تحميل الصفحة. وتوفر WebSockets إمكانية إرسال إشعارات حول الأنشطة الجديدة على الموقع، مثل التعليقات الجديدة أو المنشورات الجديدة، ويمكن للمستخدمين أيضًا استخدام WebSockets للتفاعل مع الموقع في الوقت الفعلي، مثل الدردشة مع المستخدمين الآخرين أو التصويت على المنشورات. وبالطبع بإمكانك استخدام عدّة مكتبات للتعامل مع WebSockets ومن بينها: Ratchet: وهي مكتبة قوية ومتعددة الاستخدامات لإنشاء تطبيقات WebSockets. Ratchet PHP: مكتبة WebSockets تعتمد على Ratchet. Pusher: خدمة خارجية تقدم واجهة برمجة تطبيقات WebSockets. Socket.io: مكتبة WebSockets مفتوحة المصدر تدعم العديد من اللغات ، بما في ذلك PHP. Swoole: إطار عمل PHP مع دعم WebSockets مدمج. بإمكانك أيضًا الإعتماد على مكتبة Pusher ولارافيل وقد تم شرح الأمر بشكل مفصل هنا: أيضًا في لارافيل يوجد نظام إشعارات:
  24. 1- أولاً عليك تخصيص قاعدة البيانات: إضافة جدول إضافي يسمح بتخزين معلومات الزبون مثل اسم الزبون وبيانات الاتصال ومعلومات أخرى. عند تسجيل الدخول، قم بتحديد قاعدة البيانات المناسبة باستناد إلى معرف الزبون المسجل. يمكنك أن تجعل اسم قاعدة البيانات جزءًا من عملية تسجيل الدخول. استخدم قاعدة البيانات المحددة للزبون لتحميل المعلومات الخاصة به. 2- بعد ذلك إعداد واجهة المستخدم: أضف واجهة تسجيل الدخول وإنشاء حساب جديد للزبون. بعد تسجيل الدخول، يمكن للزبون إنشاء حسابه الخاص داخل التطبيق. 3- كتابة المنطق البرمجي: عندما يقوم زبون جديد بإنشاء حساب، يجب حفظ معلوماته في جدول الزبائن لديك. استخدم تخصيص المتغيرات الديناميكية مثل اسم قاعدة البيانات أو اسم المستخدم لتحديد قاعدة البيانات المستخدمة لكل زبون. 4- التخزين: عند تسجيل الدخول، قم بتحميل معلومات الزبون من قاعدة البيانات الخاصة به. قم بتحميل المعلومات المخزنة بناءً على قاعدة البيانات التي تم تخصيصها لكل زبون.
  25. بالنسبة للسؤال الأول، لمنع فتح المرحلة الثانية حتى يتم الانتهاء من المرحلة الأولى، استخدمي الكود التالي: // Check if the first level is completed if (firstLevelCompleted) { // Open the second level openLevelTwo(); } يمكنك أيضًا استخدام متغير لتحديد حالة المرحلة الحالية، مثلاً إنشاء متغير يسمى currentLevel وضبطه على 1 للمرحلة الأولى و2 للمرحلة الثانية. ثم، استخدام ذلك المتغير للتحقق مما إذا كان المستخدم قد وصل إلى المرحلة الثانية أم لا. // Check the current level if (currentLevel == 2) { // Open the second level openLevelTwo(); } بالنسبة للسؤال الثاني، لفتح المرحلة الثانية عند النقر على الزر الموجود في نهاية الصفحة الأولى، نستخدم التالي: // Click on the button to open the second level Button button = findViewById(R.id.button); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { openLevelTwo(); } }); بالنسبة للسؤال الثالث، لفتح المرحلة الثانية بعد جمع 20 نقطة، تستطيعي استخدام الكود التالي: // Check the score int score = getScore(); if (score >= 20) { // Open the second level openLevelTwo(); } بإمكانك أيضًا استخدام متغير لتحديد النتيجة الحالية، وكمثال إنشاء متغير يسمى score وضبطه على عدد النقاط التي جمعها المستخدم ثم، استخدام هذا المتغير للتحقق مما إذا كان المستخدم قد جمع ما يكفي من النقاط للانتقال إلى المرحلة الثانية أم لا. // Check the score int score = getScore(); if (score >= 20) { // Open the second level openLevelTwo(); }
×
×
  • أضف...