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

Adnane Kadri

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

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

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

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

    52

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

  1. تفضيلات المستخدم فيما يخص وضع التصفح او السمة المفضلة او غيرها تخزن غالبا على المتصفح في التخزين المحلي له، ولا يتدخل لارافيل في ذلك الا في حالات خاصة. لأنها تخص المستخدم كزائر في اوضاع معينة. اما بالنسبة لتمييز المستخدمين عن بعض فيتم استعمال الجلسات ورموز الوصول access tokens وغيرها. قد يتم تخزين هاته الرموز في المتصفح وترسل في الترويسات او كمعاملات في طلبيات الـ HTTP القادمة من هذا المستخدم. بحيث يقوم التطبيق باستعمالها لفلترة معلومات تخص المستخدم او جلسته السابقة. وقد لا يتم الاعتماد اساسا على لارافيل او الواجهة الخلفية في ذلك، فيتم الاعتماد كليا على الجافاسكربت لتحليلها واستخراجها وحقنها مباشرة الى واجهة المستخدم بعد طلبه الصفحة او الموقع. وهو الأكثر شيوعا. فهي بيانات تخص المستخدم نفسه وتفضيلاته وليس المستخدم والموقع على حد سواء. عموما، يتحكم في هذا نوع هاته البيانات ومدى حساسيتها. بمعنى أنك لن تحتاج تمييز المستخدمين عن طريق لارافيل، لأن ذلك سيكون في الغالب عن طريق الجافاسكربت التي ستقوم بحقن بيانات معينة في ملفات تعريف الارتباط، الجلسات او التخزين المحلي تشير الى موقعك. هاته الثنائية: نطاق موقعك - متصفح المستخدم. تعطيه هذا التمييز بشكل تلقائي. ثم ستقاد باقي العملية عن طريق الجافاسكربت هي الأخرى.
  2. لأنك تقومين بتغيير حالة العنصر عند المرور عليه فقط. فأنت تقومين باظهاره واخفاءه عند المرور عليه فقط. أما المطلوب هو: اخفاءه عند المرور اظهاره عند المغادرة يقتضي هذا التعامل مع حدثي: مرور مؤشر الفأرة مغادرة مؤشر الفأرة
  3. هل حاولت الاستفادة من الحدث 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") }) }) فهم الأحداث في جافاسكربت
  4. صفحة الملف الشخصي هي في الاصل صفحة ديناميكية متغيرة المحتوى مخزنة في الخادم يتم كل مرة عرض معلومات متغيرة فيها حسب المستخدم الذي يطلب هاته الصفحة من الخادم. فعندما يستقبل الخادم بيانات المستخدم الجديد اول مرة فإنه يقوم بتخزينها في قاعدة البيانات. ثم عندما يطلب هذا المستخدم الصفحة الخاصة به بعد تسجيل الدخول سيتم عرض الصفحة الديناميكية مع تغيير المواضع الديناميكية (مثل الاسم والبريد الالكتروني والصورة الشخصية) بما يوافق هذا المستخدم المسجل (أكيد انه يقوم الخادم بجلبها من قاعدة البيانات). يندرج كل هذا تحت مفهوم تطوير الواجهات والنظم الخلفية back end developpement. والأمر سيان في كامل لغات الواجهة الخلفية مثلها مثل asp.net . فقد تختلف اللغة وسياقها ولكن تبقى الطريقة والسبيل الى القيام بذلك واحد. أظنك جديد بتطوير الواجهات الخلفية. راجع الاجوبة على:
  5. يمكنك الاسعانة بجافاسكربت ايضا لتطبيق ذات الفكرة. فعند الضغط على العنصر يتم الانزلاق الى عنصر ما. نقوم بتحديد عنصر الرابط الفائق: <a href="" class="home-link"> home </a> var el = document.querySelector('.home-link'); ثم نسند الى حدث الضغط عليه حدث الانزلاق الى الحاوية المستهدفة. والتي هي الحاوية w في هاته الحالة: el.addEventListener('click' , () => { document.querySelector(".w").scrollIntoView(); })
  6. نلجئ عادة في هذا لاستخدام مساحات التخزين السحابية cloud storage. فهي المختصة عادة بتخزين الوسائط وتقديمها وفق سرعات محددة وقياسية. بجانب انها تكون اقل كلفة واحسن آداءا. يمكن في الغالب الاتصال بها عن طريق واجهات التطبيق البرمجية. بمعنى انك ستحصل على تخزين سحابي دون الاضطرار الى نقل الموقع الى الاستضافة المرافقة له. فملفات الموقع ستكون في مكان وملفات الوسائط في مكان. يعطي هذا أمانا اكثر وضمانا اكثر في حماية البيانات. فيما يلي أكثر خدمات التخزين السحابي شيوعا: Microsoft OneDrive Google Drive Dropbox Apple iCloud Drive cloudinary IDrive تعرف اكثر عن مفهوم السحابة والحوسبة السحابية cloud
  7. طريقة أخرى لحقن النص ضمن العنصر المستهدف هي في انشاء عقدة 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
  8. مبدئيا، لن يمكن كتابة جملة شرطية تقوم بايجاد القيمة الاصغر. فالعبارات الشرطية في البرمجة تقيد حدوث تو تنفيذ استعلام برمجي بشرط ما. ولا يمكن الاعتماد كليا على الشرط لهذا الغرض. مثال: if(condition) { // statement } أظنك تقصدين خوارزميات التكرار او الفلترة. فهي ما تختص أساسا بهذا الغرض. يرجى الاشارة الى اللغة البرمجية المستهدفة التي تريدين فيها المساعدة في كتابة الشيفرة.
  9. هل الجداول تحتوي بالفعل على علاقات؟ يرجى ايضا فهم الاستعلام على نحو جيد لتنفيذه. هل يحتوي الجدول المستهدف على عمود order_id؟ و جدول orders على عمود id؟ هل يمتلكان نفس نوع البيانات؟ في حالة التعذر رغم ذلك جرب تنفيذ: SET FOREIGN_KEY_CHECKS=0; ثم اعد المحاولة.
  10. جرب تنفيذ الاستعلام ALTER TABLE ADD CONSTRAINT للتعديل على جدول منشئ بالفعل ALTER TABLE related_table ADD FOREIGN KEY (order_id) REFERENCES orders(id) ON DELETE CASCADE; يقتضي هذا ان لا تكون العلاقة معرفة بالفعل. لأنها هي الأخرى قيد CONSTRAINT. ان كانت هنالك علاقات بالفعل، يجب حذفها اولا ثم تنفيذ الاستعلام الموصوف لتعريف العلاقة وفق قيد.
  11. هل جربت تعريف القيد ON DELETE CASCADE عند تعريف العلاقات بين الجداول؟ يتم استخدام هذا القيد في MySQL لحذف الصفوف من الجدول الفرعي تلقائيا عند حذف الصفوف من الجدول الأصلي. مثلا، عندما يقوم المستخدمون بالتسجيل في الموقع ورفع منتجات خاصة بهم مثلا. سيتم التخلص من هاته المنتجات مباشرة بعد حدف المستخدم المعني. يمكن اضافة تعريف القيد الى تعريف العلاقة كـ: CREATE TABLE some_related_table ( id INT, order_id INT, FOREIGN KEY(order_id) REFERENCES orders(id) ON DELETE CASCADE ); ثم سيتم اعتبار هذا القيد عند كل حذف. راجع الاجابة
  12. لأنه تم حقن عنصر li في عنصر ul.collection . في السطر 25 . يعني انه سيمكن استعراض الناتج بشكل عادي
  13. هي مضافة بالفعل، أنت لم تقم بحقن الناتج الى عنصر body لتختبر الناتج فقط. جرب تحديد body واضافة العنصر li اليه وسترى انها مضافة. li.appendChild(a); document.body.appendChild(li); console.log(li); يمكنك ايضا طباعة محتوى ال HTML الخاص بالعنصر li لرؤية الناتج: a.innerHTML = `<p>mohammed is dev</p>` li.appendChild(a); console.log(li.innerHTML); لأن طباعة li مباشرة ستعطي كائنا عن الصنف HTMLLIElement فقط.
  14. يفترض ان تكون هنالك علاقة بين المنشور المراد جلبه والمستخدم. يوجد التابع with لخدمة هذا الغرض، يمكن استعماله لجلب الجدول المرتبط هنا: Product::with('user')->find($someProductId); يقتضي هذا ان توجد علاقة بين الجدولين: // app/models/User.php public function user(){ return $this->belongsTo(User::class); }
  15. أظن انه لا يوجد في فكرة بناء بوت للتداول شيء خفي، كل ما يجب عليك هو الاستماع لأحداث معينة والتصرف بناء عليها. مثل استهداف الوظيفة "بيع" عند الحدث: "وصول الرمز كذا الى مبلغ كذا." ستحتاج في هذا الاتصال عن طريق واجهات التطبيق البرمجية APIS بمصادر خارجية للحصول على أسعار الوقت الفعلي للرموز التي تحاول التداول فيها. ومن جهة اخرى وصولا عن طريق الـ API الى حسابك في الموقع الوسيط (البروكر) الذي تشتغل فيه. هاته هي الفكرة بشكل مبدئي فيه. قد تجد حزما ومكتبات مفتوحة المصدر ممن طوروا هذا النموذج أكثر ليستوعب استراتيجيات التداول مثلا. فهو ليس حكرا على لغة برمجية دون غيرها. ومثلما يمكن عمله بلغة C++ يمكن ايضا عمله بجافاسكربت او غيرها. قد يكون هنالك بعض المعايير التي تحاول التفضيل بين لغة واخرى في هذا الاطار من مثل: ان تكون اللغة قابلة للتوسع بشكل كبير، لأنك قد تحتاج تغيير استراتيجيات التداول الخاصة بك او بعملاؤك او تطويرها. ان تتوفر على مؤشرات ومقاييس الآداء. لأنها قد تستعمل في تقييم خوارزمية ما. ان تتوفر على طرق بسيطة للتعامل مع بيانات الوقت الفعلي (نتحدث عن التعامل مع بروتوكول websocket). لأنك ستحتاج دوما اسعارا محدثة وجديدة. ان تكون متوافقة مع انظمة التشغيل cross-platform. فأنت لا تريده ان يتعطل في بيئة تشغيل غير التي بني عليها. ان تكون سريعة في جمع وتحليل ومعالجة وتخزين والتعامل مع مجموعات بيانات ضخمة. ان كنت تحترف لغة معينة على وجه الخصوص استعملها لذلك، وإلا فإنه يمكنك الاختيار ما بين: c++ , java , Python فهي اشهر ما يستعمل في بناء بوتات التداول.
  16. يمكنك الاستعانة بمفهوم المراقبة او المراقبين Observers لتحقيق هذا الغرض. وهي مثل عمليات مراقبة الاحداث التي تختص بنموذج ما. تحتوي أصناف Observer في لارافيل على توابع يمثل كل منها حدثا من أحداث Eloquent التي ترغب في الاستماع إليها. <?php namespace App\Observers; use App\Models\User; class UserObserver { /** * Handle the User "created" event. * * @param \App\Models\User $user * @return void */ public function created(User $user) { // } /** * Handle the User "updated" event. * * @param \App\Models\User $user * @return void */ public function updated(User $user) { // } /** * Handle the User "deleted" event. * * @param \App\Models\User $user * @return void */ public function deleted(User $user) { // } /** * Handle the User "restored" event. * * @param \App\Models\User $user * @return void */ public function restored(User $user) { // } /** * Handle the User "forceDeleted" event. * * @param \App\Models\User $user * @return void */ public function forceDeleted(User $user) { // } } لاحظ ان كل تابع يستقبل النموذج المستهدف. سيمكنك معاملته وفق اي منطق وتطبيق اي ما تريد عليه قبل حفظه الى قاعدة البيانات بشكل تام. نستعمل الأمر: php artisan make:observer UserObserver --model=User لإنشاء مراقب جديد. ونقوم بتسجيله في توابع boot لأحد موفرات الخدمة، يقترح ان يكون موفر خدمة التطبيق AppServiceProvider: public function boot() { User::observe(UserObserver::class); }
  17. بالاضافة الى المقترح، يمكنك اعادة تعيين قاعدة جديدة في معيار psr-4 في ملف composer.json: "autoload": { "psr-4": { "App\\": "app/", "MyFolder\\": "yourFolder/" }, قد تحتاج أيضا الى تنفيذ الامر: composer dump-autoload الآن قم بتنفيذ الأمر: php artisan make:model ../MyFolder/User لتوليد هذا النموذج. سيتم انشاء ملف النمودج الجديد مباشرة في هذا المجلد. راجع:
  18. يمكنك معاملة الناتج كتجميعة واستعمال التابع sortBy لذات الغرض، يجب حقن Closure إلى التابع sortBy كـ: $products = UserProducts::with('products')->get() ->sortBy(function($userProduct) { return $userProduct->products->type; } )
  19. تعد ساعتان وقتا كاف جدا لتعلم أساسيات البرمجة والانطلاق في هذا المجال، ولا يجب عليك ابدا الاحساس بالاحباط بهذا الشأن. بجانب انك لن تحتاج اصلا التركيز على الوقت في البداية، بل ركز على تحصيلك قدرا معينا من المادة العلمية بشكل دوري، على سبيل المثال: يجب علي تعلم شيئ جديد كل يوم. يجب علي ممارسة ما تعلمته بالفعل. يجب علي مراجعة ما احس اني نسيته. ولا يهم ان كنت قد اكملت ذلك في خمس دقائق او ساعة او ساعتين. فالمهم ان تركز على التحصيل، لا على الوقت الذي تحدث فيه هاته العملية. وان كنت تدرك القليل من الفرق بين ما كنت عليه وبين ما اصبحته فهو كاف جدا للإستمرار. ارى انك مشترك بدورة تطوير واجهات المستخدم، سيمكنك العمل بهذا على طول الدورة. أما الارهاق والتعب والاحباط فهي مشاعر جد طبيعية يتسبب فيها حجم المجال وطبيعته، ويختبرها كامل من له علاقة بالمجال في العالم. يجب ان تعتاد عليها هي الأخرى. راجع الاجابة عن سؤال مشابه: كم وقت ممكن لاصبح مطور ويب Fullstack؟ اظن ان طبيعة الأعمال بدوام كامل لمدة طويلة تقتضي ان يكون هنالك بعض الفراغات المتقطعة، هاته الفراغات يمكن استغلالها في خدمة هاته الأغراض. وليكن مثلا تحصيل ومشاهدة مادة علمية جديدة او حتى الاستماع لها او حتى ممارستها عمليا ولو على الهاتف او الجهاز المحمول. ستجد لاحقا اثناء جزء التطبيق العملي انك قد قطعت شوطا مهما في فهم ما تقوم به. ستحتاج الالتزام قليلا لتحقيق هذا الغرض اول الامر ثم ستعتاد عليه. ولتجنب الملل والخروج من جو المجال ككل، اختبر دوما افكارا جديدة واحط نفسك (ولو على مواقع التواصل الاجتماعي) بأشخاص واشياء من المجال نفسه.
  20. يمكنك تجاوز التابع createApplication لتحديد مسار ملف بيئة جديد غير الافتراضي. يعيد هذا التابع كائنا عن الصنف Illuminate\Foundation\Application. يبدوا هذا التابع كـ: /** * Creates the application. * * @return \Illuminate\Foundation\Application */ public function createApplication() { $app = require __DIR__.'/../bootstrap/app.php'; $app->make(Kernel::class)->bootstrap(); return $app; } في السمة CreatesApplication الموجودة داخل Tests يوجد التابع loadEnvironmentFrom، يمكنك استعماله لتحديد مسار جديد: /** * Creates the application. * * @return \Illuminate\Foundation\Application */ public function createApplication() { $app = require __DIR__.'/../bootstrap/app.php'; $app->loadEnvironmentFrom('.env.testing'); $app->make(Kernel::class)->bootstrap(); return $app; } يتم استعمال هاته السمة من قبل الصنف المجرد TestCase الكائن بـ tests. وترث كامل اختبارات الوحدة والميزة هذا الصنف، ويتم تشغيل هذا التابع من السمة عند كل مرة يتم فيها عمل booting للإختبارات. لاحظ أن اي اعداد آخر معرف في ملف phpunit.xml سيتم تجاهل قيمته المسندة له في ملف البيئة الجديد. اي ان الأولوية تكون دوما لملف phpunit.xml فهو المفترض ان يحدد طريقة عمل التطبيق او الاختبارات في بيئة اختبارية.
  21. يمكنك مباشرة حقن اسم ملف الترجمة كمعامل للتابع get: Lang::get('file_name'); او ايضا باستعمال الدالة المساعدة __ : __('file_name') لاحظ أنه لا يجب الحاق الاسم بامتداد الملف. اي انه لا يجب عليك اضافة php. لتوصيف الملف. يمكنك ايضا استعمال الوظيفة file_get_contents بشكل تقليدي كـ: file_get_contents(base_path('resources/lang/en/validation.php')) التوطين في Laravel
  22. لا حاجة لإنشاء ملفين منفصلين تماما. يمكنك استعمال موجهات القالب blade directives للتحقق من ما ان كان المستخدم مسجلا اما لا لعرض قسم معين من الصفحة. يوجد الموجه auth@ للتحقق من ما ان كان المستخدم موثقا: @auth // اي محتوى يعرض للمستخدمين الموثقين فقط @endauth يوجد ايضا الموجه guest@ للتحقق من ما ان كان المستخدم غير موثق: @guest // اي محتوى يعرض للمستخدمين الزوار فقط @endguest قوالب Blade في Laravel
  23. كطريقة تقليدية، يمكنك حقن عدد المستخدمين الاجمالي الى متغير وارساله الى ملف العرض كـ: // code from controller $users = User::paginate(10); $users_count = User::count(); return view('users.index', compact('users' ,'users_count')); ثم طباعته كـ: {{ $users_count }} كطريقة اكثر اختصارا يمكنك الاستعانة بمتغيرات التصفيح pagination variables وتوابعه لخدمة هذا الغرض. يوجد التابع total الذي يعطي العدد الاجمالي للعناصر: {{ $users->total() }} اعرف أكثر عن ترقيم الصفحات Pagination في Laravel
  24. لا يوجد مشكلة بالشيفرة التي لديك، يحتمل ان يكون هنالك مشكلة باستهداف حدث السحب. بجانب ان اغلب الهواتف لا تستمع لحدث السحب والافلات drag and drop . بدل هذا يوجد لديها الاحداث touch المتفرع عنها: touchstart بدل dragstart touchend بدل dragend touchmove بدل dragover touchleave بدل dragleave touchcancel بدل drop جرب اختبار تشغيل الاحداث drag على حاسب اولا. ثم هاته الاحداث touch في الهاتف لديك. تأكد فقط من اثارة حدث السحب على نحو صحيح. ففي حالة النص مثلا، تأكد من تحديد كامل النص ثم اسحبه. فهم الأحداث في جافاسكربت
×
×
  • أضف...