-
المساهمات
4914 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
61
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو محمد عاطف17
-
وعليكم السلام ورحمة الله وبركاته . نعم كثرة تثبيت المكتبات ليس جيدا على النظام . اولا من حيث سرعة واستهلاك الموارد الخاصة بالنظام . ثانيا ان معظم المكتبات يتم هجرها او تحديثها مما يسبب خلل فى النظام و ايضا ثغرات امنية اذا لم يتم تحديث المكتبات لاخر اصدار. ثالثا من حيث التعارضات فمن الممكن ان تسبب المكتبات الكثيرة تعارضات فى النظام فمن الممكن ان تعتمد مكتبة على اصدار معين من مكتبة اخرى وانت تستخدم اصدار مختلف لهذه المكتبة فان التعارضات ستسبب لك الكثير من المشاكل. اما بالنسبة للسؤال الاخر لماذا يتم تثبيت مكتبات اخرى مع المكتبة التى يتم تثبيتها . هو لان معظم المكتبات تعتمد بداخلها على مكتبات مساعدة وبالفعل فحتى البشر يحتاجون الى بعضهم البعض لتنفيذ اى امور وكذلك المكتبات . واخيرا نصيحة لك هو عدم استخدام المكتبات الا اذا كنت ستستخدمها بكثرة لديك فان معظم المبتدئين يقومون بتنزيل مكتبة لتنفيذ سطر معين او جزء فقط فى الكود وكان من الافضل ان ينشئه هو حتى لا يثقل النظام بكثرة المكتبات .
- 12 اجابة
-
- 1
-
-
وعليكم السلام ورحمة الله وبركاته . الاجابة نعم و لا فى نفس الوقت . ان معرفة الخوارميات تكسبك المعرفة و القدرة على حل المشاكل فكلما كانت لديك حصيلة كبيرة من الخوارزميات كان تفكيرك و حلك للمشاكل اسرع وافضل . ومعنى كلمة خوارزمية فهى طريقة لحل مشكلة وكلما كنت الطريقة اسرع و لا تاخذ موارد كثيرة من الجهاز كانت افضل من الخوارزميات الاخرى . اذا كلما كنت ملما بخوارميات كثيرة فهى افضل لك ولكن من الممكن ان تسبب لك تشتت من كثرة الخوارميات الموجودة فكما انت وضحت فقط تعلم احدث وافضل الخوارزميات الموجودة . فمثلا فى ترتيب المصفوفات توجد خوارزميات كثيرة جدا منها مثلا Selection Sort و Bubble Sort و Heap Sort و Merge Sort و العديد ولكل خوارزمية عيوب و مميزات ومن المستحيل الالمام بها جميعا .
- 5 اجابة
-
- 1
-
-
من المفترض ان ال live server يقوم بعمل مجلد المشروع الذى تقف فيه الى سيرفر ومن المفترض ايضا ان يستدعى ملفات الجافاسكريبت بشكل طبيعى . ان الكود الذى قمت بارفاقه يوجد فيه بعض الاخطاء لهذا لا عمل جيدا . وقد قمت بتعديل الاخطاء لك . اذا لم يعمل هل يمكنك ارسال صورة لل console لديك . حتى ارى ما هى الاخطاء الموجودة . class Person { constructor(name, age) { this.name = name; this.age = age; } // get age() { // return this._age; // } hellow() { console.log( `Hello , My name is ${this.name} , and I am ${this.age} years old` ) } } class Student extends Person { constructor(name, age, level) { super(name, age); this.level = level; } } const person = new Person('Ibrahim', 26); person.hellow(); // try and catch try { alert('try'); } catch (error) { alert('catch'); } function area(width, height) { if (isNaN(width) || isNaN(height)) { throw Error('Parameter is a number'); } return width * height; } const wait = time => new Promise( (resolve, reject) => { if (time > 5000) reject('Sory I can \ t wait'); setTimeout(resolve, time) } ); wait(2000) .then(() => { console.log("hello"); return wait(1000); }) .then(() => { console.log('world !'); }); new Promise((resolve, reject) => { setTimeout(() => resolve(1), 1000); }) .then(result => { console.log(result); return result * 2; });
- 2 اجابة
-
- 1
-
-
ان ال remainder او باقى القسمة لا يمكن ان يتم على متغير من نوع float او double بل يجب ان يكون المتغيران من نوع int لانه يسمى باقى القسمة فليس له اى معنى لقسمة متغيرات من نوع float او double. وايضا يجب جعل المتغير Seconds من نوع int حيث لا توجد ثوانى بكسور اى لا يمكن مثلا ان يدخل المستخدم 60.5 . فيمكنك تغير نوع المتغير او عمل TYPECASTING للمتغير هكذا #include <iostream> #include <cmath> using namespace std; int main() { float Seconds; float remender; cout << "Enter Number Seconds: \n"; cin >> Seconds; int secperD = 24 * 60 * 60; int secperH = 60 * 6; int secperM = 60; int NumOfD = floor(Seconds / secperD); remender = (int) Seconds % secperD; int NumOfH = floor(remender / secperH); remender = (int) Seconds % secperH; int NumOfM = floor(remender / secperM); remender = (int) Seconds % secperM; int NumOfS = remender; } وايضا يوجد خطأ لديك حيث لم تقم بعمل include لمكتبة cmath وهى ضرورية لاستخدام الدالة floor
-
وعليكم السلام ورحمة الله وبركاته . اولا ساشرح لك لما يحدث الخطأ لديك . حينما تقوم باضافة مستمع للحدث (event listener) فانت تضيفه على كل الاجابات مع كل سؤال . اى لو ان لديك 4 اسئله فانت تضيف events listner على كل اجابة 4 مرات . ومع كل click على الاجابة فسيتم تنفيذها بعدد الاسئلة . اى ان فى السؤال الثالث و الاخير فانه يتم تنفيذ الكود الخاص بالتحقق من الاسئلة السابقة ايضا لذلك يظهر اكثر من اجابة صحيحة. ويحدث الخطأ لديك فى السؤال الثالث والاخير لان الاجابة الصحيحة ليس الاجابة رقم 2 . قم بتبديل مكان الاجابة الصحيحة للسؤال الثانى وسيظهر الخطأ فيه هو ايضا . والحل لذلك هو حذف الاجابات القديمة وانشاء اجابات جديدة مع كل سؤال . وهذا هو الكود كاملا بعد التعديل. const questions = [ { question: "which is largest animal in the world?", answers: [ { text: "Shark", correct: false }, { text: "Blue whale", correct: true }, { text: "Elephant", correct: false }, { text: "Giraffe", correct: false }, ], }, { question: "Which is the smallest continent in the world?", answers: [ { text: "Asia", correct: false }, { text: "Australia", correct: true }, { text: "Arctic", correct: false }, { text: "Africa", correct: false }, ], }, { question: "Which is the smallest country in the world?", answers: [ { text: "Vatican City", correct: true }, { text: "Bhutan", correct: false }, { text: "Nepal", correct: false }, { text: "Shri Lanka", correct: false }, ], }, { question: "Which is the more popular programmation language?", answers: [ { text: "JIK", correct: false }, { text: "Batata", correct: false }, { text: "Javascript", correct: true }, { text: "Youssef", correct: false }, ] } ]; const quiz = document.querySelector(".quiz"); const questionTitle = document.getElementById("quiz-question"); let choices = document.querySelectorAll(".quiz__choice"); const nextButton = document.getElementById("next-button"); const score = document.querySelector(".score"); const scoreNumber = document.getElementById("score-number"); const numberOfQuestions = document.getElementById("score-questionsNumber"); let scoreCounter = 0; let questionCounter = 0; const againButton = document.getElementById("score-again"); makeQuiz(0); nextButton.addEventListener("click", function () { if (questionCounter < questions.length) { makeQuiz(questionCounter); choices = document.querySelectorAll(".quiz__choice"); choices.forEach(function (choice) { choice.classList.remove("quiz__answer--correct", "quiz__answer--wrong"); }) } else { quiz.style.display = "none"; score.style.display = "block"; scoreNumber.textContent = scoreCounter; numberOfQuestions.textContent = questions.length; } }) function makeQuiz(questionIndex) { questionTitle.textContent = questions[questionIndex].question; let answers = questions[questionIndex].answers; choices = document.querySelectorAll(".quiz__choice"); choices.forEach(function (choice, answersIndex) { choice.textContent = answers[answersIndex].text; var new_element = choice.cloneNode(true); choice.parentNode.replaceChild(new_element, choice); new_element.addEventListener("click", function () { if (answers[answersIndex].correct) { new_element.classList.add("quiz__answer--correct"); scoreCounter++; } else { new_element.classList.add("quiz__answer--wrong"); choices = document.querySelectorAll(".quiz__choice"); choices.forEach(function (item, answersInd) { if (answers[answersInd].correct === true) { item.classList.add("quiz__answer--correct"); } }) } nextButton.disabled = false; }); }); questionCounter++; }
- 3 اجابة
-
- 1
-
-
وعليكم السلام ورحمة الله وبركاته . هل تاكدت فى ال inspect اذا كانت الرساله تاخذ اسم ال class صحيحأ ؟ اى انه يوجد لديه class يساوى ext-red-700 bg-red-100 اذا كان العنصر ياخذ اسم ال class صحيحا فاذا المشكلة ان هذا ال class ليس موجود فى ملفات ال css تاكد من ان هذه القيمة موجودة فى ملفات ال style
- 3 اجابة
-
- 1
-
-
هذا جيد حيث بعد ان قام المستخدم بتغير القيم وارسالها لم تتغير لديك على الموقع و هذا يثبت انك قمت بحماية البيانات جيدا . واذا كنت تقصد انك تريد منع المستخدم من التلاعب بها فى الصفحة فقط فهذا ليس ضروريا لانه كما اخبرتك ان هذه واجهة امامية اى خاصة بالمستخدم اى انه اى تعديل يقوم به فى الصفحة يظهر له فقط . حينما بدات بتعلم ال web كنت احب ان ادخل واغير فى inspect الخاص بالمواقع حيث مثلا اقوم مرة بتغير رصيدى مثلا او اى شئ اخر وهذا فقط يتغير لدى اى فى الواجهة الامامية فقط وليس له اى دخل فى الخادم . لذلك لا تقلق نفسك بشغل اكثر من اللازم وليس ضروريا حيث ان كثرة كتابة اكواد الجافاسكريبت ليست شيئا جيدا فهى من الممكن ان تسبب بطئ فى تصفح الموقع الخاص بك .
-
من المستحيل منع المستخدم من تعديل القيم التى يتم ارسالها الى الخادم . حيث انها تسمى واجهة امامية اى ان المتحكم الرئيسى فيها هو المستخدم وليس المطور . نعم يوجد طرق تقوم بتصعيب الامور على المستخدم ولكن من الماكد انه سيقوم بتخطيها فحتى لو قمنا باضافة اكواد javascript للتحقق من القيم قبل ارسالها فان المستخدم يستطيع ايقافها . ومن اللمكن ايضا الا يحتاج المستخدم الواجهة الامامية اساسا بل يمكن ارسال الطلب عن طريق ال api client مثل postman مثلا او اى شئ اخر ويستطيع ارسال اى بيانات ومن الثغرات المشهورة هى sql injection حيث يستطيع المستخدم حقن اوامر sql وارسالها الى الخادم بغرض الوصول الى البيانات او حتى حذفها والتلاعب بها . وهناك مقولة شائعه كنا نقوم بدراستها فى الجامعة ان يجب ان نتعامل مع المستخدم على انه مستخدم مسئ اى هكر او يحاول تخريب النظام الخاص بنا لذلك يجب فى الواجهة الخلفية التاكد تماما من صحة البيانات المرسلة من المستخدم قبل حفظها فى قاعدة البيانات او التعامل معها حتى لا يتم تخريب النظام . وبما انك تستخدم asp.net core فيمكنك استخدام Model validation للتحقق من صحة البيانات قبل العمل عليها وهذا الرابط للموقع الرسمى لمايكروسوفت ويمكنك التعمق اكثر فيه والبحث عن فيديوهات تقوم بشرح طرق التحقق من البيانات فى الواجهة الخلفية .
-
مرحبا احمد . للاسف لن يمكنك الحصول على المعامل place الذى فى المسار داخل الدالة getStaticPaths حيث ان هذه الدالة يتم تنفيذها قبل البناء اى انها لاتستطيع الوصول الى المسار الحالى . وساشرح لك اكثر عن طريقة عملها . return { paths: [ { params: { id: '1' }}, { params: { id: '2' }, }, ], fallback: ... } لاحظ هنا قمنا بتعريف مسار يحتوى على id 1 و id 2 وبذلك فان next.js يقوم بحفظ هذه المسارات وبنائها اى انه داخليا قام بتخزين الصفحة التى تحتوى على id 1 و id 2 واذا ما كان المسار يحتوى على id سواهما سوف يقوم باظهار صفحة 404 . وهكذا بعد ان علمنا كيف تعمل getStaticPaths لنحل المشكلة التى تواجهك سويا . ان المنطق (logic) الذى تنفذه يوجد فيه بعض الاخطاء فيجب ربط الاماكن ب العروض ولكنك لم تقم بذلك . فمن المفترض ان يحتوى الثابت programs لديك على خاصية تسمى place_id وتحتوى على ال id الخاص بالمكان وبذلك فى الدالة getStaticPaths تقوم بارجاعها مع ال id الخاص بال program وقد قمت بارفق الملف لك بعد التعديل .ولكن يجب عليك انت اضافت ال id على حسب البرنامج والمكان فانا قمت باضافت قيم عشوائية. ناتى الان لتعديل الدالة getStaticPaths قم باستبدالها بهذا الكود بان تقوم باضافة ال place_id فى الثابت programs export async function getStaticPaths() { const programIds = programs.map((program) => ({id:program.id,data:program.place_id})); const paths = programIds.map((program) => ({ params: { place: program.id.toString() , data: program.data.toString() }, })); return { paths, fallback: false }; } ومن ثم يمكنك زيارة هذا المسار http://localhost:3000/packages/worldpackages/6/5 وسيعمل معك . constants.js
- 3 اجابة
-
- 1
-
-
وعليكم السلام ورحمة الله وبركاته. تستخدم ال الforeach لتكرار تنفيذ امر معين و طريقة استخدامها هنا صحيحة حيث اذا كان الامر الذى نريد تنفيذه هو عبارة عن سطر واحد فلا مشكلة من عدم وضع اى اقواس .ولكن اذا كان الامر الذى نريد تكراره اكثر من سطر ولم نضع الاقواس فسيتم تكرار اول سطر فقط وباقى الاسطر سيعتبر انها ليست بداخل ال foreach . اما بالنسبة لاستخدام += فهى طريقة مختصرة فبدلا من كتابة الامر هكذا . $acc = $acc + $number; قمنا باختصارها وهى تعنى اننا نريد ان نضيف على القيمة التى فى اليسار قيمة جديدة تساوى القيمة التى فى اليمين . ومن الممكن ايضا استخدام جميع المعاملات -= او *= او /= ايضا. ويوجد خطأ لديكى فى الكود فلاحظى هنا فى تعريف معامل الدالة sum قمتى بكتابته هكذا function sum(...$numbers) فهذا معناه انكى تخبرين php ان يقوم بجمع جميع المعاملات التى يتم تمريرها الى الدالة فى مصفوفة . لذلك عند استدعاء الدالة sum لا تقومى بارسال مصفوفة بل بارسال الارقام متفرقة هكذا . sum(3,2,4,10); و php تلقائيا سيقوم بجمعهم فى مصفوفة واحدة ويضعها فى المعامل $numbers . اى انكى اذا حاولتى ان تقومى بطباعة المعامل $numbers سترين انه مصفوفة وليس رقم .
- 3 اجابة
-
- 1
-
-
كما توقعت . بالفعل هذه مشكلة فى jqeury حيث ان jquery فى اول مرة يتم استدعاء الدالة data للعنصر فانه يقوم بحفظها لديه و اذا تم التعديل عليها فان jquery لا يشعر بهذا التعديل اذا كان تم التعديل عليها بدونه . لذلك فانه عندما يقوم livewire باعادة بناء العنصر فان jquery لا يلاحظ انه تم تغير ال data-image_url لذلك الحل هو ان تقوم باستبدال السطر لديك بهذا السطر. $("#image_src").attr("src", $(this).attr('data-image_url')); او يمكنك اضافة هذا السطر فى بداية الدالة حيث يجعل jquery يقوم بحذف ال data التى قام بحفظها مسبقا . وبذلك يقوم بانشائها مجددا عن اول مرة اخرى يتم استخدامها. $(document).on("click", ".show-image-modal", function () { $(this).removeData(); if ($(this).data('type_media') === "video") { $("#video_src").attr("src", $(this).data('video_url')); $("#image_src").hide(); $("#view_media_card_footer").show(); } else { $("#view_media_card_footer").hide(); $("#image_src").show(); $("#image_src").attr("src", $(this).data('image_url')); } $("#image_modal").modal("show"); });
-
هل يظهر اى اخطاء فى ال console ؟ هل يمكنك اضافة هذا السطر لطباعة قيمة ال image_url واخبرنى هل القيمة الجديدة التى يتم طباعتها فى ال console ام القيمة القديمة. $(document).on("click", ".show-image-modal", function () { if ($(this).data('type_media') === "video") { $("#video_src").attr("src", $(this).data('video_url')); $("#image_src").hide(); $("#view_media_card_footer").show(); } else { console.log($(this).data('image_url')); $("#view_media_card_footer").hide(); $("#image_src").show(); $("#image_src").attr("src", $(this).data('image_url')); } $("#image_modal").modal("show"); });
-
هل تاكدت من ان هذا الزر يتم اعادة بناءه عند عمل update للصورة ؟ لانه من المتوقع ان المشكلة فى هذا الزر حيث يحتفظ بقيمة الصورة القديمة فى data-image_url . اذا كانت تلك المشكلة فيجب ان يتم اعادة بناء الزر عند التغير حيث يمكنك انشاء حدث يسمح باعادة بناء الزر . اذا لم يتم حل المشكلة هل يمكنك ارسال ملفات المشروع
-
الخطأ لديك هو فى الاضافة composer Companion فى vs code . يمكنك حل الطريقة عن طريق التالى : اولا قم بالضغط على قائمة file ثم Prefrences ثم settings. ستظهر لنا هذه الشاشة نقوم بكتابة هذا السطر ثم نضغط على هذا الرابط @ext:faelv.composer-companion سيقوم بفتح لنا هذا الملف لنقم بحذف هذين السطرين . وهكذا يجب ان يتم حل المشكلة ان شاء الله.
- 2 اجابة
-
- 2
-
-
فعلا للاسف لن يمكن ان تضيف هذه الخاصية فى بلوجر حيث انه ليس برمجة خاصة . نعم يمكنك هذا وهو الافضل من نظرى ومن الافضل ايضا ان تضيف عداد مثلا الى الصفحة تخبره انه سيقوم بتحويله . <script type="text/javascript"> function showLucky(e) { var t = e.feed; var n = t.entry || []; var r = t.entry[0]; for (var i = 0; i < r.link.length; ++i) { if (r.link[i].rel == "alternate") { var href = r.link[i].href; href += "?khatar3"; window.location.href = href; } } } function fetchLuck(e) { script = document.createElement("script"); script.src = "/feeds/posts/summary?start-index=" + e + "&max-results=1&alt=json-in-script&callback=showLucky"; script.type = "text/javascript"; document.getElementsByTagName("head")[0].appendChild(script); } function feelingLucky(e) { var t = e.feed; var n = parseInt(t.openSearch$totalResults.$t, 10); var r = Math.floor(Math.random() * n); r++; fetchLuck(r); } const urlParams = new URLSearchParams(window.location.search); const myParam = urlParams.get('link'); if(myParam != null){ var script = document.createElement("script"); script.src = "/feeds/posts/summary?max-results=0&alt=json-in-script&callback=feelingLucky"; script.type = "text/javascript"; document.getElementsByTagName("head")[0].appendChild(script); } </script> يمكنك استخدام هذا الكود وسيقوم بالعمل اذا وجد فى العنوان كلمة link سيقوم بتحويله الى مقالة عشوائية واذا لم يوجد سيقوم بفتح الصفحة الاساسية . وهنا فى هذا السطر يمكنك تغير الكلمة كما تريد . const myParam = urlParams.get('link');
- 11 اجابة
-
- 1
-
-
ما هى لغة برمجة الموقع ؟ الافضل هو تحويله من السيرفر لانه ليس من الافضل تحويله من ال js script لان المستخدم قد يتضايق فكيف اذا حملت الصفحة ثم يتم اعادة توجيهة اى انه سيقوم بتحميل صفحتين بدل من صفحة واحدة .
- 11 اجابة
-
- 1
-
-
فى الاصدار رقم 10 من لارافيل يمكنك استخدام هذا الامر لانشاء ملفات الترجمة php artisan lang:publish سيقوم بانشاء مجلد lang وبداخله مجلد en يحتوى على ملفات الترجمة . ناتى الان لاضافة لغه جديدة لنفترض مثلا اللغة العربية ستقوم بانشاء مجلد جديد يسمى ar فى مجلد lang وتضع نفس الملفات فى مجلد en ولكن تقوم بترجمتها . واذا اردت اضافة ملف جديد يجب اضافة فى جميع المجلدات فى مجلد lang . ثانيا لاستخدام الترجمة نستخدم الدالة __() وبين الاقواس نضع اسم الملف ثم نقطة ثم المفتاح الخاص بالترجمة ..فمثلا {{__('validation.string')}} هنا نخبر لارافيل ان تقوم باستخراج الترجمة من ملف validation و مفتاح يسمى string . لنفترض ان هذا هو ملف ال validation فى مجلد en <?php return [ "string" => "english" ] ?> و هذا هو ملف ال validation فى مجلد ar <?php return [ "string" => "عربى" ] ?> اذا لارافيل سيقوم بطباعة كلمة عربى اذا كانت اللغه العربية و طباعة كلمة english اذا كانت اللغه الانجليزية . ناتى الان كيف سيعرف لارافيل اللغة الان . Route::get('/test/{locale}', function (string $locale) { if (! in_array($locale, ['en', 'ar'])) { abort(400); } App::setLocale($locale); }); هنا فى تعريف ال route نستخدم local حيث هو نوع اللغه فاذا كان العنوان test/en اذا اللغه الانجليزية واذا كان test/ar فاذا اللغه العربية. لذلك لن تقوم باعادة جميع الشغل فقط ملفات ال views ستقوم باستخدام الدالة __() للترجمة وبالنسبة للقوالب ستختلف فقط فى طريقة العرض من اليسار الى اليمين فيجب عليك استخدام قالب يدعم الاتجاهين .
- 7 اجابة
-
- 1
-
-
يمكنك وضع البيانات الخاصة بقاعدة البيانات من اسم المستخدم وكلمة السر و ال host فى ملف env. ولارافيل تلقائيا سيقوم بالاتصال بقاعدة البيانات واستخدامها . وهذه هى البيانات التى يجب ملئها فى ملف env. DB_CONNECTION=mysql // هنا نوع قاعدة البيانات DB_HOST=127.0.0.1 // هنا الهوست الخاص بها اذا كان الهوست محليا على الجهاز فقط استخدم هذا الهوست DB_PORT=3306 // هنا ال port الخاص بقاعدة البيانات DB_DATABASE=laravel // هنا اسم قاعدة البيانات DB_USERNAME=root // هنا اسم المتخدم DB_PASSWORD= // هنا كلمة السر اما بالنسبة لجزء المصادقة (authentication) اى تسجيل الدخول والخروج فيمكنك انشائها بنفسك او استخدام جزمة breaze الخاصة بلارافيل وساخبرك بكيفية تنصيبها. اولا نقم باستخدام هذه الاوامر فى موجه الاوامر ويجب ان تكون فى المجلد الخاص بالمشروع ويفضل ان يكون مشروع جديد قد تم انشائه حديثا حتى لا يتم فقد بعض البيانات . composer require laravel/breeze php artisan breeze:install blade php artisan migrate وبعد تنفيذ هذه الوامر ستجد ان لارافيل قد قام باضافة عدد من المجلدات والملفات اهمهم : ملف auth.php فى مجلد routes حيث قام لارافيل بانشاء عدة عناوين للتسجيل الدخول وتسجيل الخروخ وانشاء حساب جديد وايضا عنوان لتفعيل الحسابات و نسيان كلمة المرور مجلد auth داخل مسار resources/views حيث قام لارافيل بانشاء واجهة مستخدم للتسجيل وتسجيل الخروج ويمكنك وضع الواجهة الخاصة بك فى هذه الملفات ولكن تاكد بوضع ال action فى ال form الى ال route الذى قام لارافيل بانشاءه . وايضا مجلد Auth فى مسار app/Http/Controllers وهى controllers خاصة بالمصادقة وقد قام لارافل بانشائها دون الحاجة الى كتابتها بانفسنا . واذا احتجت اى مساعدة فقط اخبرنى.
-
ان لارافيل من اطارات العمل القوية التى توفر العديد من الدوال والخصائص التى توفر عليك كثير من الوقت . اولا بالنسبة لرسائل الخطأ validation فان لارافيل تستخدم ما يسمى Error Bags اى حقائب الاخطاء وهى تستخدم خاصية ال Session اى ان الخطأ يتم تخزينه فى ال Session ويتم تضمينه فى ال request التالى ويستخدم مره واحده . فمثلا لو يوجد لديك form تستقبل بيانات وعند ارسالها للخادم يجب التحقق من صحتها باستخدام دالة validate. $request->validate([ 'title' => 'required|unique:posts|max:255', 'author.name' => 'required', 'author.description' => 'required', ]); هذا المثال كما موجود فى ال documentation الخاصة بلارافيل هنا يتم التحقق من البيانات التى تم ارسالها للخادم واذاما كانت خاطئة وليست مثل القواعدالتى تم وضعها فان لارافل يقوم بارجاعك الى الصفحة السابقه مع تضمين ال errors فى ال sessions . وبالنسبة لرسائل الخطأ ستجد ان لارافيل يوفر لك ملفا كاملا لجميع انواع رسائل الخطأ وستجده فى هذا المسار lang/en/validation.php ولارافيل لديه القوة فى معرفة نوع الخطأ وبالتالى سيقوم ارجاع رساله الخطأ اللازمة ويقوم ايضا بوضع اسم الحقل فى رساله الخطأ. ويمكنك عرض رسائل الخطأ عن طريق الداله @error او المتغير errors$
- 3 اجابة
-
- 1
-
-
دالة ال constructor هى من الدوال السحرية (magic method) فى php . تستخدم هذه الدالة لتهيئة المتغيرات او تنفيذ اوامر قبل انشاء الكائن وهى من ال concepts الاساسية فى برمجة الكائنات OOP. وتستخدم فى ال controller الخاص بلارافيل لتنفيذ اوامر قبل الذهاب الى الدالة الخاص ب ال route فكما موجود فى الصورة فانه قد قام باضافه middleware داخل الدالة وبذالك يخبر لارافل بانه يريد اى route يستخدم هذا ال controller بالتاكد منه انه مستخدم وله صلاحية الادمن.
-
هلا اخى . كما اخبرتك سابقا يمكنك تعديل اى صفحة كما تشاء فقط قم بتغير القاعدة الخاصة فى ملف htaccess . وقد قمت بتعديل الملف ليتناسب مع هذه الروابط. .htaccess
- 13 اجابة
-
- 1
-
-
نعم هى بالفعل ستقوم بتحسين الارشفه . قم فقط باستخدام الملف الذى ارفقته لك وسيعمل جيدا ان شاء الله . واذا اردت تغير صفحات اخرى ستقوم فقط كلمة page بكلمة post مثلا فى السطرين الاخرين بعد ان تقوم بنسخهمها . ولكن تاكد من مسارات الملفات فالكود المرفق يعتبر الملفات فى مجلد ال root اى العنوان كالتالى https://test.com/page.php اذا لم يكن العنوان هكذا فيجب تغيره فى القواعد الخاصة فى ملف .htaccess
- 13 اجابة
-
- 1
-
-
واياكم اللهم امين . هل يمكنك ان تخبرنى ما هى الملفات التى توجد لديك هل هى ملفات html ام php ؟ وماذا تقصد باضافة صفحات اخرى هل تقصد انك لكل استعلام تقوم باضافة صفحة ؟ لقد قمت بارفاق الملف الذى يحتوى على الاكواد ويجب ان تضعه فى المجلد الرئيسى لديك وسيعمل معك ولكن تاكد من انه لا يوجد لديك هذا الملف مسبقا اذا كان موجود مسبقا قم فقط باضافه هذه الاسطر . RewriteEngine On RewriteCond %{QUERY_STRING} id=(.*) RewriteRule ^page.php$ /page-%1.html? [R=301,L] RewriteRule ^page-([^?]*).html$ /page.php?id=$1 [QSA,L] اذا كان اول سطر موجود لديك فقم بحذفه ولا تضيفه مرة اخرى .htaccess
- 13 اجابة
-
- 1
-