-
المساهمات
5196 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
52
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو Adnane Kadri
-
بداية تأكد أنك تقوم بتضمين الواجهة File في الملف قبل إستعماله . <?php namespace App\Http\Controllers; use Illuminate\Support\Facades\File; // أو use File; كما يمكنك تشغيل وضع الـ Debug و ضبطه كـ ON حتى يتم تشخيص الأخطاء و تسجيلها بشكل أفضل . في ملف متغيرات البيئة env. قم بإعطاء القيمة true عوضا عن false للمتغير APP_DEBUG : APP_DEBUG=true قد تحتاج كخطوة إضافية لمحو الملفات المؤقتة : php artisan cache:clear الان قم بالتصفح إلى مسار الملف و سيظهر لك الخطأ بشكل أفضل و أكثر تفصيلا . إن لم يقم تضمين الواجهة بحل مشكلتك يمكنك إرفاق صورة بالخطأ الذي يظهر معك و سيتم تشخيص المشكلة بشكل أوسع .
-
طبعا سيتطلب هذا إنشاء خوارزمية بحث تقوم بفلترة نتائج البحث و إظهار الأقرب كتابة كنتائج تظهر . مثال عملي : // قم بجلب أسماء كل المدن و تخزينها في مصفوفة const cities = [ 'Abudabi', 'Algiers', 'Oran', 'New York', 'Los Angelos', 'Las Vigas' ]; // سيكون عليك الوصول إلى نص الحقل و استخراجه لإستعماله ككلمة مفتاحية const keyWord = 'b'; // فلترة النتائج بحسب عملية البحث const filteredCities = cities.filter( /* فلترة عناصر المصفوفة بحسب الحرف الأول يشترط الترتيب */ city => city.trim() // إزالة الفراغات .toLowerCase() .startsWith(keyWord.trim().toLowerCase()) /* لفلترة النتائح بحسب أي حرف ضمن الكلمة لا يشترط الترتيب city => city.trim() .toLowerCase() .includes(keyWord.trim().toLowerCase()) */ ); console.log(filteredCities);
- 3 اجابة
-
- 1
-
في الحقيقة فإن الشخص قد قام بالطريقتين معا ، فتويتر لا تعطيك أي بيانات عبر واجهة تطبيقها البرمجية إلا بعد تسجيلك عندهم كمطور . و أخيرا يمكنك كتابة الكود وفق المنطق الموصوف في التعليق السابق .
-
طبعا سيكون عليك إرسال طلب GET إلى نقطة الوصول هاته : GET https://api.twitter.com/1.1/followers/ids.json?screen_name=TwitterScreenUserName ستقوم بإستقبال مصفوفة JSON بمجموعة معرفات المستخدمين المتابعين لهذا المستخدم . سيكون عليك عد عناصر مجموعة المعرفات و عرضها . يمكنك أيضا تمرير هاته البارمترات عبر الطلب : user_id : معرّف المستخدم المراد إرجاع النتائج له. screen_name : اسم الشاشة للمستخدم المراد إرجاع النتائج له. cursor : يمكنك تخصيص تقسيم قائمة الاتصالات إلى صفحات لا تزيد عن 5000 معرف في المرة الواحدة. لا يمكن ضمان أن يكون عدد المعرفات التي تم إرجاعها 5000 معرف حيث يتم تصفية المستخدمين المعلقين بعد الاستعلام عن الاتصالات. إذا لم يتم توفير مؤشر ، فسيتم افتراض القيمة -1 ، وهي "الصفحة" الأولى. count : يحدد عدد المعرفات التي تحاول استرجاعها بحد أقصى 5000 لكل طلب مميز. طبعا ,مثل ما شرح المدرب @Sam Ahw, كل هذا يحتاج منك حساب مطور في تويتر حتى تقوم بإرسال بيانات التوثيق مع كل طلب .
-
كل الأمور تعمل بشكل طبيعي و صحيح غير أن العملية غير منطقية و غير حسنة من ناحية تجربة المستخدم بعض الشيء . فالعملية ليست عملية بحث و إنما فلترة بحسب المدينة لذلك لا يجدر بك استخدام حقول الإدخال من النوع نص . خطوات عملية : عوضا عن البحث عن اسم المدينة و إظهار مربع بحث عن اسم المدينة قم بعمل قائمة منسدلة بخيارات المدن المتوفرة , فالمدن محدودة من جهة . و عملية البحث ليست عليها و إنما هو فلترة بحسب المدينة . بعد ذلك يمكنك ربط التغير بقيم القائمة المنسدلة بحادثة تحميل حيوانات جديدة تخص تلك المدينة دون غيرها عوضا عن تحميلها كلها أو تحميل تلك الخاصة بـ AbuDhabi مثلما تقوم بفعله . طبعا تحتاج إخفاء كل مربعات الحيوانات القديمة كل مرة تقوم بعملية بحث و فلترة . طبعا هذا هو منطق العملية موصوفة فقط و تحتاج تحويل العملية إلى كود عملي يمكنك من عمل الفكرة بشكل محترف .
-
طبعا فإن لارافل توفر الكثير من دريفرات التخزين المؤقت و كل منها جيد و ممتاز في أداء مهمته في بيئة ما أو حسب شروط ما. فمثلا : لحل المشاكل و الـ Debuging ستكون الـ array أفضل خيار لك . لتوفير تخزين بشكل دائم سيكون الـ file أفضل خيار . لتجربة التطبيق و الـ Testing لن يكون هناك أفضل من قاعدة البيانات (MySql , SQLite) . لكن إذا كان لديك خادم مخصص و تريد إختيار درايفر تخزين مؤقت لتطبيق اللارافل لديك على بيئة الإنتاج ، عليك بالتأكيد اختيار memcached أو redis . فكل منها يمتلك نظام تخزين مؤقت مجاني ومفتوح المصدر و عالي الأداء و لن يكون عليك القلق بشأن ضغط الملفات على الخادم أو إنهيار الخادم . يمكنك القراءة عن الكثير من المقارنات بينهما من حيث نمط و حجم البيانات , الثبات , الأداء , توثيق النظام و غيرها من العوامل . لكن يبقى كل منهما يحقق الغرض بأداء و جودة عاليتين و لو وجد تفاوت بينهما فسيكون تفاوتا طفيفا لن يؤثر عليك. عن نفسي أفضل استخدام redis نظرًا لقدرته على الاحتفاظ بحجم كبير من البيانات ، لكن يبقى إستعمال أي من أحدهما حلاً جيدًا جدا . أما عن فكرة تخزين الملفات المؤقتة في ذاكرة المستخدم أو حاسب المتصفح فالمتصفحات تكفيك تخزين بعض ملفات الواجهة الأمامية و لا أظن أنه توجد طريقة أصلا لإعتمادها كدريفر تخزين.
- 1 جواب
-
- 1
-
نعم يمكنك ذلك عن طريق أي أمر تهجير عادي مرفقا بمسار الملف . يمكنك بتخصيص مسار الملف عن طريق استعمال الخاصية path . سيكون الأمر على هذا النحو : php artisan migrate --path=/database/migrations/migration_file_name.php
-
هل يمكنك إرفاق ملف الإتصال بقاعدة البيانات حتى نستطيع مساعدتك بشكل أفضل ؟
-
كل المقترح مجاني , يمكنك طبعا اشتراء لوحة تحكم بمواصفات تريدها من codecanyon . لا يوجد الأفضل و إنما الأنسب لحاجتك و مشروعك . فقد تختصر عليك لوحة SB admin الوقت و تنزع عنك حرية التطوير و التعديل بشكل واسع غير محدود و هكذا . أما عن نفسي فأحب إستعمال backpack for laravel فهي مرنة جدا و سهلة للتطوير و التعديل , و الأكثر اختصارا للوقت في كثير من الحالات . لكن أفضل عليها الحرية الكاملة في التطوير و التعديل عن طريق بناء لوحتك الخاصة .
- 3 اجابة
-
- 1
-
لا أظن أنه يوجد لوحة مدمجة و مدعومة من مطوري إطار العمل ضمن كل مشروع جديد , لكن هذا لا يمنع من تثبيت حزمة لوحة تحكم كاملة عن طريق مدير الحزم composer أو عن طريق تنزيلها و ضمها للمشروع أو ربما استعمال باني لذلك . أمثلة : لوحة تحكم من مجموعة spatie . ORCHID . SB Admin . laraadmin . يمكنك أيضا استعمال voyager لذلك , أو ربما بناء وتخصيص لوحة تحكم كاملة عن طريق backpack .
- 3 اجابة
-
- 2
-
لا يوجد أي تضارب بين النسخ الموصوفة . قد يحدث مشكل في حالة خطأ في تثبيت الحزم , في إضافتها للبوتستراب أو في ترتيب ملفات السكربتات ( الـ cdn ) مثل ما أشارت المدربة@Nuhla Almasri . وكونك قد استعملت webpack لتثبيت الحزم يجدر بك التأكد من أنك قد قمت بإضافة jQuery و Popper كـ peerDependencies بملف package.json . كما يمكنك ذلك عن طريق الأمر : npm install --save jquery popper.js بعد ذلك يمكنك تنزيل الـ bootstrap الذي يعتمد عليهما بشكل طبيعي عن طريق مدير الحزم npm . أما ان كنت قد قمت بتنزيل الحزمتين بشكل منفصل فيجب عليك طبعا إضافة هاته الأدوات إلى مصفوفة الـ plugins على هذا النحو : plugins: [ // ... new webpack.ProvidePlugin({ $: 'jquery', jQuery: 'jquery', 'window.jQuery': 'jquery', Popper: ['popper.js', 'default'] }) // ... ] بحيث أن هذا سيقوم بتضمين الدوال و التوابع المصدرة عن ملفات Popper و jQuery و تعريفها بشكل عام , و بالتالي فسيتم إستعمالها من طرف البوتستراب بشكل عادي . كما يمكنك أيضا , وهو المقترح عمله طبقا للتوثيق الرسمي لبوتستراب , الإستعانة بهاته الحزمة في استيراد المكونات الإضافية بشكل فردي و منفصل . إن استمرت مشكلتك بالظهور يمكنك إرفاق ملفات المشروع حتى نقوم بمساعدتك بشكل أفضل .
-
يحدث هذا لأنك تكتب الأمر بشكل خاطئ فالأمر .phar غير معرف ضمن composer . يمكنك تحديد اسم الحزمة و تثبيتها مباشرة : composer require intervention/image ستحتاج بعض الخطوات الإضافية لتثبت الحزمة بشكل صحيح و تام . 1 . تحتاج إلى إضافة موفر الخدمة ServiceProvider إلى مصفوفة الـ providers على هذا النحو : <?php 'providers' => [ Intervention\Image\ImageServiceProvider::class ], 2. تحتاج إضافة إختصار للواجهة Image على هذا النحو : <?php 'aliases' => [ 'Image' => Intervention\Image\Facades\Image::class ], 3. و لإستكمال تثبيت الحزمة ستحتاج نشر ملف الإعداد وفق الأمر التالي : php artisan vendor:publish --provider="Intervention\Image\ImageServiceProviderLaravelRecent" ثم يمكنك إستعمال الحزمة بشكل عادي .
-
عموما الكود نظيف , قد ينقصك تقسيم بعض المكونات الكبيرة إلى أخرى أصغر و تضمينها في كل دورة من الدور حتى تتجنب بعض المشاكل التي قد وقعت فيها , من مثل هاته : لاحظ أنك تقوم ببداية دور ثم تقوم بإنهاءه قبل إغلاق الوسوم داخل الدور : <?php while ($row = $result1->fetch_assoc()) { # بداية الدور ?> <!-- Starting form --> <div class="main-card mb-3 card"> <div class="card-body"> <h3 class="card-title"></h3> <div class="form-row"> <!-- خانة اسم القماش --> <!-- نهاية خانة اسم القماش --> <?php } # نهاية الدور ?> <div class="col"> </div> <div class="col"> </div> <div class="col-12"> </div> <div class="col-12"> </div> </div> </div> </div> سيبب لك هذا مشاكل عرض أو تداخلات في حالة عدم إرجاع الإستعلام لأي نتائج من قاعدة البيانات . عوضا عن هذا يمكنك عممل ذلك على هذا النحو : <?php while ($row = $result1->fetch_assoc()) { # بداية الدور ?> <!-- Starting form --> <div class="main-card mb-3 card"> <div class="card-body"> <h3 class="card-title"></h3> <div class="form-row"> <!-- خانة اسم القماش --> <!-- نهاية خانة اسم القماش --> <div class="col"> </div> <div class="col"> </div> <div class="col-12"> </div> <div class="col-12"> </div> </div> </div> </div> <?php } # نهاية الدور ?> ثم سيسهل التحكم في المكون بالصف main-card و تكراره كذا مرة . كما أنه يمكن كتابة هاته الأسطر : <select class="form-control s-des" required> <?php while ($row = $result2->fetch_assoc()) { echo '<option selected disabled value="' . $row['commName'] . '">' . $row['commName'] . '</option>'; } while ($row = $result3->fetch_assoc()) { echo '<option value="' . $row['id'] . '">' . $row['name'] . '</option>'; } ?> </select> على نحو أفضل : <select class="form-control s-des" required> <?php while ($row = $result2->fetch_assoc()) { ?> <option selected disabled value="<?php echo $row['commName']; ?>"> <?php echo $row['commName']; ?> </option> <?php } ?> <?php while ($row = $result3->fetch_assoc()) { ?> <option value="<?php echo $row['id'] ?>"> <?php echo $row['name']; ?> </option> <?php }; ?> ?> </select> (يمكنك إنشاء دالة عامة بسيطة تحمل اسما مختصرا (ليكن __ مثلا ) تقوم بطباعة البارمتر الممرر عبرها عوض كتابة echo كل مرة ) . لاحظ أيضا أن لديك وسم مفتوح في الأسطر الأخيرة : <div class="main-card mb-3 card"> <div class="card-body"> </div> <!-- زر الحفظ --> <div class="main-card mb-3 card"> </div> <!-- هنا --> و هنا أيضا : <div class="app-container app-theme-white body-tabs-shadow fixed-sidebar fixed-header"> <div class="app-main"> <div class="app-main__outer"> <div class="app-main__inner"> <div class="app-page-title"> </div> <!-- هنا --> <!-- هنا --> <!-- هنا --> <!-- هنا --> و قد لحظت نفس هذا الخطأ في أسئلتك السابقة أيضا , تأكد أن تقوم بإصلاحه في باقي الصفحات . كما أنه يمكنك التخلص من وسم الإغلاق هذا ﻷنه غير واضح و قد لا تتذكر لماذا وضعته بعد مدة : <?php // Modal color piker include("includes/commonfabric/color_piker_modal.html"); include("includes/footer.php"); require("js/commonfabric-js.php"); ?> </div> <?php include("includes/js.php"); بالتوفيق .
- 3 اجابة
-
- 1
-
ليكن في العلم أنه بعد ضم الجدولين عن طريق JOIN فأنت تقوم بضم كل سطر من الجدول 1 إلى السطر المرافق من الجدول 2 , بحيث أنه سيتم تحديد الترافق هذا عن طريق تساوي المفاتيح من الجدولين . الان و بعد عمل الضم على هذا النحو : SELECT common_cloth_composition.id AS CID, common_cloth_composition.ready AS readyId, commercial_description.id AS commID, commercial_description.name AS commName FROM common_cloth_composition INNER JOIN commercial_description ON common_cloth_composition.ready = commercial_description.id لاحظ أن هذا الإستعلام سيقوم بجلب كل الأسطر من الجدولين التي تتساوى فيها المفاتيح , يمكنك الان تصفية النتائج و إضافة شرط التساوي عن طريق WHERE : SELECT common_cloth_composition.id AS CID, common_cloth_composition.ready AS readyId, commercial_description.id AS commID, commercial_description.name AS commName FROM common_cloth_composition INNER JOIN commercial_description ON common_cloth_composition.ready = commercial_description.id WHERE common_cloth_composition.ready='127'
- 3 اجابة
-
- 1
-
لاحظ أنك تقوم بوصف فضاء الإسم namespace على نحو خاطئ : Route::apiResource('books', 'API\LibraryController'); و بطبيعة الحال فسيؤدي هذا إلى عدم التعرف على الصف . فالمفروض أن يكون كالتالي : <?php Route::apiResource('books', 'App\Http\Controllers\API\LibraryController'); كما يمكنك إستعمال هذا السياق : <?php use App\Http\Controllers\API\LibraryController; Route::apiResource('books', LibraryController::class);
- 2 اجابة
-
- 1
-
يحدث هذا لأن faker غير معرف أساسا كمتغير و من المفروض إستخدامه كنسخة من الكائن Faker . و للعلم فإنه قد تم تعريفه كخاصية في النسخ الأخيرة من لارافل و قد تم ضمه إلى الكائن Factory الذي ترث منه , فما عليك إلا إستعمال هاته الخاصية مباشرة عن طريق الكلمة المفتاحية $this على هذا النحو : $this->faker->numberBetween(1,50); كا أنه لا داعي من هذا السطر : \App\Models\Book::factory()->define; فأنت تقوم بالفعل بإرفاق المودل المرافق عن طريق الخاصية المحمية model . فيكون الكود كاملا : <?php namespace Database\Factories; use App\Models\Book; use Illuminate\Database\Eloquent\Factory; class BookFactory extends Factory { protected $model = Book::class; public function definition(){ return [ 'book_id' => $this->faker->numberBetween(1,50), 'title' => $this->faker->word ]; } }
-
يمكنك عمل ذلك عن طريق الخاصية overflow-x , تمكنك هاته الخاصية من التحكم في العناصر المتجاوزة على المحور الأفقي , فلإخفاءها على سبيل المثال يمكنك إعطاءها القيمة hidden لعنصر البودي على هذا النحو : body{ overflow-x: hidden; } سيقوم هذا بإخفاء كل الأجزاء من العناصر المتجاوزة على المحور الأفقي , شاملة تلك التي يزيد عرضها عن عرض الشاشة وهو السبب الأرجح في ظهور السكرول من بدايته.
- 4 اجابة
-
- 1
-
هل يمكنك توضيح سؤالك أكثر عن طريق إرفاق صورة عن الوضعية الموصوفة ؟
-
هل يمكن رؤية ملف web.php لديك ؟ يبدوا أن المشكلة في تمرير أو ربما تسمية المتغيرات فقط
-
كل الملفات سليمة . المشكلة في إستدعاء التابع factory في هذا السطر : Post::factory() ليكن في العلم أن هاته الدالة يتم توفيرها من قبل السمة HasFactory . تأكد فقط أن تضيفها إلى مودل المنشور Post على هذا النحو : <?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; class Post extends Model { use HasFactory; // some code }
-
يبدوا أن لديك خطأ في تسمية و إستدعاء أحد الـ Factories لاحظ أنه لا يوجد أي factory باسم PostFactory في حين أنه يوجد باسم PostfactoryFatory . للتخلص من المشكلة يرجى إصلاح التسمية و الإستدعاء من داخل الـ seeder على نحو صحيح . قم بإعادة تسمية الملف PostfactoryFatory إلى PostFactory و طبعا لا تنسى تغيير اسم الكلاس بالملف : <?php namespace Database\Factories; use Illuminate\Database\Eloquent\Factories\Factory; class PostFactory extends Factory { ... }
-
تحميل صور بروفايل مخصصة في مكتبة jetstream في لارافل يحتاج منك تمكين هاته الميزة في ملف الإعداد config / jetstream.php الخاص بتطبيقك. لتمكين الميزة ، قم ببساطة بإلغاء تعليق الميزة profilePhotos من مصفوفة الميزات على هذا النحو : <?php use Laravel\Jetstream\Features; 'features' => [ Features::profilePhotos(), Features::api(), Features::teams(), ], بعد ذلك تحتاج إنشاء الرابط الرمزي للتخزين من جديد : php artisan storage:link و لا تنس محو التخزين المؤقت و إعادة تخزين ملف الإعداد : php artisan cache:clear php artisan config:cache
-
يمكنك تخزين التوكن في التخزين المحلي بإستعمال التابع setItem ضمن localStorage لإستعماله في عمليات المصادقة , على هذا النحو : window.localStorage.setItem(key, value); كما يمكنك قراءته متى احتجت على هذا النحو : window.localStorage.getItem(key); مثال عن ذلك : const [Data, setData] = useState([]); const loginStudent = () => { axios .post('https://carna-test-app234/api/v2/login', { type: 3, method_type: 'email', email: 'student@app321.com', password: '123456', }) .then(res => { console.log(res.data); setData(res.data); // تخزين التوكن if(!! res.data.access_token) { window.localStorage.setItem('token', res.data.access_token); } }) .catch(err => console.log(err)); };