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

Adnane Kadri

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

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

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

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

    52

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

  1. لو أحببت أن تترك الأمر لجانب الباك اند فقط فيمكنك تطبيق العملية وفق المنطق التالي : جلب كل العناصر الغير مميزة . جلب العناصر المميزة . تكرار العناصر المميزة كذا مرة . دمج العناصر المميزة مع غير المميزة وفق ترتيب معين . مثال عملي : يمكنك جلب كل العناصر التي لا تحتوي على 1 في حقل المنتج المميز على هذا النحو : $sql = "SELECT * FROM Prodect WHERE is_special = 0 ORDER BY RAND()"; ثم جلب العناصر المميزة و تكرارها : <?php // تحضير الاستعلام $sql2 = "SELECT * FROM Prodect WHERE is_special=1 ORDER BY RAND()"; function getRepeated($query) { $repeat_times = 10; $counter = 0; $rows = []; $result = mysql_query($query); // تحضير كل الحقول while($row == mysql_fetch_row($result)) { $rows[] = $row; } // تحضير مصفوفة تحمل عناصر مميزة ومكررة $repeated = []; for($index = 0; $counter < $repeat_times; $counter++) { $repeated[] = $rows[$i]; $index++; // إعادة الدور إلى الصفر لملئ المصفوفة بعناصر مكررة if($index == count($rows)) { $index = 0; } } return $repeated; } $special = getRepeated($sql2); المزج وفق الترتيب و التكرار : <?php $non_special = [...]; // ناتج الاستعلام الاول $special = [...]; // ناتج الاستعلام الثاني مكرر $total = []; $offset = 0; for($i = 0; $i < count($non_special); $i++) { if(is_float($i / 10)) { array_push($total ,$non_special); } else { // قطعة من مصفوفة المنتجات المميزة لدمجها $pieceOfSpecial = array_slice($special,$offset,5); $offset += 5; array_merge($total ,$pieceOfSpecial); } } // =======> return $total الان ستسهل عملية عرضها مباشرة تحديث : يمكن أن لا تكون هناك أي حاجة من تكرار العناصر المميزة كذا مرة لدمجها مع الغير مميزة و يمكن تحقيق نفس الغرض في حالة جلب عدد معين من العناصر المميزة . فتكون عوض الخطوة كاملة و عوضا عن اقتطاع المصفوفة كل مرة في المرحلة الأخيرة يمكنك فقط دمج المصفوفة كلها (قد يكون هذا البديل مفيد في حالة وجود عدد محدود جدا من العناصر المميزة بقاعدة البيانات) .
  2. تحديث : يمكنك أيضا إضافة الevents المتعلقة بالخيارات المنشئة بعد إضافتها . مثال : function setListeners(){ document.querySelectorAll('select#products option').addEventListener('click' ,function(){ // }); } ومن ثم إنشاء الأحداث بعد إنشاء العناصر : function getProducts(target) { let getProducts = new XMLHttpRequest(); getProducts.open('GET', '/invoices/getProducts/' + target); getProducts.onload = function() { if (this.readyState === 4 && this.status === 200) { // succes let products = JSON.parse(this.responseText); products.forEach(function(item) { let option = document.createElement('option'), text = document.createTextNode(item['product_name']); option.appendChild(text); option.value = item['id']; productsSelect.appendChild(option); }); setListeners(); // إستدعاء الدالة } else { alert('لقد حدث خطأ غير متوقع'); } } getProducts.send(); }
  3. يبدوا أن المشكلة في تحديد العناصر فقط : و بالفعل فإن العنصر select بالمعرف products غير موجود من ضمن الDOM . عوضا عن ذلك يوجد بالمعرف product فتكون : var productsSelect = document.getElementById('product'); ثم تحتاج إستدعاء الدالة getProducts من المكان الصحيح , أي بعد أي تغير في قائمة الأقسام على هذا النحو : <select name="section" onchange="getProducts(this.value)" class="form-control @error('section') is-invalid @enderror" id="section"> <option value="NULL" disabled>إختر القسم</option> أو أيضا : document.getElementById('section').addEventListener('change' ,getProducts(this.value)); فيكون كود الجافاسكربت كاملا على هذا النحو : var productsSelect = document.getElementById('product'); document.getElementById('section').addEventListener('change' ,getProducts(this.value)); function getProducts(target) { let getProducts = new XMLHttpRequest(); getProducts.open('GET', '/invoices/getProducts/' + target); getProducts.onload = function() { if (this.readyState === 4 && this.status === 200) { // succes let products = JSON.parse(this.responseText); products.forEach(function(item) { let option = document.createElement('option'), text = document.createTextNode(item['product_name']); option.appendChild(text); option.value = item['id']; productsSelect.appendChild(option); }); } else { alert('لقد حدث خطأ غير متوقع'); } } getProducts.send(); }
  4. بشكل عام . فكرة الكوبونات , قسائم الشراء و البرومو كودس هي أشياء يتم تقديمها للعملاء كحافز للشراء , وقد تكون خصم نسب مئوية معينة ,خصم مبلغ معين ثابت أو حتى الشحن و التوصيل المجاني و ربما أفكار أخرى . أما إن كنت تقصد الكوبونات كمفهوم برمجي فيمكن معاملتها كغيرها من المفاهيم و من ثم إستعمالها في عمليات حساب سعر المنتج و الدفع . مثال عملي عن الإستعمال : قم بإنشاء جدول كوبونات بقاعدة البيانات يحوي الأعمدة : coupon_code // معبرا عن كود الكوبون coupon_type // معبرا عن نوع الكوبون coupon_amount // معبرا عن مقدار الخصم بحيث ينحصر نوع الكوبون في الأنواع الثلاثة الممثلة بأرقام 1,2,3,على التوالي , بـ : 1 => fixed_card_amount // مبلغ خصم ثابت 2 => percentage_off // خصم نسبة مئوية 3 => free_shipping // شحن مجاني 2. في نموذج إدخال كود الكوبون بصفحة الدفع قم بالتحقق من وجود كوبون يحمل نفس الكود المدرج أو لا . 3. إن كان نعم يمكنك تحديد نوع و مقدار الكوبون . 4. و من ثم عمل العملية الحسابية لحساب السعر الجديد و إظهاره للمستخدم . (طبعا يجب أخذ الحيطة و إدراج إحتمال التلاعب بالسعر و التصرف وفق ذلك , مثال :تخزين السعر في الباك اند بعد إدخال كود كوبون أكثر أمانا ) . طبعا هذا هو الشكل الأبسط للعملية , و هي وصفية بحتة يمكنك تطبيقها باللغة التي تبرمج وفقها . كما يمكنك إضافة الكثير من المميزات مثل : كوبون للمسجلين حديثا فقط , كوبون بتاريخ إنتهاء صلاحية , كوبون بعدد منتهي للإستعمال .. إلخ .
  5. الوظيفة openssl_cipher_iv_length هي جزء من مكتبة openSSL PHP المضمنة في اعتمادات الphp بالفعل . في حالات قد يكون هذا الإمتداد مثبتا بالفعل , فيمكنك مباشرة تفعيله عن طريق تعديل ملف الإعداد php.ini مثل ما قام الأخ @يوسف احمد9بالإشارة . إن لم تحل المشكلة يستحسن تحديث إعتمادات اللارافل الخاصة بالمشروع , يمكنك ذلك عن طريق الأمرين : composer install composer update و في أحيان أخرى لن يكون الإمتداد مثبتا و هذا قد يدفعك إلى تحميل ملف الـ dll الخاص بالإضافة ( ssleay32.dll ) و من ثم إضافته إلى مجلد الphp . ملاحظات : قد تحتاج إعادة تشغيل السرفر في هذا الأمر أو الأمر الأول .
  6. يمكنك إرسال طلب إلى نقطة الوصول هاته للتحويل من عملة معينة إلى أخرى : https://data.fixer.io/api/convert ? access_key = API_KEY & from = GBP & to = JPY & amount = 25 كما يمكنك جلب معدلات التحويل بالنسبة لعملة رئيسية عن طريق هاته النقطة : https://data.fixer.io/api/2013-12-24 ? access_key = API_KEY & base = USD & symbols = JPY,CAD,EUR,DZD لاحظ أنه قم تم تخصيص تاريخ معين يتم فيه جلب معدل التحويل الخاص بذاك التاريخ . يمكنك جعل العملية ديناميكية عن طريق : const date = new Date().toISOString().slice(0, 10); ثم تمرير الثابت date . لاحظ أيضا أنه يمكنك تخصيص العديد من العملات في مرة واحدة و هذا شيء جميل . مثال عن رد من التوثيق الرسمي للواجهة : { "success": true, "historical": true, "date": "2013-12-24", "timestamp": 1387929599, "base": "GBP", "rates": { "USD": 1.636492, "EUR": 1.196476, "CAD": 1.739516 } }
  7. أسعار العملات بالنسبة لعملة رئيسية و معدلات التحويل الخاصة بها متغيرة في الغالب و تحتاج ديناميكية لوضع الأسعار . تستطيع إما تخزين السعر بالدولار كـ base currency و من ثم جعل عملية التحويل ديناميكية عن طريق معدل تحويل . لا أظن أنه توجد حزمة جاهزة لتقوم بالعملية . لكن يمكنك إستعمال أحد هاته الـ APIS : هذا أو هذا لجلب معدلات التحويل من الدولار أو من أي base currency تستعملها . كما يمكنك مباشرة إرسال طلبات GET إلى نقطة الوصول هاته فقط و قراءة الخاصية geoplugin_currencyConverter لجلب معدل التحويل الذي يخص بالمستخدم نفسه (الذي تم إرسال الطلب عن طريقه) من الدولار من الرد مباشرة أيضا (مثلا لإظهار العملة بحسب بلد المستخدم حسب تحليل الـ IP) . أيا كانت طريقتك في جلب معدل التحويل يمكن حساب السعر الجديد بسهولة عن طريق : var new_price = base_price * exchange_rate_base_to_target /*من الرسبونس*/; و كإقتراح لتحسين تجربة المستخدم و جعل عملية تثبيت العملة المحول إليها سهلة , قم بتخزين العملة و معدل التحويل في الجلسة أو الكوكي أو التخزين المحلي بدل إرسال طلب مع كل مرة . ملاحظات : يمكنك أيضا الإستغناء عن هاته العملية ككل و إدخال أسعار لمختلف العملات في حالة كان عدد العملات محدود جدا و تريد تحكم أكبر في الأسعار بحسب البلد أو العملة (خذ إحتمال أسعار السوق السوداء مثلا , فهي لا ترسل في الردود من أي API و قد تحتاجها لوضع تسعيرة معقولة في حال كان هنالك تباعد كبير بين سعر الصرف و سعر السوق السوداء) . و بنفس منطق واجهات التطبيق البرمجية المشار إليها يمكنك تخصيص نقطة وصول لجلب معدلات التحويل بتطبيقك نفسه و ليكن من جدول تنشأه : معدلات التحويل exchange_rates , و من ثم التحكم في هاته المعدلات على نطاق أوسع و التعديل بما يلائم سعر الصرف الحالي أو السعر الذي يناسب فرع المتجر بالعملة الفلانية .
  8. يمكنك رفع الملفات من المشروع إلى المستودع المحلي عن طريق اﻷمرين : أولا : // إضافة كل الملفات المعدلة git add -A // إضافة ملفات محددة git add changedDirectory // أو git add changedFile ثم : git commit -m "A changes title" و أخيرا رفع الملفات إلى الـبرانش الخاص بك على الـ remote repo عن طريق : git push -u origin yourBranch ستلاحظين اخر commit قمت بعمله على المستودع الخاص بك على هذا النحو :
  9. لك الخيار في أن تقوم مباشرة بإستعمال المكتبة التي تقدمها و ربطها مع الـ Laravel كمكتبة خارجية أو بإستعمال أحد الحزم التي تبسط العملية . ولعل هاته الحزمة الأفضل على الإطلاق.
  10. لا حاجة لتشفير الـ ID لحل المشكلة فعليا , عوضا عن ذلك يمكنك إنشاء دالة أو middleware يقوم بالتحقق من ملكية العنصر item قبل عمل أي تعديلات عليه . مثال عملي : <?php class YourController extends Controller { public function editItem(Request $request ,Item $item){ if(! $this->isOwner($item)){ return 'لا يمكنك تعديل العنصر'; } // تكملة العملية } private function isOwner($item){ if(auth()->user()->id == $item->user_id){ return true; } return false; }
  11. في العادة إرسال رسائل sms قد تحتاج تكلفة و إشتراك لتطبيق العملية و الإستعانة بها. و يمكنك تطبيق العملية كلها وحدك مثل ما أشار الأخ @بلال زيادة. وقد تحتاج الإستعانة بأحد هاته الواجهات Twilio أو Plivo . مثال عن إرسال رسالة بإستعمال Twilio : <?php use Twilio\Rest\Client; # إرسال رسالة ... $client = new Client($account_sid, $auth_token); # تعطى مع حساب تويليو $client->messages->create($receiverNumber, [ 'from' => $twilio_number, # يعطى مع حساب تويليو 'body' => $activation_code ]); # قم تخزين الكود ... $currentUser->update([ 'activation_code' => $activation_code , ]); ثم براوت اخر يمكنك عمل المصادقة بشكل مشابه : <?php ... if($user_input == $activation_code){ $current_user->update([ 'phone_is_activated' => true, ]); return 'أنت مفعل'; } return 'كود التفعيل خاطئ'; و بالطبع فإن هذا هو الشكل الأبسط للعملية , يمكنك إضافة العديد من الأشياء كإنتهاء صلاحية الكود أو ربط كود التفعيل بمودل اخر غير مودل المستخدم و غيرها . كما يمكنك إستعمال حزم جاهزة مثل هاته الحزمة بحيث توفر عليك الكثير من الأشياء من مثل الError Reporting و كل الBack end Logic بحيث تقوم بإرسال بيانات إلى نقاط وصول معينة و القراءة من الرد . و مثل ما تقدم هذا في نفس الوقت هي تزيل عنك حرية التصرف و التطوير بما يلائم مشروعك .
  12. يبدوا أن المشكلة فقط في تعريفك للـ Routes فلو كانت المشكلة في إظهار الview فسيتم رمي exception عن طريق ViewException من داخل المتحكم . فهذا يعني أن الطلب لا يصل أصلا إلى المتحكم و المشكلة فقط هي في سطر واحد . Route::get('user/profile', [UserConroller::class, 'edit']); وبالفعل فأنت تستخدم تعريفا من النسخة 8 من لارافل في حين أنك تستخدم لارافل 5 و تقوم بإستعمال سياق غير مدعم بعد (PHP callable syntax) على هذا النحو : <?php use App\Http\Controllers\UserController; .. Route::get('user/profile', [UserController::class, 'edit']); // غير مدعوم بعد في حين أنه في النسخ ما قبل 8.x يجب عليك تعريف الراوت على هذا النحو (string syntax) : <?php Route::get('user/profile', 'UserController@edit'); و ستحل المشكلة بهذا . ملاحظات : مثل ما شرح الزملاء فإنه يوجد لديك بعض الأخطاء يجب إصلاحها و ذلك في UserConroller تصبح UserController و في oute تصبح Route و هذا : <?php public function edit() { # $user = User::find(auth()->user()->id); عوضا عن هذا $user = auth()->user(); # هذا /* * ولا داعي لتمرير المتغير يوزر أصلا * بحيث يمكنك استعمال هذا المساعد * auth() * بداخل ملفات الblade */ return view('auth.profile',compact('user')); } بعد ذلك , وكخطوات إضافية , تأكد أن تقوم بمحو الكاش عن طريق : php artisan route:clear ثم تأكد أن الراوت موجود عن طريق : php artisan route:list و أخير يمكنك التصفح إلى http://127.0.0.1:8000/user/profile كعضو مسجل و استعراض الصفحة .
  13. هل يمكنك إرفاق ملفات المشروع أو على الأقل معلومات أكثر عن المشكلة ؟
  14. إن كنت تعتمد على تخزين محلي فقط يمكنك تخزين الملفات إما في الـ public_path أو الـ storage_path . في الحالة الأولى ستكون جميع الملفات و الصور المخزنة ظاهرة للعامة و يمكن الوصول إليها ببساطة . تخزن الملفات في : public > your-folder و يكون التخزين على هذا النحو : <?php .. $request->file('image')->move(public_path('your-folder'), $name); في الحالة الثانية لن يمكن إستدعاء الصور و الملفات إلا عن طريق إنشاء رابط symlink و هاته الطريقة أكثر أمانا و حفظا للخصوصية في حالة ما كانت الملفات و الصور المخزنة حساسة أو خاصة . افتراضيا يتم تخزين هاته الصور و الملفات في : storage > app > public > your-folder و التخزين على هذا النحو : <?php .. $request->file('image')->move(storage_path('your-folder'), $name); علما أنه يمكنك إدارة و إنشاء ديسكات التخزين بملف config/filesystems.php : <?php ... 'disks' => [ ... 'storage-path' => [ 'driver' => 'local', 'root' => storage_path('app').'/uploads', ], 'public-path' => [ 'driver' => 'local', 'root' => public_path().'/uploads', 'url' => env('APP_URL').'/public_files', 'visibility' => 'public', ] ... ], ملاحظة : يمكنك إنشاء الsymlink عن طريق طباعة الأمر : php artisan storage:link
  15. بداية , لا يمكنك تخزين أي ملفات بقاعدة البيانات Sql , عوضا عن ذلك يمكنك إستخدام الfile systems لتخزين الصورة أو الملف و تخزين باث الصورة أو الملف في قاعدة البيانات . يتم إستقبال الطلب من قبل اللارافل و معالجته على هذا النحو : <?php public function uploadImg(Request $request) { // التحقق إن كان الطلب يحمل ملف باسم image if($request->hasFile('image')) { // انشاء اسم بلاحقة للملف $name = time()."_".$request->file('image')->getClientOriginalName(); // تخزين الملف بالpublic path $request->file('image')->move(public_path('images'), $name); } // return response()->json([ asset("images/$name"), // باث الصورة 201, // كود الحالة 'message' => asset("images/$name") ? 'تم حفظ الصورة' : 'failed' ]); }
  16. يمكنك الإستعانة بهاته الحزمة لتحقيق الغرض. بداية قم بتثبيت الحزمة عن طريق مدير الحزم : npm install react-ga --save 2. تضمين الموديلات اللازمة بملف App.js : import ReactGA from "react-ga"; 3. مصادقة غوغل انالتكس مع الحزمة , أيضا قم بتعريف ثابت بشكل globally (سنأتي لإستعماله في الخطوة التالية): ReactGA.initialize("TRACKING-ID"); const history= createHistory(window); 4. بداخل وسم LocationProvider بالراوتر قم بتعريف الخاصية history و قم بإرفاقها بالثابت الذي تم تعريفه على هذا النحو : <LocationProvider history={history}> <Router> .. </Router> </LocationProvider> الان يتم رصد أي تغيير يخص الكائن window . ينبغي الان فقط الإستماع لهاته التغيرات و التصرف بناءا عليها . مثال : history.listen( window => { ReactGA.pageview(window.location.pathname + window.location.search); }); و هذا جواب سؤالك :
  17. يمكنك ذلك عن طريق تقسيم النص إلى عناصر مصفوفة و من ثم عمل دور على كل عنصر من المصفوفة لتحويل الحرف الأول إلى capitialized . سيكون الكود مشابه لعمل التالي : let str = "today,-i'm-here-to-learn-java-script-with-the-hsoub-family"; function camelize(str) { var splitted = str.split('-'); var splitted_capitialzied = []; splitted.forEach(element => { var sub = element .charAt(0) .toUpperCase() + element.slice(1); splitted_capitialzied.push(sub); }); return splitted_capitialzied.join(""); } camelize(str);
  18. يبدوا أن المشكلة تنحصر فقط في مصادقة بياناتك مع حسابك على الGithub , قد تحدث مشكلة المصادقة بسبب تغيير أو انتهاء صلاحية البيانات . و ذلك غالبا بسبب كاش credentials أو تخزينها بشكل globally بملف .git/config . يمكنك حل المشكلة بمسحها و من ثم إدخالها مع كل أمر push جديد . يمكنك فعل ذلك عن طريق الأمرين : git config --global --unset credential.helper git config credential.helper store و الان بعد كل : git push origin -u main سيطلب منك إدخال بيانات المصادقة الخاصة بالحساب صاحب المستودع , أي اسم المستخدم و كلمة المرور . تأكدي من إدخال البيانات بشكل صحيح و سيتم حل المشكلة بشكل عادي. طريقة ثانية لحذف أو تعديل بيانات المصادقة المسببة للمشكلة : بقائمة البدأ قومي بالبحث عن Credential Manager ثم قومي بفتح Windows Credentials Manager . قومي بالضغط على Windows Credentials . بالقائمة بعنوان Generic credentials قومي بالضغط على تلك الخاصة بالGIT. قومي بإزالتها أو تعديلها بما بتطلب .
  19. قد تظهر المشكلة أحيانا في تارمنل الvs code كونه معتبر كthird party بالنسبة للgithub .تأكدي أن تقومي بالخطوة الأخيرة من 2 فال command line لا بتارمنل الvs code . git push -u origin main
  20. على كل يمكنك إعادة العملية من جديد و التأكد من سلامة كل خطوة . 1 - قومي بإنشاء مستودع جديد على الGITHUB . 2 - فتح الـ CMD على روت البروجكت و طباعة الأمور : git init ثم إضافة كل البروجكت: git add -A ثم : git commit -m "initial commit" ثم إنشاء Branch : git branch -M main ثم : git remote add origin https://github.com/github-username/repo-name.git ثم أخيرا : git push -u origin main .. في حالة ظهور أي خطأ في أي مرحلة من المراحل السابقة يجب الإشارة إليها و للخطأ . تحديث : قد تحتاجين عمل undo ﻷي git init سابق قبل إعادة العملية من جديد , يمكنك ذلك عن طريق طباعة الأمر : rm -rf .git
  21. يمكنك عمل ذلك عن طريق تمرير عدة نقاط وصول لملفات scss الخاصة بك عن طريق : module.exports = { entry: { 'about': ['./src/css/about.scss'], 'contact': ['./src/css/contact.scss'], 'index': ['./src/css/index.scss'] }, plugins: [ new MiniCssExtractPlugin( { filename: "./css/[name].css" } ), ] } الwebpack ستقوم بقراءة مفاتيح المدخلات و تقوم بإستبدالها بالوسم name داخل الfilename فتكون المخرجات على هذا النحو : dist css about.min.css contact.min.css index.min.css ثم بملفات الHTML يمكنك تضمين كل ملف css داخل dist/css حسب الحاجة أو حسب صفحة الHTML الحالية. ملاحظة : تأكد أن تقوم بتضمين الminifier على نحو صحيح : const MiniCssExtractPlugin = require('mini-css-extract-plugin'); و في حالة ظهور أي أخطاء على هاته الشاكلة : could not resolve module mini-css-extract-plugin تأكد أن تقوم بتثبيت الـ Plugin : npm install --save-dev mini-css-extract-plugin
  22. إضافة إلى ما تفضل الأخ @Wael Aljamalبشرحه . طبقا للتوثيق الرسمي فإن الخاصية query عبارة عن كائن يحتوي كل الخصائص لكل بارمتر ممرر في الروات . و في حالة تعطيل الquery-parser فإن الخاصية query ستقوم بإعادة كائن فارغ و بطبيعة الحال فإن أي قراءة لخاصية عن طريق query ستقوم بإعادة undefined , ويخص بالقول طلبيات الـ GET فقط أي أنه معطل في ما غير ذلك . فحل المشكلة هو إما بتغيير الطريقة إلى GET فيكون : <form id="login" action="userlogin" method="GET"> <div> <label for="email">Email: </label> <input type="text" id="email" name="email"></input> </div> <input type="submit" value="Submit"></input> </form> أو بالقراءة من الPOST . قد تحتاج تسطيب body parser في نسخ متقدمة من Express (+4.16) و من ثم استعماله على هذا النحو : قم بتسطيب الحزمة : npm install --save body-parser ثم استعمالها بشكل Globally : var bodyParser = require('body-parser') app.use( bodyParser.json() ); // لدعم تشفير الجيسون في البودي app.use(bodyParser.urlencoded({ // لدعم تشفير اليو ار ال في البودي extended: true })); أما ان كنت تستخدم نسخ أقل من 4.16 فتستطيع مباشرة : app.use(express.json()); // دعم تشفير الجيسون في البودي app.use(express.urlencoded()); // دعم تشفير اليو ار ال في البودي ومن ثم القراءة على هذا النحو : app.post('/your-end-point', function(req, res) { var email = req.body.email; });
  23. لأنك نفسك تقوم بتعطيل الـ Input بإضافة الخاصية disabled في حالة الإختبار منجز . عوضا عن ذلك يمكنك إستعمال الخاصية checked على هذا النحو : <form action="/projects/{{$project->id}}/tasks/{{$task->id}}" method="POST" class="w3-bar-item w3-left w3-large" style="display:inline;padding:0;margin:0;"> @method('PATCH') @csrf <input type="checkbox" name="done"class="w3-check cnsb-bor-green w3-border-left" {{$task->done ? 'checked':''}} onchange="this.form.submit()"> </form>
  24. الرجاء تحديد اللغة المراد كتابة البرنامج بها أخي الكريم
  25. بداية تأكد أن تقوم بتحديث الflutter plugin في الأندرويد ستوديو عن طريق : > File > Settings > Plugin > Updates و قد تتعطل الاقتراحات تلقائيا بمجرد تفعيلك لوضع حفظ الطاقة , فإن كان كذلك تأكد أن تقوم بإلغاء التفعيل عن طريق : > File > Power Save Mode إن لم تختف المشكلة قم بالتأكد أنك غير معطل لإقتراحات المحرر عن طريق : > File > Settings > Editor > General > Code Completion إن لم تختف المشكلة بعد هاته المراحل تأكد أن تقوم بمسح الملفات المؤقتة وإعادة التشغيل عن طريق : File Invalidate caches / Restart Invalidate and Restart
×
×
  • أضف...