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

Adnane Kadri

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

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

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

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

    52

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

  1. يمكنك ايضا الاستفادة من استخدام مفهوم الـ lazy loading لتحميل الصور وعرضها بالصفحة. والفكرة الاساسية فيه هو ان الصور يتم عرضها وتحميلها من موردها الاصلي بعد عرضها في الواجهة فقط وليس مع تحميل الصفحة. وهو ما سيقوم بتسريع اداء الموقع بشكل مبالغ فيه. قم بضغط وتقليل ملفات الجافاسكربت والcss التي تستخدمها داخل الموقع، استعمل تطبيقات ال minifier للتخلص من الفراغات والتعليقات وغيرها من الاشياء التي تقوم بتكبير حجم الملف. التزم بقواعد الشيفرات النظيفة ولا تكرر ما تقوم به، حاول اختصار شيفراتك وأعد صيانتها. لا تستعمل المكتبات إلا في حالة الحاجة لها حقا، لما قد تستعمل مثلا مكتبة بـ 100 ميزة وتستعمل منها واحدة فقط؟ تذكر انها على الجافاسكربت و الـ css وقم ببناء واحدة لك تخدم غرضك بالضبط.
  2. React Router او موجه رياكت هو في الاصل مكتبة تستعمل في التوجيه Routing من جانبي العميل والخادم. يمكن استعمالها على تطبيقات React سواء في الهاتف عن طريق ReactNative او الخادم بوساطة NodeJS او على الويب باستخدام React. بمعنى انها مثل الملحقة التي تقوم بخدمة هذا الغرض. فمثلما يمكن استعمال React لبناء عدد من المكونات التي تستعملها في صفحة الويب خاصتك يمكنك الاعتماد عليها بالكامل في انشاء تطبيقات ويب متعددة الصفحات يمكن استعمال ملحقة التوجيه بينها للتحصل على تصفح لطيف بينها يلخص عمل تطبيقات الصفحة الواحدة. يمكن تثبيته عن طريق تثبيت ملحقاته باستخدام مدير الحزم npm : npm install react-router-dom في المكون الجذر للتطبيق، قم باستيراد وحدة BrowserRouter وضع داخلها مكون التطبيق: import ReactDOM from "react-dom/client"; import { BrowserRouter } from "react-router-dom"; import App from "./App"; const root = ReactDOM.createRoot( document.getElementById("root") ); root.render( <BrowserRouter> <App /> </BrowserRouter> ); ثم بأي مكون ما يمكنك استعمال اي رابط للتنقل الى صفحة اخرى كـ: import { Link } from "react-router-dom"; export default function App() { return ( <div> <h1>اسم التطبيق</h1> <nav> <Link to="/contact-us">اتصل بنا</Link> </nav> </div> ); } يقتضي هذا ان يكون هنالك مكون باسم contact-us على ذات مستوى App.js
  3. هل تبحث عن طريقة لتخزين مصفوفة في قواعد البيانات؟
  4. نعم يمكنك بناء تطبيقات ويب وتطبيقات جوال في ذات الوقت عن طريق flutter او xamarin. فهاته التقنيات قادرة على انشاء تطبيقات cross-platform قادرة على الاشتغال في كلتا البيئتين. ولكنه لا ينصح بهما دوما في اغلب حلول الويب. فقد يفيان بالغرض في بناء لوحات تحكم او تطبيقات صفحة واحدة SPA's او تطبيقات الويب التقديمة PWA ولكنهما يفشلان في تقديم حلول لتطبيقات الويب التي تعتمد بشكل كبير على تحسين محركات البحث والتصفح SEO مثل المدونات والمواقع الشخصية والمنتديات وغيرها. فـ flutter مثلا يعتمد على ال hashes في التوجيه routing داخل الموقع وهو ما ليس جيدا بالنسبة لمحركات البحث. وهذا راجع الى كون flutter web يعتمد على الجافاسكربت في تصيير المكونات على المتصفح بعد طلب الصفحة. وهو الامر الآخر السيء بالنسبة لموضوع ال SEO. الويب ما يزال يعتمد على ال HTML الدلالي بشكل كبير وهو شيء لا تعوضه طريقة React او VueJS او Angular او Flutter في تصيير المكونات بصفحات الويب. بالنسبة لأطر عمل الواجهة الأمامية فقد تجاوز اغلبها هذا الموضوع بسبب ظهور موضوع التصيير على الخادم SSR والتصيير المسبق Pre-rendering ولكن هذا الامر لم يشمل flutter بعد. يأمل الكثيرون من مطوروه ان يتم تطويره ليستوعب هذا المفهوم ايضا. (يمكنك الاستفادة من متابعة نقاش حول هذا الموضوع على github).
  5. كطريقة تقليدية جدا يمكنك اعادة اعداد البريد كل مرة تريد فيها تبديل تلك التي تعدها في المشروع. استعمل التابع الثابت set عن الواجهة Config لتعيين قيمة جديدة لمفتاح معين: /** * ارسال رسالة بريد الكتروني باستخدام خدمة معينة * @return void */ public function sendMail() { // شيفرة ارسال الرسالة } /** * ارسال رسالة بريد الكتروني باستخدام خدمة غير الاولى * @return void */ public function sendMailUsingOtherService() { $this->switchMailer(); // شيفرة ارسال الرسالة } /** * اعادة اعداد خدمة البريد * @return void */ private function switchMailer() { Config::set('mail.encryption','ssl'); // طريقة تشفير جديدة Config::set('mail.host','smtps.example.com'); // مستضيف خدمة جديد Config::set('mail.port','465'); // منفذ جديد Config::set('mail.username','youraddress@example.com'); // اسم مستخدم جديد Config::set('mail.password','password'); // كلمة مرور جديدة Config::set('mail.from', ['address' => 'JhonDoe@gmail.com' , 'name' => 'JhonDoe']); Artisan::call('cache:clear'); // قد تكون هاته الخطوة ضرورية ايضا لاعادة التقاط التحديثات } اما كحل يلائم النسخ التي هي اكبر من النسخة 7.x فيوجد التابع mailer الذي يمكن من خلاله تحديد خدمة البريد التي تستهدفها بارسالك رسالة معينة: Mail::mailer('my_mailer') ->to($user()) ->send(new MyMailableClass()); راجع ايضا التعامل مع البريد الإلكتروني (Mail) في Laravel
  6. بالطبع يمكن. فآداء لارافيل مع قاعدة بيانات NoSQL شيء خرافي حقا. يتم الاستعمال عادة مع اعدادها بوساطة بيئات تطوير مثل Homestead. يوجد خيار mongodb يقبل قيمة بوليانية في ملف اعداد homestead مثلا. اما استعمالها بشكل منفصل فيكون بوساطة حزم composer توفر هاته الوظيفية (أظنها افضل). توجد مثلا حزمة jenssegers/mongodb. حيث تضيف هذه الحزمة وظائف إلى نموذج Eloquent ومنشئ لاستعلامات لـ MongoDB باستخدام واجهة التطبيق البرمجية للارافيل. وتستعمل نفس الوظائف بالضبط تماما. أي انك بعد عملية الضبط واعداد الاتصال الا التعامل مع Laravel Eloquent بشكل كلي. تثبت عن طريق تنفيذ الامر: composer require jenssegers/mongodb ويتم اعداد الاتصال في مصفوفة connections في ملف الاعداد database.php كـ: 'connections' => [ 'mongodb' => [ 'driver' => 'mongodb', 'host' => env('DB_HOST', '127.0.0.1'), 'port' => env('DB_PORT', 27017), 'database' => env('DB_DATABASE', 'homestead'), 'username' => env('DB_USERNAME', 'homestead'), 'password' => env('DB_PASSWORD', 'secret'), 'options' => [ 'database' => env('DB_AUTHENTICATION_DATABASE', 'admin'), // required with Mongo 3+ ], ], في الاستعمال، يجب وراثة صنف النموذج الاساسي للحزمة: use Jenssegers\Mongodb\Eloquent\Model; class Book extends Model { // } ثم يمكنك البدء باستعمالها بشكل عادي تماما.
  7. بجانب المشار اليه من قبل المدرب وائل يمكنك التحقق من انه تم ارسال رسالة بريد الكتروني في بيئة اختبارية عن طريق التوكيد assertSent use Illuminate\Support\Facades\Mail; .. /** @test*/ public function a_mail_is_sent() { Mail::fake(); $this->post('/path/to/target' ,$someData); Mail::assertSent(YourMailable::class); } او عددا معينا من المرات: Mail::assertSent(YourMailable::class, 2); او تفاصيل الرسالة: Mail::assertSent(YourMailable::class, function ($mail) use ($user) { return $mail->hasTo($user->email) && // مرسل الى $mail->hasFrom('...') && // مرسل من طرف $mail->hasSubject('...'); // موضوع المراسلة });
  8. ان كنت تقوم بتعريف قيمة لمتغير البيئة MAIL_MAILER في ملف env. فإنه سيتم اعتبارها مباشرة، وستترك القيمة log كقيمة افتراضية في حالة عدم اعداد هذا المتغير فقط. جرب ايضا تجاوز تعريف القيمة بملف متغيرات البيئة: MAIL_MAILER=log اجعلها log بدل smtp. لا تنسى ايضا محو التخزين المؤقت لملفات الاعداد لالتقاط الاعداد الجديد: php artisan config:clear
  9. لمعرفة القالب المستعمل في وردبرس نقوم اما باللجوء للتطبيقات والاضافات الكاشفة من مثل wpthemedetector أو satoristudio أو حتى اضافات قوقل كروم من مثل wordpress-theme-detector. تستقبل هاته التطبيقات رابط الموقع وتقوم بتحليل الشيفرات لتجد القالب المستعمل. يمكن ايضا معرفة ذلك يدويا، عن طريق الوصول الى الكود المصدري للصفحة والبحث عن ما يلي wp-content/themes/ فهو اسم القالب مباشرة. فعلى سبيل المثال، كل من المرفق سابقا يشير الى استخدام القالب الذي اسمه Publisher مقدم من BetterStudio.
  10. بجانب الاشارة الى المفتاح يجب الاشارة ايضا الى اسم الملف الحاوي للاعداد. فان كان الملف هو app.php نشير الى المتغير كـ: app.author ويكون استدعاءه كـ: {{ Config::get('app.author') }} او مباشرة باستعمال الدالة المساعدة config: config('app.author') الضبط في Laravel
  11. يحدث هذا لأن التابع update تابع غير ثابت، على عكس insert او create مثلا. يجب الاشارة الى انموذج من الصنف Feature لتعديل بياناته فأنت تستهدف عنصرا معينا. فبدل: Feature::update($request->id, Request::all()); للبحث عن "ميزة" معينة وتعديل بياناتها. نستعين بـ find للبحث والاستعلام و update للتحديث والتجاوز: Feature::find($request->id)->update(Request::all()); مقدمة إلى رابط الكائنات بالعلاقات Eloquent
  12. أنواع mime التي تقوم بوصفها هي ليست الا طريقة لتوصيف انواع الملفات، وقد يحتوي النوع الواحد على العديد من الصيغ او امتدادات الملفات. جرب اضافة qt: $validated = $request->validate([ 'file' => 'mimes:mp4,mov,ogg,qt | max:20480' // ... ]); فكل من qt و mov يشيران للنوع: video/quicktime ذكر كليهما سيضمن التعامل مع هذا النوع.
  13. ليس بالضرورة، يمكن انشاء جدول واحد فقط يحوي كامل هاته الطلبات باعتبارها مخاطبة. حيث يحمل عمودين مميزين: من sent_by الى sent_to يوضحان طرفي الخطاب. اما ان كان كل من الادارة والمنطقة والقطاع نماذج في قواعد البيانات فيمكنك انشاء العديد من الاعمدة الاجنبية foreign keys التي تقبل القيمة null في هذا الجدول حيث تكون هاته الاعمدة كـ: مرسل من الادارة sent_by_administration مرسل الى المنطقة sent_to_region و: مرسل من المنطقة sent_by_region مرسل الى القطاع sent_to_sector و: مرسل من القطاع sent_by_sector بهذا الشكل يمكنك انشاء العديد من الثنائيات التي تميز خطابا ما على نحو: مرسل من الادارة الى المنطقة مرسل من الادارة الى القطاع مرسل من القطاع الى الادارة مرسل من القطاع الى المنطقة مرسل من المنطقة الى القطاع مرسل من المنطقة الى الادارة ستكون القراءة سهلة من هذا الجدول، فلما نحاول مثلا جلب الطلبات التي ارسلتها الادارة الى القطاع نبحث فقط عن: الطلبات التي قيمة sent_by_administration وقيمة sent_to_sector فيها ليستا Null. ثم لما نحاول انشاء طلب جديد. نقوم فقط بتحديد الثنائيتين بحسب من يرسل الخطاب والى من.
  14. لا مشكلة في ذلك ايضا، كل طلب هو [انموذج بيانات] يحتوي خصائص معينة. وبما انه كذلك يمكن نمدجته كجدول يحتوي اعمدة في قواعد البيانات، هاته الاعمدة هي هاته الخصائص. فان كان الطلب يجب ان يحتوي تاريخا انشئ به نضيف العمود created_at. ان كان الطلب يجب ان يحتوي مرسلا ومستقبلا نضيف به العمود sent_by و sent_to . ان كان الطلب يندرج ضمن عدة انواع فان الطلب يمتلك نوعا. نضيف العمود type الى الجدول. هل تواجهين مشكلة بهاته النمذجة؟
  15. ما المشكلة في اعتبار هاته الطلبات نموذج بيانات مثلها مثل اي نموذج آخر؟ حيث ان مدير المدرسة هو من يقوم بإنشاء هاته الطلبات. يمكنك التوصل الى انشاء جدول orders يحوي تفاصيل هذا الطلب (منشئ من طرف، موجه الى المدير الفلاني ، نوع الطلب فيما ان كان طلب عجز، زيادة او شكوى او غيرها). يمكنك ايضا اضافة حقل seen او reviewed يخزن قيمة بوليانية تعبر عن ما ان كان الاطلاع عليه من قبل مدير الادارة. حيث: مدير المدرسة يمكنه انشاء طلبات، يمكنه الوصول الى هاته الطلبات في صفحة ما. مدير الادارة يمكنه الوصول الى الطلبات الموجهة له في صفحة مخصصة. ولنقل ايضا انه يمكنه تغيير حالتها كمقروءة مثلا، او حتى الرد عليها. واسطة كل من هؤلاء العملاء هي قاعدة البيانات، يمكنك الاعتماد على مركزيتها في انشاء اي نموذج بيانات ترغبيه.
  16. ما تتحدث عنه تسميه لارافيل التسلسل الى مصفوفات Serializing To Arrays والتسلسل Serialization في Eloquent هو عملية تحليل نموذج او تجميعة الى مصفوفة او كائن JSON. فعند بناء واجهات تطبيق برمجية نحتاج في الغالب تحويل النماذج الى مصفوفات او كائنات JSON ليسهل تصديرها واستيرادها والتعامل معها. يوجد التابع toArray لتحويل ناتج النموذج الى مصفوفة: $user = App\Models\User::first(); dd($user->toArray()); السلسلة في رابط الكائنات بالعلاقات Eloquent
  17. يوجد التابع exists عن الدالة المساعدة view، يمكنك الاستعانة به للتحقق من ما ان كان هنالك ملف عرض باسم معين. تستعمل كـ: view()->exists('path.to.myview') او عن طريق الواجهة View كـ: View::exists('path.to.myview') اقرأ أكثر عن الواجهات (Views) في Laravel
  18. أظن ان المشكلة في تضمين ملفات التنسيق الاساسية بالموقع، فالصفحات من مثل : https://abadc.com.sa/ar/courses/ و https://abadc.com.sa/ar/faq/ تقوم بتحميل ملفات التنسيقات بوساطة حزمة lightspeed بشكل عادي. في حين انه في الصفحة الرئيسية للموقع يتم استعمال ميزة Unique Css من هاته الحزمة لتحميلها. لاحظ ان روابط ملف التنسيقات فيه يبدوا كـ: https://abadc.com.sa/wp-content/litespeed/ucss/85cf37505c2be29695253ccf7665a43f.css?ver=cd0f4 في حين ان الاولى تبدوا كـ: https://abadc.com.sa/wp-content/litespeed/css/7f16c4ab4bbd2fc675a5d0002db20502.css?ver=cd0f4 يحتمل ان يكون هنالك مشكلة في اعداد حزمة Lightspeed للعمل مع تطبيقك. جرب الغاء ميزة Unique Css من صفحة الاعداد، يوجد خيار Generate Unique Css. الغ تفعيله. أظنه ما يسبب المشكلة. LiteSpeed Cache > Page Optimization > CSS Settings جربت تضمين ملف تنسيقات عادي من مجلد CSS مباشرة ونجح الامر.
  19. لا أظن ذلك، فعنوان الماك MAC أو عنوان التحكم في الوصول إلى الوسائط Media Access Control هو معرف فريد يتم تعيينه لاستخدامه كعنوان شبكة في الاتصالات بما في ذلك Ethernet و Wi-Fi و Bluetooth. بعض شركات التصنيع قد تدمج رمزا معينا يميزها ضمن عناوين MAC الخاصة بالجهاز الذي تصنعه. اي ان المعلومات التي يمكن جلبها منه محدودة جدا. اظن ان ما تبحث عنه هو تحليل عنوان IP. يمكنك عن طريق عنوان الـ IP معرفة نوع الجهاز، المتصفح والموقع وغيرها من المعلومات.
  20. نعم، لن يكون ذلك مشكلة ايضا. يمكنك التعامل مع مسألة جلب بيانات معلمي مدرسة معينة بشكل مستقل تماما.
  21. معروف ان عملية التشفير هي طريقة لحماية البيانات تستعمل خوارزمياتها مفتاحا للتشفير والغاءه. بالمختصر المفيد، كل مكون من مكونات لارافيل يستخدم التشفير encyption او يتضمنه يستخدم APP_KEY بشكل ما. مثال: ملفات تعريف الارتباط الجلسات كلمات المرور رموز csrf وطريقته في حماية البيانات بهذا الشكل هي في كونه وسيطا خفيا يظهر للتطبيق نفسه فقط. ففي حالة امتلاك طرف آخر لمفتاح التشفير سيمكنه صياغة قيم ملفات تعريف الارتباط والجلسات ورموز csrf واحداث مشاكل كبيرة بتطبيقك. كونه بهاته السرية يسد ثغرة أمنية كبيرة. ستجد انه مشار اليه اصلا كاعداد ضبط للتعامل مع التشفير في لارافيل. راجع: التشفير (Encryption) في Laravel. يمكن الاطلاع على انه يتم تحميله من قبل موفر خدمة التشفير في التطبيق، هذا الملف كائن بالمسار: Illuminate/Encryption/EncryptionServiceProvider.php
  22. وجدت الحزمة TheDragonCode/laravel-app مكافئة لما كان يقوم به الامر app:name. يمكن تثبيتها عن طريق: composer require dragon-code/laravel-app --dev ثم اعادة تنفيذ الامر: php artisan app:name <name> يمكن ايضا كفكرة، تعديل قيمة متغير البيئة APP_NAME عن طريق الوصول الى محتويات الملف واعادة كتابتها.
  23. اضافة لما اشار اليه المدرب حسن، قد لا تواجه مشكلة بتنفيذ 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 لتنفيذ هاته الاوامر.
  24. يمكن انشاء دور مدير مدرسة. حيث ان هذا الدور يمتلك صلاحية رؤية معلمي مدرسته فقط. ما المانع في ذلك؟ وقد لا يكون هنالك حاجة اساسا من موضوع الصلاحيات، لما لا تقومين فقط بتنفيذ استعلام يقوم بجلب بيانات المعلمين الخاصين بمدرسة المدير؟ $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 - موسوعة حسوب
  25. ابسط تعامل مع الأخطاء يكون عن طريق طباعتها في نافذة الطرفية console عن طريق console.log مثلما هو موضح في المثال السابق. ان كان هنالك مشكلة في تصديرها واستيرادها يمكن تعريفها ضمن ذات الملف app.js: function handleError(err) { console.log(err) } او مباشرة بدل handleError نفسها: if(err) { console.log(err) } سيكون هذا كفيلا بحل المشكلة وتشخيص الخطأ تشخيصا كاملا يظهر نص رسالته في نافذة console للخادم.
×
×
  • أضف...