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

بلال زيادة

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

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

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

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

    30

كل منشورات العضو بلال زيادة

  1. يمكنك من هنا الدخول إلى هذا القسم إذا كنت مشترك في دورة دورة تطوير تطبيقات الويب باستخدام لغة PHP .
  2. يتم تحديث الدورات خلال كل فترة لتبقى الدروس جديدة و إضافة دروس جديدة و لغات ايضا و هذه الإضافات لا تلغي أي لغة و لكن يتم وضع لغات و دروس للغات التي تكون مستخدمة بشكلٍ كبير في مجال البرمجة مثل بايثون و جافاسكريبت . يمكنك مراسلة الدعم الفني من هنا , وتختار اكاديمية حسوب و تقوم بفتح تذكرة دعم فني و سيقوم الدعم الفني بحل مشكلتك بأسرع وقت ممكن.
  3. بالإضافة إلى إجابة المدرب عبدالمجيد , ايضا يمكنك إزالة الأسطر من بين الكلمات في السطر التالي let mark = ' <div class= "card"> <div class= "child"> <h1> TITLE</h1> <P> HELLO FREINDS</P> </div> </div> '; وجعل الكلمات و الوسوم متلاصقة لأن جافاسكريبت حساسة لحالة الأحرف و الفراغات فيمكنك جعل الوسوم متلاصقة ببعضها في سطر واحد مثل الكود التالي let mark = '<div class= "card"><div class= "child"><h1> TITLE</h1><P> HELLO FREINDS</P></div></div>'; ثم تقوم بتجربة تنفيذ الكود مرة أخرى ستجد أن الكود يعمل بشكلٍ جيد.
  4. لا هذا خطأ يجب ان لا تحتوي خاصية src على قيمة فارغة , لم أفهم كيف تقوم بجلب الصورة و وسم src فارغ , هل ممكن توضح آليه عمل الكود كاملاً لأنه يبدو هناك نقص ما في الكود.
  5. كل شيء سليم ولكن لا توجد صورة في خاصية src في السطر التالي echo '<img style="max-height: 100px !important; margin: 0 auto;" class="Sleeve-image" src="" alt="#">'; حاول وضع صورة حتى تظهر و الخطأ الذي ظهر لك بسبب أنه لا توجد صورة , حاول رجاء وضع صورة و أخبرني بالنتيجة.
  6. يمكنك في كل درس تواجه به مشكلة معينة أو لم تفهم كود ما, يمكنك وضع سؤال و هناك الكثير من المدربين الذين سيعملون على إجابتك و توضيح ما لم تفهمه و يساعدونك على تجاوز أي مشكلة تواجهك , يمكنك وضع السؤال تحت كل درس تشاهده في قسم التعليقات حتى يظهر تحت الفيديو الذي تشاهده. ايضا يمكنك طلب شرح أي جزئية او كود و سنعمل على شرحه بإذن الله لك .
  7. يجب تنزيله يدوياً من خلال الذهاب إلى المسار التالي Android\Sdk\extras\intel\Hardware_Accelerated_Execution_Manager ومن ثم يوجد برنامج intelhaxm-android , ثم تقوم بتثبيته بالضغط على البرنامج و إكمال خطوات تثبيته ومن ثم تقوم بإعادة تشغيل الحاسوب الخاص بك .
  8. باقي الملفات الموجودة هي ملفات تكميلية للواجهة و لكن يمكنك الاعتماد على الاكواد الخاصة ب tabbar و widget الخاصة بعرض المنتجات.
  9. هناك طريقة وهي استخدام StreamController بحيث هي طريقة من طرق إدارة الحالة في فلاتر. و الأمر معقد جداً و يجب أن تكون على دراية جيدة بكيفية استخدام StreamController. لاحظ بأنه يجب أن تقوم بتعلم StreamController حتى تفهم الإجابة جيداً لأنه في الوهلة الأولى ستجد أن الأمر قد يكون فيه صعوبة يمكنك إنشاء ملف وليكن مسؤول عن التنصت على أي حدث جديد و يعكسه على الواجهة أي يقوم بتنفيذ هذا الحدث على الواجهة و الميزة في ذلك إنها تقوم بتنفيذ الحدث بدون اللجوء إلى بناء نفسها من الصفر و هذا الملف فليكن اسمه StreamProductsBloc.dart ويمكننا تعريف عدة متغيرات في هذا الملف بهذا الشكل List<ProductsModel>? products; final StreamController<List<ProductsModel>> _productsController = StreamController<List<ProductsModel>>.broadcast(); final StreamController<int> _categoryController = StreamController<int>.broadcast(); Stream<List<ProductsModel>> get productsStream => _productsController.stream; StreamSink<int> get fetchProducts => _categoryController.sink; Stream<int> get getProductsForCategoriescategory => _categoryController.stream; APIService? apiService; int categoryID = 0; List<ProductsModel>? products; بحيث أول شيء نقوم بتعريف الكلاس مودل الخاص بالمنتجات. final StreamController<List<ProductsModel>> _productsController = StreamController<List<ProductsModel>>.broadcast(); و من ثم نقوم بتعريف StreamController ليقوم بالتحكم في العملية , ويتم توفير واجهات مختلفة لإنشاء تدفقات أحداث متنوعة. final StreamController<int> _categoryController = StreamController<int>.broadcast(); وحدة تحكم حيث يمكن الاستماع إليه أكثر من مرة . Stream<List<ProductsModel>> get productsStream => _productsController.stream; ثم نقوم بالحصول على البث للمراقبة. StreamSink<int> get fetchProducts => _categoryController.sink; ثم نقوم بإدخال حدث إضافي عن طريق StreamSink. StreamProductsBloc() { //this.categoryID = categoryID; this.products = []; apiService = APIService(); _productsController.add(products!); _categoryController.add(this.categoryID); _categoryController.stream.listen(_fetchCategoriesFromApi); } Future<void> _fetchCategoriesFromApi(int category) async { this.products = await apiService!.getProductsForCategories(category); _productsController.add(this.products!); } @override void dispose(){ _productsController.close(); _categoryController.close(); } نقوم بإنشاء دالة جلب بيانات التصنيف عند تمرير id التصنيف و نقوم بإرجاع جميع المنتجات و من ثم نقوم بإضافة هذه البيانات إلى وحدة التحكم. Future<void> _fetchCategoriesFromApi(int category) async { this.products = await apiService!.getProductsForCategories(category); _productsController.add(this.products!); } ثم نقوم بإضافة المنتجات و id التصنيف إلى وحدة التحكم في دالة StreamProductsBloc ثم نقوم بمراقبة الحدث عن طريق استخدام listen StreamProductsBloc() { //this.categoryID = categoryID; this.products = []; apiService = APIService(); _productsController.add(products!); _categoryController.add(this.categoryID); _categoryController.stream.listen(_fetchCategoriesFromApi); } ثم نقوم بإنشاء ملف واجهة عرض البيانات وليكن مثلاً باسم products_screen.dart و نقوم أولاً بإنشاء نسخة جديدة من الملف الذي قمنا بإنشائه مسبقاً StreamProductsBloc streamProductsBloc = StreamProductsBloc(); ثم ننشأ عدة متغيرات و نعرف TabController لوضع التصنيفات في هذه TabController bool get wantKeepAlive => true; HelperApi helperApi = new HelperApi(); int currentIndex = 0; late TabController _tabController; ثم نقوم بصنع Widget خاصة بعرض التصنيفات في TabController Widget _categories(List<CategoryModel> categoryModel, BuildContext context) { _tabController = TabController( initialIndex: 0, length: categoryModel.length, vsync: this, ); return Scaffold( appBar: AppBar( title: Text(S.of(context).products), bottom: TabBar( indicatorColor: Color(0XFF117182), indicatorWeight: 5, controller: _tabController, tabs: _tabs(categoryModel), isScrollable: true, onTap: (int index) { streamProductsBloc.fetchProducts .add(this.productsCategories[index].id!); }, ), ), body: Container( child: StreamBuilder( stream: streamProductsBloc.productsStream, builder: (context, AsyncSnapshot<List<ProductsModel>>? snapshot) { switch (snapshot!.connectionState) { case ConnectionState.none: // ignore: todo // TODO: Handle this case. return Center( child: CircularProgressIndicator(), ); case ConnectionState.waiting: // ignore: todo // TODO: Handle this case. return ShimmerGrid(); case ConnectionState.done: case ConnectionState.active: // ignore: todo // TODO: Handle this case. if (snapshot.hasError) { return Center( child: ShimmerGrid(), ); } else { if (!snapshot.hasData) { return ShimmerGrid(); } else { return _drawProducts(snapshot.data!, context); } } } }, ), ), ); } لاحظ أننا نقوم بجلب منتجات كل تصنيف عند الضغط عليها عن طريق استخدام id هذا التصنيف streamProductsBloc.fetchProducts.add(this.productsCategories[index].id!); و من ثم نقوم بإضافة هذا الحدث إلى streamProductBloc . ثم نقوم برسم Widget الخاص بالمنتجات Widget _drawProducts(List<ProductsModel> products, BuildContext context) { final cart = Provider.of<Cart>(context, listen: false); var initModel = Provider.of<InitModel>(context, listen: false,); var auth = Provider.of<AuthProvider>(context, listen: false); return Consumer<WishListProvider>( builder: (BuildContext context, wishListData, child) { return Container( padding: EdgeInsets.only(top: 24), child: Column( children: [ Flexible( child: GridView.builder( gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 200, childAspectRatio: 1 / 2, crossAxisSpacing: 20, mainAxisSpacing: 20), itemCount: products.length, itemBuilder: (context, index) { return Card( clipBehavior: Clip.hardEdge, elevation: 0.9, child: AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 375), child: SlideAnimation( verticalOffset: 50.0, child: FadeInAnimation( child: Padding( padding: const EdgeInsets.all(8.0), child: InkWell( onTap: () { _gotoSingleProduct(products[index], context); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Expanded( // ignore: unnecessary_null_comparison child: Stack( children: [ (products[index].images![0].src != null) ? Image.network( products[index].images![0].src!, width: MediaQuery .of(context) .size .width, height: MediaQuery .of(context) .size .height, fit: BoxFit.cover, ) : Image.asset( "assets/images/1.jpeg", width: MediaQuery .of(context) .size .width, height: MediaQuery .of(context) .size .height, fit: BoxFit.fill, ), Positioned.directional( textDirection: Directionality.of( context), child: Container( margin: EdgeInsets.symmetric( horizontal: 12.0, vertical: 10.0), decoration: BoxDecoration( color: Colors.grey[200], borderRadius: BorderRadius.circular(50.0)), child: IconButton( icon: Icon( Icons.favorite_outline), onPressed: () { //wishListData.getCount(products[index].id!, auth.id!); wishListData.addNewWishList( price: products[index] .price! .toString(), product: products[index] .name!, image: products[index] .images![0] .src!, productId: products[index] .id, userId: auth.id); ScaffoldMessenger.of(context) .showSnackBar( SnackBar( content: Text( S .of(context) .add_product_to_wishlist, ), duration: Duration( seconds: 2), ), ); }, iconSize: 20.0, ), ), ) ], ) ), Padding( padding: const EdgeInsets.all(8.0), child: Text( products[index].name!.substring(0, 10), style: TextStyle( color: Colors.black, fontWeight: FontWeight.bold, fontSize: 18.0, ), ), ), Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Padding( padding: const EdgeInsets.all(8.0), child: Text(initModel.currency! + products[index].price!, style: TextStyle( color: Colors.black, fontSize: 15.0, ), ), ), IconButton( icon: Icon( Icons.add_shopping_cart_outlined), onPressed: () { //if(auth.status == Status.Authenticated){ cart.addItem( products[index].id.toString(), 10.0, products[index].name!.toString(), products[index].images![0].src!, 1, products[index].id.toString()); ScaffoldMessenger.of(context) .hideCurrentSnackBar(); ScaffoldMessenger.of(context) .showSnackBar( SnackBar( content: Text( S .of(context) .product_added_to_the_cart, ), duration: Duration(seconds: 2), action: SnackBarAction( label: S .of(context) .undo, onPressed: () { cart.reomveSingleItem( products[index] .id .toString()); }, ), ), ); }, ), ], ), Text(products[index].stockStatus!, style: TextStyle( color: Colors.orange, fontWeight: FontWeight.bold, fontSize: 15, ),), Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ RatingBar.builder( initialRating: products[index] .ratingCount! .toDouble(), minRating: 1, direction: Axis.horizontal, allowHalfRating: true, itemSize: 15.0, itemCount: 5, itemPadding: EdgeInsets.symmetric(horizontal: 4.0), itemBuilder: (context, _) => Icon( Icons.star, color: Colors.amber, ), onRatingUpdate: (rating) { print(rating); }, ), Text(products[index] .ratingCount! .toDouble() .toString()), ], ), ], ), ), ), ), ), ), ); }, ), ), ], ), ); }); } List<Tab> _tabs(List<CategoryModel> categoryModel) { List<Tab> tabs = []; for (CategoryModel category in categoryModel) { tabs.add(Tab( text: category.name, )); } return tabs; } وهذه كامل الملفات , ملف stream_products.dart import 'dart:async'; import '../../common/api_service.dart'; import '../../pages/contracts/contracts.dart'; import '../../models/Product.dart'; class StreamProductsBloc implements Disposable { List<ProductsModel>? products; final StreamController<List<ProductsModel>> _productsController = StreamController<List<ProductsModel>>.broadcast(); final StreamController<int> _categoryController = StreamController<int>.broadcast(); Stream<List<ProductsModel>> get productsStream => _productsController.stream; StreamSink<int> get fetchProducts => _categoryController.sink; Stream<int> get getProductsForCategoriescategory => _categoryController.stream; APIService? apiService; int categoryID = 0; StreamProductsBloc() { //this.categoryID = categoryID; this.products = []; apiService = APIService(); _productsController.add(products!); _categoryController.add(this.categoryID); _categoryController.stream.listen(_fetchCategoriesFromApi); } Future<void> _fetchCategoriesFromApi(int category) async { this.products = await apiService!.getProductsForCategories(category); _productsController.add(this.products!); } @override void dispose(){ _productsController.close(); _categoryController.close(); } } و ملف الواجهة ملف products_screen.dart import 'package:bistore/providers/auth.dart'; import 'package:bistore/services/wishlist_provider.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_rating_bar/flutter_rating_bar.dart'; import 'package:flutter_staggered_animations/flutter_staggered_animations.dart'; import 'package:provider/provider.dart'; import '../../models/init_model.dart'; import '../../widgets/shimmer/shimmer_grid.dart'; import '../../generated/l10n.dart'; import '../../models/cart_model.dart'; import '../products/single_product.dart'; import '../../models/Product.dart'; import '../../models/category.dart'; import '../../utils/helper_api.dart'; import '../../pages/home/stream_products.dart'; class Products extends StatefulWidget { const Products({Key? key}) : super(key: key); @override _ProductsState createState() => _ProductsState(); } class _ProductsState extends State<Products> with AutomaticKeepAliveClientMixin, TickerProviderStateMixin { @override bool get wantKeepAlive => true; HelperApi helperApi = new HelperApi(); int currentIndex = 0; late TabController _tabController; var refreshKey = GlobalKey<RefreshIndicatorState>(); StreamProductsBloc streamProductsBloc = StreamProductsBloc(); late List<CategoryModel> productsCategories; @override void initState() { // ignore: todo // TODO: implement initState super.initState(); HelperApi().fetchCategories(1); } @override void dispose() { // ignore: todo // TODO: implement dispose super.dispose(); _tabController.dispose(); streamProductsBloc.dispose(); } @override // ignore: must_call_super Widget build(BuildContext context) { return FutureBuilder<List<CategoryModel>>( future: helperApi.fetchCategories(1), builder: (BuildContext context, AsyncSnapshot snapshot) { switch (snapshot.connectionState) { case ConnectionState.none: return Center( child: Text('No Connection'), ); case ConnectionState.waiting: case ConnectionState.active: return Scaffold( body: Center( child: CircularProgressIndicator(), ), ); case ConnectionState.done: if (snapshot.hasError) { print(snapshot.error); } else { if (!snapshot.hasData) { print('Data Not Found'); } else { this.productsCategories = snapshot.data; streamProductsBloc.fetchProducts .add(this.productsCategories[0].id!); return _categories(snapshot.data, context); } } break; } return Container(); }, ); } Widget _categories(List<CategoryModel> categoryModel, BuildContext context) { _tabController = TabController( initialIndex: 0, length: categoryModel.length, vsync: this, ); return Scaffold( appBar: AppBar( title: Text(S.of(context).products), bottom: TabBar( indicatorColor: Color(0XFF117182), indicatorWeight: 5, controller: _tabController, tabs: _tabs(categoryModel), isScrollable: true, onTap: (int index) { streamProductsBloc.fetchProducts .add(this.productsCategories[index].id!); }, ), ), body: Container( child: StreamBuilder( stream: streamProductsBloc.productsStream, builder: (context, AsyncSnapshot<List<ProductsModel>>? snapshot) { switch (snapshot!.connectionState) { case ConnectionState.none: // ignore: todo // TODO: Handle this case. return Center( child: CircularProgressIndicator(), ); case ConnectionState.waiting: // ignore: todo // TODO: Handle this case. return ShimmerGrid(); case ConnectionState.done: case ConnectionState.active: // ignore: todo // TODO: Handle this case. if (snapshot.hasError) { return Center( child: ShimmerGrid(), ); } else { if (!snapshot.hasData) { return ShimmerGrid(); } else { return _drawProducts(snapshot.data!, context); } } } }, ), ), ); } Widget _drawProducts(List<ProductsModel> products, BuildContext context) { final cart = Provider.of<Cart>(context, listen: false); var initModel = Provider.of<InitModel>(context, listen: false,); var auth = Provider.of<AuthProvider>(context, listen: false); return Consumer<WishListProvider>( builder: (BuildContext context, wishListData, child) { return Container( padding: EdgeInsets.only(top: 24), child: Column( children: [ Flexible( child: GridView.builder( gridDelegate: SliverGridDelegateWithMaxCrossAxisExtent( maxCrossAxisExtent: 200, childAspectRatio: 1 / 2, crossAxisSpacing: 20, mainAxisSpacing: 20), itemCount: products.length, itemBuilder: (context, index) { return Card( clipBehavior: Clip.hardEdge, elevation: 0.9, child: AnimationConfiguration.staggeredList( position: index, duration: const Duration(milliseconds: 375), child: SlideAnimation( verticalOffset: 50.0, child: FadeInAnimation( child: Padding( padding: const EdgeInsets.all(8.0), child: InkWell( onTap: () { _gotoSingleProduct(products[index], context); }, child: Column( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceEvenly, children: [ Expanded( // ignore: unnecessary_null_comparison child: Stack( children: [ (products[index].images![0].src != null) ? Image.network( products[index].images![0].src!, width: MediaQuery .of(context) .size .width, height: MediaQuery .of(context) .size .height, fit: BoxFit.cover, ) : Image.asset( "assets/images/1.jpeg", width: MediaQuery .of(context) .size .width, height: MediaQuery .of(context) .size .height, fit: BoxFit.fill, ), Positioned.directional( textDirection: Directionality.of( context), child: Container( margin: EdgeInsets.symmetric( horizontal: 12.0, vertical: 10.0), decoration: BoxDecoration( color: Colors.grey[200], borderRadius: BorderRadius.circular(50.0)), child: IconButton( icon: Icon( Icons.favorite_outline), onPressed: () { //wishListData.getCount(products[index].id!, auth.id!); wishListData.addNewWishList( price: products[index] .price! .toString(), product: products[index] .name!, image: products[index] .images![0] .src!, productId: products[index] .id, userId: auth.id); ScaffoldMessenger.of(context) .showSnackBar( SnackBar( content: Text( S .of(context) .add_product_to_wishlist, ), duration: Duration( seconds: 2), ), ); }, iconSize: 20.0, ), ), ) ], ) ), Padding( padding: const EdgeInsets.all(8.0), child: Text( products[index].name!.substring(0, 10), style: TextStyle( color: Colors.black, fontWeight: FontWeight.bold, fontSize: 18.0, ), ), ), Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ Padding( padding: const EdgeInsets.all(8.0), child: Text(initModel.currency! + products[index].price!, style: TextStyle( color: Colors.black, fontSize: 15.0, ), ), ), IconButton( icon: Icon( Icons.add_shopping_cart_outlined), onPressed: () { //if(auth.status == Status.Authenticated){ cart.addItem( products[index].id.toString(), 10.0, products[index].name!.toString(), products[index].images![0].src!, 1, products[index].id.toString()); ScaffoldMessenger.of(context) .hideCurrentSnackBar(); ScaffoldMessenger.of(context) .showSnackBar( SnackBar( content: Text( S .of(context) .product_added_to_the_cart, ), duration: Duration(seconds: 2), action: SnackBarAction( label: S .of(context) .undo, onPressed: () { cart.reomveSingleItem( products[index] .id .toString()); }, ), ), ); }, ), ], ), Text(products[index].stockStatus!, style: TextStyle( color: Colors.orange, fontWeight: FontWeight.bold, fontSize: 15, ),), Row( crossAxisAlignment: CrossAxisAlignment.start, mainAxisAlignment: MainAxisAlignment.start, children: [ RatingBar.builder( initialRating: products[index] .ratingCount! .toDouble(), minRating: 1, direction: Axis.horizontal, allowHalfRating: true, itemSize: 15.0, itemCount: 5, itemPadding: EdgeInsets.symmetric(horizontal: 4.0), itemBuilder: (context, _) => Icon( Icons.star, color: Colors.amber, ), onRatingUpdate: (rating) { print(rating); }, ), Text(products[index] .ratingCount! .toDouble() .toString()), ], ), ], ), ), ), ), ), ), ); }, ), ), ], ), ); }); } List<Tab> _tabs(List<CategoryModel> categoryModel) { List<Tab> tabs = []; for (CategoryModel category in categoryModel) { tabs.add(Tab( text: category.name, )); } return tabs; } void _gotoSingleProduct( ProductsModel singleProductModel, BuildContext context) { Navigator.push( context, MaterialPageRoute( builder: (context) => SingleProduct(singleProductModel)), ); } } class ProductsList extends StatelessWidget { final List<ProductsModel> productsModel; ProductsList({Key? key, required this.productsModel}) : super(key: key); @override Widget build(BuildContext context) { return Column( children: [ Expanded( child: ListView.builder( scrollDirection: Axis.vertical, itemCount: productsModel.length, itemBuilder: (context, index) { return Text('${productsModel[index].name}'); }, ), ), ], ); } }
  10. يجب إرجاع جميع الأقسام بما فيها محتواها و من ثم عرضها في listView و لكن هذا سيسبب عندك تكدس المحتوى في الواجهة. هل يمكنك إرفاق كود PHP الذي يقوم بإرجاع الأقسام و بيانات كل قسم؟
  11. المشكلة تكمن بأنك غير مفعل أو مثبت haxm أو أن الذاكرة الأفتراضية للمحاكي عالية جداً مما يسبب هذه المشكلة يجب تثبيت haxm فستجد البرنامج في المسار التالي Sdk\extras\intel\Hardware_Accelerated_Execution_Manager ستجد برنامج hxam قم بتنصيبه ومن ثم إعادة تشغيل الحاسوب, ايضا حاول تثبيت محاكي يعمل على x86 أفضل بكثير من أي محاكي أخر .
  12. لاحظ أن السطر التالي <link rel="stylesheet" href="style.css"> هو السطر المسؤول عن جلب ملف التنسيقات و كل شيء جيد ما عدا أنه مسار الملف style.css غير صحيح لأنه بداخل مجلد css فيجب وضع المسار الصحيح للملف بهذا الشكل <link rel="stylesheet" href="css/style.css">
  13. هنا الخطأ يخبرك أنه حقل id يجب أن يحتوي على قيمة وبذلك لا يمكن ان يكون فارغ و يجب أن يكون حقل id عبارة عن Auto Increment بحيث يتم تعبئته تلقائياً , حاول رجاء تغيير الحقل id و جعله auto incement.
  14. يمكنك فتح المسار التالي storage/logs/ ثم فتح الملف بداخل هذا المسار و قراءة ما هي الأخطاء التي تم التعرف عليها و يمكنك حلها , أو مشاركتها معنا , أو أيضا يمكنك فتح ملف error.log على الاستضافة الخاصة بك و قراءة الأخطاء و العمل على حلها. لأنه خطأ 500 Internal Server Error يكون خطأ داخلي ولا يمكن تحديده إلا بالرجوع إلى ملفات logs.
  15. ما فهمته أنه تريد عمل تحويل من الموقع القديم عند الضغط على أي عنصر في menu يتم تحويلك إلى الموقع الجديد, هل فهمت السؤال بشكلٍ خاطىء , أرجوا توضيح السؤال بشكل أكبر ؟
  16. يمكنك إعادة التحويل باستخدام وسم meta في html <meta http-equiv="refresh" content="30; url='index.html'"> أو باستخدام دالة header في php و هذه الدالة تستخدم لإعادة التوجيه بين الصفحات أو حتى بين المواقع بهذا الشكل header("Location: هنا الرابط أو الصفحة المقصودة"); <?php header("Location: index.php"); ?>
  17. يمكنك إضافة أي widget داخل Widget Stack بحيث تقوم باستخدام خاصية Positioned.directional(), للتحكم في إتجاه النص بداخل هذا widget باستخدام خاصية textDirection:Directionality.of(context), بحيث إذا كانت اللغة تبدأ من اليمين إلى اليسار , يتغير إتجاه النص من اليمين إلى اليسار , و من ثم إذا كانت اللغة تبدأ من اليسار إلى اليمين يتم تغيير إتجاه النص بناءً على ذلك . Stack( children: [ Image.asset( kSettingsImage, fit: BoxFit.cover, height: MediaQuery.of(context).size.height / 3, ), Positioned.directional( textDirection:Directionality.of(context), child: Text( '${S.of(context).settings}', style: TextStyle( color: Colors.white, fontWeight: FontWeight.bold, fontSize: 30.0, ), ), bottom: 10.0, start: 20.0, ), ], ), أو يمكنك استخدام Widget Builder بحيث يمكنك ايضا من تغيير إتجاه الواجهة من خلال خاصية Directionality() builder: (context, child) { return Directionality( textDirection: TextDirection.rtl, child: child, ); },
  18. لاحظ في التنسيق التالي أنك أخطأت في كتابته thead td {font-weight:ext-align:center;color:#00F} فيجب أن تعطي قيمة لخاصية font-weight , و ايضا يجب كتابة اسم الخاصية بشكل صحيح في text-align فيكون التنسيق بهذا الشكل thead td { font-weight:bold; text-align:center; color:#00F; } ثم لاحظ جيداً أنه لا يوجد وسم thead, tfoot في جدولك لذلك يجب عليك وضعها لتعمل التنسيقات أو إزالتها لتكون التنسيقات بهذا الشكل table td { font-weight: bold; text-align:center; } table td { font-weight:bold; text-align:center; color:#00F; } أو بإضافة tfoot, thead تكون التنسيقات tfoot td { font-weight: bold; text-align:center; } thead td { font-weight:bold; text-align:center; color:#00F; } فيكون كامل الكود الخاص بالجدول <table> <caption>This is Our Hosting Plan</caption> <thead> <tr> <td font-weight: bold;text-align:center;color:#00F>plan0</td> <td>plan1</td> <td>plan2</td> <td>plan3</td> <td>plan4</td> </tr> </thead> <tfoot> <tr> <td>HradDisk20GB</td> <td>HradDisk40GB</td> <td>HradDisk60GB</td> <td>HradDisk80GB</td> <td>HradDisk90GB</td> </tr> <tr> <td>5Databass</td> <td>6Databass</td> <td>4Databass</td> <td>3Databass</td> <td>2Databass</td> </tr> <tr> <td>3Ftp</td> <td>4Ftp</td> <td>5Ftp</td> <td>6Ftp</td> <td>7Ftp</td> </tr> <tr> <td>50$</td> <td>60$</td> <td>70$</td> <td>80$</td> <td>90$</td> </tr> </tfoot> </table>
  19. هل يمكنك توضيح المشكلة بشكل أكبر , حتى أتمكن من مساعدتك بشكل أفضل؟
  20. يمكنك فتح تذكرة دعم فني من هنا , وأخبار الدعم الفني بذلك و سيعملون على حل مشكلتك بأسرع وقت ممكن.
  21. كما ذكر المدرب عبود , فأن حلقة التكرار تقوم بتنفيذ الكود و طباعة الأرقام أو طباعة ما بداخل الحلقة وصولاً للشرط إذا تحقق الشرط فإن حلقى التكرار تقوم بطباعة النص بداخل الشرط المنفذ, حيث يمكنك استخدام php في تنفيذ هذه الفكرة فمثلاً يمكن استخدام for بهذا الشكل <?php for($i = 0; $i <= 10; $i++) { echo $i . "<br />"; if($i == 10) echo "الصلاة و السلام على سيدنا محمد"; } فتكون نتيجة الكود السابق 0 1 2 3 4 5 6 7 8 9 10 الصلاة و السلام على سيدنا محمد أو أيضا يمكنك استخدام أي حلقة تكرار مثل while <?php $i = 0; while($i <= 10) { echo $i . "<br />"; if($i == 10) echo "الصلاة و السلام على سيدنا محمد"; $i++; } ايضا ستكون النتجة مشابهة لنتيجة الكود السابق , ايضا يمكنك استخدام do while <?php $i = 0; do { echo $i . "<br />"; if($i == 10) echo "الصلاة و السلام على سيدنا محمد"; $i++; } while($i <= 10); الفكرة العامة هي أن تكون فاهم أساسيات كل لغة برمجية تريد تنفيذ الكود الخاص بك بها , وفهم حلقات التكرار ويمكنك تنفيذ ما تريد.
  22. يمكنك استخدام متصفح ثاني غير الذي تستخدمه ومن ثم محاولة تشغيل فيديوهات الدورة مرة أخرى , أيضا يمكنك فتح تذكرة دعم فني من هنا , عن طريق اختيار أكاديمية حسوب ومن ثم سيعملون على حل مشكلتك باسرع وقت.
  23. بعدما تقوم بإنشاء جدول teachers يجب عليك القيام ببعض الخطوات و هي كالتالي : إنشاء مودل خاص بهذا الجدول وليكن باسم مثلاً Teacher.php ويمكن إنشاء المودل عن طريق الأمر التالي php artisan make:model Teacher ومن ثم تقوم بفتح هذا الملف و إضافة له guard الذي سيكون خاص به عن طريق إضافة السطر التالي إلى الملف protected $guard = "teacher"; مع إضافة مصفوفة fillable$ للحقول الذي تنتمي لهذا الجدول protected $fillable = ['name', 'email', 'password']; ثم تقوم بإنشاء guard جديد لهذا الجدول وليكن اسمه teacher عن طريق الدخول إلى الملف التالي config\auth.php وبداخل مصفوفة guards نضيف guard الجديد 'teacher' => [ 'driver' => 'session', 'provider' => 'teachers', ], ثم في نفس الملف في مصفوفة providers نقوم بإضافة provider جديد 'teachers' => [ 'driver' => 'eloquent', 'model' => App\Teacher::class, ], ثم يمكنك إنشاء متحكم جديد وليكن مثلاً باسم TeacherController.php عن طريق الأمر التالي php artisan make:controller Auth\TeacherController نقوم بفتح هذا الملف و من ثم إضافة عملية تسجيل الدخول إليه عن طريق الكود التالي ,بحيث نقوم بإضافة guard الذي نود أن يكون مسؤول عن عملية تسجيل الدخول Auth::guard('teacher')->attempt(['email' => $request->email, 'password' => $request->password]);
  24. flutter inspector: يعد فاحص أدوات flutter أداة قوية لتصوير و استكشاف أشجار عناصر واجهة flutter. يستخدم إطار عمل flutter عناصر واجهة المستخدم باعتبارها اللبنة الأساسية لأي شيء بدءاً من عناصر التحكم مثل النصوص و الأزرار و المفاتيح , إلى عناصر التخطيط و هي Center, Column, Padding, Rows , يساعدك المراقب ( flutter inspector ) على استكشاف هذه العناصر والعمل على فهم المخطط الخاص بواجهة المستخدم أو تشخيص المشكلات التي تكون في تخطيط الصفحة. يلجأ الكثير من المبرمجين إلى استخدام هذه الأداة لحل المشكلات التي قد تكون في الواجهة مما يوفر عليه عدم مراجعة كود تخطيط الصفحة من البداية وعدم اللجوء إلى تبديل عناصر قد تكون المشكلة بسبب عناصر أخرى غيرها. flutter Emulator: هو محاكي مثل أجهزة الموبايل android على نظام الكمبيوتر الخاص بك , بحيث يتيح لك تجربة تطبيقاتك عليه , ايضا يزود المحاكي المستخدم بعدة أجهزة ليتيح تجربة التطبيق على أكثر من جهاز موبايل بمختلف الإصدارات. يوفر هذا المحاكي عدة أمكانيات شبيهة بنظام الجوال, مثل محاكاة المكالمات الهاتفية و الرسائل الواردة و الصادرة , تحديد موقع الجهاز, أجهزة الاستشعار الأخرى, الوصول إلى متجر قوقل بلاي وغير ذلك الكثير, يعد أختبار تطبيقك على المحاكي اسرع و اسهل من أختباره على جهاز موبايل حقيقي.
  25. يمكنك فتح الصورة من خلال الرسالة بالطريقة التالية: قم بالضغط على الصورة بالزر الأيمن للماوس. بعد الضغط على الصورة قم باختيار تحرير. ثم من سيفتح معك الرسام , قم بالضغط على تغيير الحجم. ثم قم بوضع ارتفاع و عرض مناسبين للصورة وليكن مثلاً 1000 بكسل لكليهما. ومن ثم حاول مجدداً تحديث الصفحة و ملاحظة الفرق الحاصل بعد تغيير حجم الصورة .
×
×
  • أضف...