-
المساهمات
6975 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
218
إجابات الأسئلة
-
إجابة Wael Aljamal سؤال في إضافة أيقونة بجانب عناصر قائمة في صفحة الويب كانت الإجابة المقبولة
يوجد حلين،
يمكنك بالنقر على الزر الأيمن بالفأرة ثم اختيار inspect على هذه العناصر، ونسخ جزء القالب منها، يمكن أن تكون صورة أو أيقونة...
يمكن استخدام مكتبة fontawsome ثم الأيقونة fa-file-text-o بوضعها إلى جانب عنصر القائمة li .. في القالب..
<i class="fa fa-file" aria-hidden="true"></i> أما للحصول على المكتبة يمكن تضمينها في القسم head من الصفحة:
يمكن عمل رابطك الخاص من خلال الموقع fontawesome.com/v4.7
<script src="https://use.fontawesome.com/2c7e19617c.js"></script> أو من خلال الملف الذي أرفقته لك، تقوم بفك الضغط ثم ترفعه على الاستضافة:
<link rel="stylesheet" href="path/to/font-awesome/css/font-awesome.min.css"> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ استبدل المسار حسب مالديك font-awesome-4.7.0.zip
-
إجابة Wael Aljamal سؤال في تغير ملف keystore كانت الإجابة المقبولة
نعم يمكن تعديل المفتاح، في الرابط التالي اتجه نحو Create an upload key and update keystores
افتح لوحة تحكم إدارة المفاتيح: play.google.com/keymanagement في صفحة (Release > Setup > App integrity). اتبع التعليمات في الرابط: app-signing#generate-key حيث تقوم بتوليد مفتاح جديد ثم تصدير شهادة المفتاح:
$ keytool -export -rfc -keystore upload-keystore.jks -alias upload -file upload_certificate.pem رفع الشهادة الجديدة يوجد ملاحظة:
التطبيقات قبل August 2021لن تتمكن من عمل تعديلات
By comparison, for apps created before August 2021 that have not opted in to Play App Signing, if you lose your app’s signing key, you lose the ability to update your app.
-
إجابة Wael Aljamal سؤال في تغيير خلفية الشاشة كل فترة زمنية باستخدام jquery وإضافة تأثيرات حركية عليها كانت الإجابة المقبولة
الملاحظة:
إن ملفات جافاسكربت التي تتفاعل مع مكونات الصفحة يجب أن يتم تحميلها في آخر جزء من الصفحة body لأن عناصر HTML يتم تحميلها بعد البدء بتحميل body صحيح؟ حسب تسلسل الشيفرة في الملف، لذلك إما تنقل تضمين ملف js
<head> ... <script src="js/js.js"></script> من head لآخر وسم في body (يفضل كل ملفات جافاسكربت)
html ....... ............ ........... <script src="assest/JavaScript/jquery-3.1.1.min.js"></script> <script src="assest/bootstrap/js/bootstrap.min.js"></script> <script src="js/js.js"></script> </body> هذا يسرع عرض محتوى الصفحة..
الحل الآخر هو استخدام دوال jQuery لتأخير تنفيذ شيفرة جافاسكربت
$(function () { var images = [ 'images/diagoona-bg-1.jpg', 'images/diagoona-bg-2.jpg', 'images/diagoona-bg-3.jpg', ] var imageHead = document.getElementById('image-head') var i = 0 setInterval(function () { imageHead.style.backgroundImage = 'url(' + images[i] + ')' i = i + 1 if (i == images.length) { i = 0 } }, 3000) }) لاحظ هذه الكتابة تمثل document . ready أي انتهاء تحميل الصفحة! لذلك تعمل الشبفرة، ولاحظ مسارات الصور كانت خطأ حيث أنها يجب أن تبدأ باسم المجلد
-
إجابة Wael Aljamal سؤال في طريقة حساب رسوم الدفع كانت الإجابة المقبولة
تتعلق الضريبة بعدة امور حسب الرابط الذي ارفقته مسبقا، عدد عمليات التعامل والحوالاات ثم قيمة المبلغ ضمن حدود كما في الجدول وحد أدنى و أعلى للخصم (أعتقد يتم أخد العمود حسب إما اكبر مبلغ أو أكبر عدد حوالات) حيث يتم حساب هذه العملية شهرياً ويتم خصم عمولة الخدمة من المبلغ المستوفى. كضرب النسبة المؤية بقيمة التعاملات.
ربما المدرب @Adnane Kadriقد تعامل معها ويعطينا توضيحاً.
-
إجابة Wael Aljamal سؤال في NextJS مع وظائف Firebase Cloud كانت الإجابة المقبولة
أي أنك تريد عمل deploy لمشروع next.js على استضافة firebase..
يمكن باء المشروع ليكون قابلاً للتصدير export حيث نضيف لجزء script في package.json :
"scripts": { "dev": "next", "build": "next build", "start": "next start", "export": "next export" // هذا }, ثم ننفذ:
npm run build && npm run export الآن ستكون الملفات قابلة للرفع على استضافة static hosting server مثل firebase hosting
حيث سيتم وضع الملفات في المجلد
out/ لتفاصيل أكثر من التوثيق الرسمي: nextjs / static-html-export
للعمل إن كانت الملفات تتولد لديك بشكل ديناميكي لايمكن رفعها على استضافة ساكنة static
-
إجابة Wael Aljamal سؤال في react native redux عندما اضيف الى المفضلة فانا اريد ال reducer ان يتحقق ان الايتم لو موجودة لا يضيفها مرة اخرى كانت الإجابة المقبولة
يعتمد الأمر على بنية المنتج (العنصر الذي تضيفه للبطاقة) فإذا كان يحوي خاصية تدعى العدد quantity فعليك المرور على المصفوفة و البحث عن هذا العنصر و تعديل الخاصية فيه بزيادتها ب 1، وإن لم يكن موجود، تقوم بإضافته للمصفوفة
case ADD_TO_FAVORITE: { let flag = false; this.itemsInCart.forEach(el => { if (el.itemId == itemDetails.objectId) { el.qty += 1; flag = true; return false; } }) if (!flag) { this.itemsInCart.push({ itemId: itemDetails.objectId, itemName: itemDetails.dishName, itemPrice: itemDetails.price, qty: 1 }); } return { ...state, myFavorite: [...state.myFavorite, action.payload], }; } يمكن تحقيق ذلك بأكثر من طريقة..
array.indexOf(newItem) === -1 && array.push(newItem); أو
Array.prototype.pushUnique = function (item){ if(this.indexOf(item) == -1) { this.push(item); return true; } return false; } /////////////// var newItem = "NEW_ITEM_TO_ARRAY"; var array = ["OLD_ITEM_1", "OLD_ITEM_2"]; array.indexOf(newItem) === -1 ? array.push(newItem) : console.log("This item already exists"); console.log(array)
** إن كان العنصر موجود نزيد تكراره وإلا نضيفه، وبالحذف إن كان موجود نقلل تكراره وإن أصبح 0 نحذفه من المصفوفة
-
إجابة Wael Aljamal سؤال في [Java script] كيفية اضافة شرط لزر تتغير قيمته بتغير قيمة select box كانت الإجابة المقبولة
يمكن التأكد أن الدليل المطلوب يتبع للخيارات المطلوبة:
function showDetails() { var sel = document.getElementById('embroiderys-value'); var selIndex = sel.selectedIndex; if (selIndex == 0) { alert("أرجو تحديد خيار مناسب"); return; } var option = sel.options[selIndex].value; window.open("accessories/tatreez/tatreez-view.php?id="+option); } حيث قمنا بعمل شرط، إن كان العنصر المحدد هو 0 (تأكد من حمل المتغصير للقيمة null مثلا أو قيمة أخرى) نقوم بعمل alert ثم نضع عبارة retun لكي لا يتم استكمال الشيفرة في الدالة
-
إجابة Wael Aljamal سؤال في هل تتضمن دورات حسوب، دورة الرسم باستخدام css كانت الإجابة المقبولة
إن استخدام HTML - CSS لعمل رسوميات هو أمر خاص جداً وليس شائعاً، وللأسف لايوجد في دورات أكاديمية حسوب أي شروحات بما يخض هذا، بل تركز الدورات على تعليم عدة مستويات من هذه التقنيات، من شرح الأساسيات لاستخدام إطارت العمل وتخصيصها وتعليم SASS وهذه الأمور هي الأكثر أهمية في مجال العمل..
إن تعلمت الأساسيات جيداً ستصبح قادرا على تصميم مواقع انترنت بتصاميم مميزة، ومع الوقت ستتعلم تصميم رسوميات معقدة، مع العلم تحتاج إلمام جيد بالرياضيات والهندسة لتستطيع التعامل مع الأشكال الهندسية و الزوايا بمرونة..
وكما يقول الرسام بابلو بيكاسو :
" اتقن القواعد كمحترف ، حتى تتمكن من كسرها كفنان"
حيث أن عمل رسوميات هو جاني تصميمي إبداعي وليس برمجي، لا يمكن تعلم الفن والذوق، إنما هذه مهارات شخصية فقط تحتاج لأساسيات التقنية المستخدمة.
-
إجابة Wael Aljamal سؤال في تسجيل الدخول بواسطة حساب أبل إلى flutter كانت الإجابة المقبولة
في هذه الجزء ::
com.aboutyou.dart_packages.sign_in_with_apple.SignInWithAppleCallback ^^^^^^^^^ متغير حسب اسم المشروع لديك عدل اسم حزمة التطبيق ليتم إعادة التوجيه للبرنامج ثم للحزمة لتعالج الطلبية*
إن لم تعمل،
redirectUri خطأ، أنت تعيد البيانات لرابط غير مرتبط بمشروعك أو تطبيقك، حاول متابعة التوثيق في جزء:
WebAuthenticationOptions.redirectUri intent://callback?${PARAMETERS FROM CALLBACK BODY}#Intent;package=YOUR.PACKAGE.IDENTIFIER;scheme=signinwithapple;end *******
في apple console حاول تحويل المشروع ل production ويجب تفعيل Sign with Apple لتعمل خارج نظام أبل بعمل تعديلات لكل من
Identifier Service ID glitch web app
-
إجابة Wael Aljamal سؤال في تعديل المنشور و خصائصه من عنوان و صورة في مشروع باستخدام لارافل كانت الإجابة المقبولة
بالنسبة للخطأ: function name must be a string أنت تستعمل الأقواس المدورة () مع مصفوفة بدل استخدام [ ]
بالنسبة للصورة الأخيرة إن لاحظت العنوان يحوي على رموز غريبة، هذا بسبب أن رابط إعادة التوجيه فيه مشكلة حيث لم يتم تفسير الرابط بشكل صحيح
-
إجابة Wael Aljamal سؤال في إبقاء العضو قيد تسجيل الدخول باستخدام جلسات PHP كانت الإجابة المقبولة
بيانات الجلسة تحفظ في المخدم (السيرفر) وتوجد مثلا في المسار temp/
لتحديد وقت الجلسة يمكن ذلك ضمن ملف htaccess.
<IfModule mod_php5.c> #Session timeout php_value session.cookie_lifetime 1800 php_value session.gc_maxlifetime 1800 </IfModule> هذا يقوم بتحديد طول الجلسة ب 30 دقيقة (30*60=1800 ثانية)
تأكد من إصدار php لديك وكيفية كتابة .htaccess المناسب لها
-
إجابة Wael Aljamal سؤال في التعامل مع المصفوفة ثنائية الأبعاد بلغة جافا كانت الإجابة المقبولة
سيكون الحل على 3 مراحل،
طباعة اسم دولة ما من المصفوفة، أو طباعة لأكثر من عنصر هذا يعود لكِ قراءة دخل المستخدم الذي يمثل العاصمة مقارنة الإجابة إن كانت صحيح بالحث عن التطابق في المصفوفة package Java; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in =new Scanner(System.in); String arr[ ][ ]={{"S,R"},{"M,E"},{"A,W"}}; for (int i=0;i<arr.length;i++){ System.out.println( "ما هو اسم عاصمة المدينة:" + arr[i][0]); String x = in.next(); if ( x.equals(arr[i][1]) ) { System.out.println("إجابة صحيحة"); }else { System.out.println("إجابة خاطئة إن الإجابة الصحيحة هي:" + arr[i][1] ); } } } }
arr[i][0] تحوي الدولة
arr[i][1] تحوي العاصمة
-
إجابة Wael Aljamal سؤال في كيف اتعامل مع Broadcast receiver في الاندرويد ستوديو؟ كانت الإجابة المقبولة
مستقبل الأحداث، يمكن استخدامه في أي عملية غير متزامنة أي تحقيق اسجابة لحدوث شيئ ما، يمكن أن يكون انتهاء مهلة من الوقت أو نقر على زر من المستخدم أو أي تغييرات على مستوى نظام التشغيل
نعم بالطبع، من خلال intent يمكنك تمرير بيانات لمستقبل الأحداث، ثم استعمال الجملة الشرطية if مثلا لتبيان نوع الحدث ثم تشغيل الشيفرة المناسبة للتعامل معه.
إن عمل مستقبل أحداث ديناميكي يتعلق بتمرير بيانات له وثم بناءاً على قيمة هذه البيانات يتم الاستجابة المناسبة
Intent intent = new Intent("my.multi.working.broadcast"); // اسم النشاط intent.putExtra("type", type .. ); // نوع الصلاة intent.putExtra("title", "my title: "); intent.putExtra("text", "my text...:"); sendBroadcast(intent); في الشيفرة السابقة تم تحديد نوع الصلاة (الوقت) بتمرير قيمة ضمن intent وإلا يمكن التحديد من النشاط activity
public void onReceive(Context context, Intent intent) { String action = intent.getAction(); Log.i("Receiver", "Broadcast received: " + action); if(action.equals("my.action.string")){ /// تأكد من تطابق اسم النشاط في الجزء السابق مع هذا String state = intent.getExtras().getString("extra"); } }
-
إجابة Wael Aljamal سؤال في هل يوجد امتحان بعد كل دورة أو يتطلب ذلك إنهاء جميع الدورات؟ كانت الإجابة المقبولة
مرحبا شادن،
يوجد 6 دورات مختلفة ولكل منها امتحان خاص بعد انتهاء الطالب من الدراسة.
وإن كل دورة لها كلفة 160$ ومستقلة بذاتها، ولكن بعد الاشتراك بأي دورة يمكن للطالب الإطلاع على أول مسار من باقِ الدورات مجاناً إن أردا دراسة دورة أخرى أو تغيير الدورة التي اشترك فيها أي يأخذ فكرة عنهم.
160$ هو سعر الدورة أما الشهادة تعطى للطلاب الناجحين في الدورات (بدون تكلفة إضافية) ويمكنك إعادة الفحص إن لم تنجح في أول مرة..
بالتوفيق
-
إجابة Wael Aljamal سؤال في كيف يمكننى حل هذا الخطأ. ERROR Warning: Failed prop type: Invalid props.style key `resizeMode` supplied to `Text`. كانت الإجابة المقبولة
أحد مكونات العرض يستخدم الخاصية resizeMode لعنصر Text حاول حذفها. أو انقلها من styles إلى imageStyle prop مباشرة
كمثال:
class CoolBackgroundImage extends Component { render() { <ImageBackground source={{uri: 'link-to-image'}} imageStyle={{resizeMode: 'stretch'}} /// هنا style={Style.someAdditionalViewStyles} > <View style={Style.container}> <Text>This is a child of the ImageBackground!</Text> </View> </ImageBackground> } }
هذا التعديل أصبح مطلوب بعد اتحديث عن إصدار 0.48
-
إجابة Wael Aljamal سؤال في مشكلة في تموضع عناصر الصفحة فوق بعضها كانت الإجابة المقبولة
إن GET هي مصفوفة عامة تخزن فيها بيانات الطلبيات التي يرسلها الزبون (المتصفح) للمخدم والتي تكون حصراً من نوع GET
وهي مرتبطة بالطلبية، أي ممكن أن يتم حذف محتواها، تأكد من أن المصفوفة GET تحوي القيمة المطلوبة مثلا بعمل جملة طباعة عادية echo وتابع محتوى المصفوفة، أعتقد أنه يتطلب حفظ هذه القيمة بمتغير آخر أو قاعدة البييانات أو الجلسة session، لا يتم حفظها.
أي ربما GET في لاتحوي قيمة لذلك يحدث الخطأ، احفظ البيانات بطريقة مختلفة، محتوى GET متغير
-
إجابة Wael Aljamal سؤال في كيفية جلب علاقة من علاقة في لارافل كانت الإجابة المقبولة
أضف العلاقات التي تريدها مع with أي جرب التالي:
Exam::with(['teacher.profile', 'subject']) ^^^^^^^^^^^^^^^^ الشكل العام لها:
with('relation1.relation2.relation3')->get(); اجلب العلاقات المرتبطة الواحدة تلوَ الأخرى..
-
إجابة Wael Aljamal سؤال في كيفية ارسال GET request الى رابط يحتوي على بيانات GET بالفعل كانت الإجابة المقبولة
أي أنك تريد تثبيت الوسيط first=1 يمكن وضع input مخفي
<input type="hidden" name="first" value="1"> سيتم إضافته للرابط..
<form method="get" action="http://example.com"> <input type="hidden" name="first" value="1" /> <input name="second" /> <input type="submit" value="submit" /> </form>
والتجريب:
إدخال 5 في الحقل الظاهر في الصفحة يرسل الطلب للصفحة http://example.com/?first=1&second=5 -
إجابة Wael Aljamal سؤال في مامعنى هذه الرسالة وكيف اعالجها react native كانت الإجابة المقبولة
حاول عمل تنظيف clear :
useEffect(() => { myFunction(); // استدعاء الدالة return () => { setState({}); // تنظيف الحالة }; }, []);
-
إجابة Wael Aljamal سؤال في الإضافة Prettier - Code formatter لم تعد تعمل في محرر vs code كانت الإجابة المقبولة
في الجزء السفلي من محرر الأكواد vs code تظهر تبويب بنفس لاحقة الملف، مثلا إن كان php يكتب php وهكذا لكل لغة (تأكد من تطابقهما) اضغط بالزر الأيمن ضمن الملف ثم اختر format with ثم تظهر قائمة منبثقة حدد منها Prettier - Code formatter تأكد من تحديث الإضافة (يوجد 2 بنفس الاسم واحد منهم توقف عملها deprecated)
-
إجابة Wael Aljamal سؤال في هل يجب تعلم الخوارزمات للدخول في عالم البرمجة؟ كانت الإجابة المقبولة
إن دراسة الخوارزميات والرياضيات ليست ضرورية في البرمجة، بل تعتمد على التخصص الذي تريد دراسته و العمل به.. حيث أن تطوير مواقع الويب و تطبيقات الجوال و حتى تطبيقات سطح المكتب لا تعتمد على الخوارزميات والرياضيات، بل فقط برامج المحاسبة و تطبيقات الذكاء الصنعي و أمور متقدمة..
أي يمكنك البدء بمراجعة الأساسيات الخاصة بالمجال الذي ترغب بالعمل به ثم التوسع و عمل تطبيقات ضمنه.
إبدأمن هنا:
-
إجابة Wael Aljamal سؤال في التحقق من طول رقم الهاتف في التسجيل - لارافيل كانت الإجابة المقبولة
يعتمد هذا على نوع الحقل، فإن كان رقمياً يتم الأخذ بقيمته، وإن كان سلسلة نصية يتحدد بعدد الخانات، أرجو التأكد من نوع الحقل في النموذج model الخاص بالجدول وملف التهجير..
ثم ستعمل الخاصية:
size:10 كما يمكن استعمال الطرق التالية:
الأسهل :: 'phone' => 'required|digits:10', أو 'phone' => 'required|regex:/(01)[0-9]{10}/' 'phone' => 'required|numeric|phone_number|size:10'
-
إجابة Wael Aljamal سؤال في استقبال البيانات في صفحة الويب بعد الاتصال عن طريق API وتحديث الصفحة كانت الإجابة المقبولة
إن فكرة API مختلفة عن فكرة AJAX.
API: هي مجموعة دوال ضمن متحكمات تعيد لنا بيانات خام بصيغة JSON مثلاً, بدون أي تنسيقات أو HTML ويمكن الاستفادة منها في تطبيقات الهواتف المحمولة مثلا حيث تكون الواجهة عبارة عن تصميم في التطبيق حسب لغة برمجة التطبيق أي مثل قالب HTML-CSS.. فيتم حشر البيانات ضمن تصميم موجود مسبقاً وعرضه.
برمجة ال API محصورة بالمخدم، أي يتم الاتصال بالمخدم عن طريق مسارات محددة وباستخدام HTTP methods محددة لنحصل على النتيجة المطلوبة.
AJAX: هي طريقة تقوم بها بإرسال طلبية ومن ثم استقبال البيانات في صفحة الويب باستخدام لغة جافاسكربت، وتقوم بتحديث الصفحة أو جزء منها بدون إعادة تحميلها مجدداً.
دوماً لغة المخدم هي من ترسل البيانات.
معالجة المعلومات في المخدم تكون عن طريق PHP (ربما تعيد عناصر HTML أو بيانات على شكل JSON) أما في صفحة العرض في المتصفح يمكن أن تكون جافاسكربت هي من تولد عناصر HTML حسب قالب معين و تضيف عليها البيانات القادمة من المخدم الذي يرسل في هذه الحالة فقط البيانات.
********
إن لم تستعمل AJAX عليك تعبئة استمارة HTML form وله زر submit وترسل الطلبية، أما من خلال AJAX تقوم بتهئية http request وترسلها للمخدم وبعد النتيجة تحدّث الصفحة لديك..
مثال لاستعمال AJAX:
ليكن لدينا صفحة HTML بسيطة:
<!DOCTYPE html> <html> <body> <div id="demo"> <h2>Let AJAX change this text</h2> <button type="button" onclick="loadDoc()">Change Content</button> </div> </body> </html> وشيفرة جافاسكربت وأجاكس كالتالي:
function loadDoc() { var xhttp = new XMLHttpRequest(); xhttp.onreadystatechange = function() { if (this.readyState == 4 && this.status == 200) { document.getElementById("demo").innerHTML = this.responseText; } }; xhttp.open("GET", "ajax_info.txt", true); xhttp.send(); } لاحظ أن الاتصال يتم على ملف نصي، بالطريقة GET، ولدينا الدالة التي تستقبل رد المخدم وإذا كان 200 أي وصل رد صحيح، سنقوم بحشر البيانات التي عاد بها المخدم( افتراضيا يعيد ملف نصي) وحشرها في العنصر demo لتحديث العرض
مثال عن محتوى الملف:
ajax_info.txt => <h1>AJAX</h1> <p>AJAX is not a programming language.</p> <p>AJAX is a technique for accessing web servers from a web page.</p> <p>AJAX stands for Asynchronous JavaScript And XML.</p> المثال الذي ذكرته يعتمد على أجاكس مباشرة باستخدام جافاسكربت، ويمكن الاستفادة من جيكويري jQuery لتسهيل العمل.
مقالة من أكاديمية حسوب:
توثيق حسوب:
wiki.hsoub / jQuery - Ajax
أسئلة و أجوبة تتعلق بالموضوع:
صورة تبسط دورة حياة الطلبية:
المتصفح يقوم بتجهيز الطلبية ويضيف الرابط و البيانات اللازمة، ثم ترسل للمخدم الذي يعالجا ويستجيب ويرسل الجواب للمتصفح الذي يعود و يعالج البيانات ويقوم بعمل التحديث المناسب في الصفحة.
-
إجابة Wael Aljamal سؤال في ما الحل لتأخر أصحاب المشاريع عن استلام مشاريعهم؟ كانت الإجابة المقبولة
يحق لصاحب المشروع التأخر في استلام المشروع حتى يقوم بالتأكد من أن المستقل قد أنجز المطلوب، وأرسل له كل الملفات المطلوبة و أنها تعمل بصورة جيدة.
بشكل عام، عليك الإنتظار قليلاً و إذا لم يفتح صاحب المشروع حسابه يُمكنك حينها التواصل مع فريق الدعم للمنصة من خلال هذا الرابط: مركز مساعدة حسوب و فتح تذكرة لمُشكلتك مع توضيحها جيداً و سيقوم الفريق حينها بحل مُشكلتك أو تنبيه صاحب المشروع للتواصل معك أو إنهاء المشروع.
إن قمت بكل شيئ بشكل جيد، لاداعِ للقلق يمكن لفريق الدعم استلام المشروع عن صاحب المشروع إن حدث أي مشاكل من طرفه.
-
إجابة Wael Aljamal سؤال في هل يُقبل دفع سعر الدورة بالجنيه المصري؟ كانت الإجابة المقبولة
يوجد طريقتين للدفع ضمن أكاديمية حسوب،
البطاقة الإتمانية و عن طريق paypal يمكنك ملاحظة ذلك بعد النقر على زر الشراء في أي دورة.
لمزيد من المعلومات يمكنك فتح تذكرة من خلال مركز مساعدة حسوب