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

سمير عبود

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

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

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

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

    34

آخر يوم ربح فيه سمير عبود هو سبتمبر 18 2023

سمير عبود حاصل على أكثر محتوى إعجابًا!

المعلومات الشخصية

  • النبذة الشخصية
    سمير عبود من الجزائر مطور مواقع ويب، مدرب مساعد لطلاب أكاديمية حسوب
  • الموقع

آخر الزوار

لوحة آخر الزوار معطلة ولن تظهر للأعضاء

إنجازات سمير عبود

عضو نشيط

عضو نشيط (3/3)

2.2k

السمعة بالموقع

179

إجابات الأسئلة

  1. إن كنت تريد مزامنة الملفات بين عدة أجهزة يُمكنك إستخدام برنامج syncthing وهو برنامج مفتوح المصدر يستخدم لمزامنة الملفات والمجلدات بين أجهزة متعددة بشكل آمن وسهل. يتيح لك البرنامج الحفاظ على نسخ متزامنة من الملفات عبر الأجهزة المختلفة، سواء كانت أجهزة كمبيوتر، خوادم، أو حتى أجهزة محمولة. من بين أهم المميزات أنه بسيط وسهل الإستعمال بالإضافة لأنه متعدد المنصات يعمل على معظم أنظمة التشغيل بما في ذلك Windows، macOS، Linux، و Android، تستطيع إستكشاف البرنامج وما يقدمه من مميزات من خلال يوتيوب يوجد عدة مقاطع تشرح ذلك. مستودع البرنامج على github : مستودع syncthing
  2. تحتاج إلى إضافة الحقل لإستمارة التسجيل: <div class="mt-4"> <x-label for="photo" value="{{ __('Photo') }}" /> <x-input id="photo" class="block mt-1 w-full" type="file" name="photo" /> </div> تحتاج التعديل على عُنصر الإستمارة بإضافة: <form method="POST" action="{{ route('register') }}" enctype="multipart/form-data"> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ بعدها تحتاج إلى التعديل على التابع المسؤول عن إضافة السجل: بإضافة التحقق: Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'password' => $this->passwordRules(), 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['accepted', 'required'] : '', 'photo' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'], // إضافة التحقق ])->validate(); ثم بعد إنشاء المستخدم تقوم بتعديل الصورة في حالة ما إذا كان الطلب به ملف صورة: $user = User::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), ]); if (isset($input['photo'])) { $user->updateProfilePhoto($input['photo']); } return $user; تستطيع حفظ الصورة بنفسك قبل حفظ المستخدم، لكن بإمكانك أيضاً إستخدام نفس الخاصية الموجودة في التعديل، أي التابع updateProfilePhoto كما هو موضح أعلاه، التابع سيقوم بحفظ الصورة في المجلد storage و يُعدل على حقل الصورة في قاعدة البيانات أيضاً.
  3. خاصية تعديل الصورة الشخصية للمستخدمين متاحة كخاصية إفتراضية في Jetstream، لا تحتاج إلى إنشائها من الصفر فقط عليك تفعيلها من خلال ملف الإعدادات: config/jetstream.php ستجد بداخل المفتاح features السطر التالي: Features::profilePhotos(), مُعلق قم بإزالة التعليق. ثم ستتمكن من التعديل على الصورة الشخصية من خلال صفحة ال profile، إن أردت شيء مغاير يُمكنك الإشارة.
  4. يُمكنك إستخدام الدالة unlink في php لحذف أي ملف، وتمرير مسار الملف الذي تريد حذفه كوسيط أول للدالة.
  5. نعم بإمكانك ذلك، لكن ستنسخ بعض الأكواد فقط جزء التحقق من المدخلات و التي من بينها الصورة، أما الإستعلام سيتغير لأنك في هذه الحالة ستقوم بإستعلام تعديل أيضاً قد تحتاج إلى حذف الصورة السابقة في حالة تعديل الصورة كي لا تتكدس الصور لديك في مجلد التخزين بدون حاجة لها
  6. إذا كان قصدك الخاصية alt و القيمة التي وضعتها فهي قيمة إختيارية فقط، أما الخاصية فهي تعني النص البديل وهذا النص يظهر في حالة تعذر الوصول إلى الصورة.
  7. لا يمكنك وضع الصورة من خلال حقل file عليك وضعها من خلال عُنصر الصورة (img) أي أن كود php ستضعه من خلال الخاصية src في عُنصر الصورة (img)، يعني ستقوم بتعديل التالي: <img width="180" height="150" src="https://placehold.co/180x150" alt="image preview" id="preview"> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ بوضع مسار الصورة عن طريق php: <img width="180" height="150" src="<?php echo 'مسار الصورة' ?>" alt="image preview" id="preview"> أنا لا أعلم إسم الحقل الذي تخزن فيه مسار الصورة ولا كيف تقوم بتخزينها لكن أنت ملم بهذه المعطيات، فقط ستُعدل على ال 'مسار الصورة' بما يوافقها بعد جلبك للبيانات.
  8. لا يُمكنك وضع القيمة من خلال حقل الإدخال (input file) مباشرةً، تحتاج إلى إضافة عُنصر صورة (img) تحت الحقل file تعرض به الصورة من خلال المسار الخاص بها، ثم من خلال جافاسكربت يُمكنك إذا قام المستخدم بتغيير الصورة إلتقاط الحدث و التغيير على الصورة بحيث تظهر الجديدة التي اختارها، بعد ذلك إذا تم الضغط على زر التعديل ترسل الإستمارة إلى الخادم وتحفظ الصورة الجديدة: هنا شرح بسيط للعملية: <form action="" enctype="multipart/form-data"> <input type="file" id="file" name="file" accept="image/*" onchange="loadImage(event)"> <br><br> <img width="180" height="150" src="https://placehold.co/180x150" alt="image preview" id="preview"> </form> لاحظ العُنصر img (هو الذي نستخدمه لعرض الصورة، يُمكنك التعديل على الخاصية src بوضع مسار الصورة الخاصة بالسجل الذي تقوم بالتعديل عليه) أيضاً لاحظ عُنصر الإدخال استخدمنا الخاصية onchange لإلتقاط حدث التغيير وتنفيذ الدالة loadImage التي سنقوم بإنشائها عبر JavaScript: const loadImage = (event) => { const output = document.getElementById('preview'); output.src = URL.createObjectURL(event.target.files[0]); output.onload = function() { URL.revokeObjectURL(output.src) } } فقط نقوم بتحديد عُنصر الصورة من DOM ثم نُغير على الخاصية src بوضع الصورة الجديدة. المثال موجود على CodePen من هنا، هذه الفكرة بإختصار يُمكنك التعديل عليها حسب الحالة وإضافة التنسيقات المناسبة لك.
  9. إن كنت تقصد دورة مخصصة بشكل كامل لبناء تطبيقات الهاتف فهي غير موجودة، لكن توجد دورة تطوير التطبيقات باستخدام JavaScript التي تتكون من مسارات تم التطرق فيها إلى تطوير تطبيقات جوال بشكل كامل و شرح الأساسيات في بعض التقنيات وأطر العمل المستعملة في هذا المجال مثل React Native و Ionic. فإذا توجهت للصفحة الخاصة بهذه الدورة: دورة تطوير التطبيقات باستخدام لغة JavaScript ستجد المسارات التالية: تطوير تطبيق جوال باستخدام React Native تطبيق دردشة يشبه WhatsApp و هذا مسار يشمل تطبيق الويب بإستعمال node.js و react.js وتطبيق جوال بإستعمال React Native تطوير تطبيق جوال للتواصل الاجتماعي باستخدام Ionic وهذا المسار شامل لإطار العمل Ionic فهو يتكون من حوالي 111 درس موزعة على 16 ساعة لكن كما قلت فإن الدورة مخصصة للغة جافاسكربت والتطبيقات التي يمكن بناؤها بإستعمال هذه اللغة والتقنيات الخاصة بها، فستجد أنها تتكون أيضاً من مسارات إضافية لشرح أساسيات اللغة نفسها وشرح أساسيات NodeJs وأساسيات ReactJs، وأيضاً يوجد مسار لـ Typescript و مسار لإطار Electron.js المستعمل في بناء تطبيقات سطح المكتب و مسارات أخرى معظمها عملية تطبيقية يتم فيها بناء تطبيق معين. لذلك أعتقد أن هذه الدورة مناسبة لما تبحث عنه بقية الدورات تخص مجالات أخرى، لكن إن كنت تقصد شيئ آخر أو تقنيات أخرى غير التي ذكرتها يُمكن طرح تساؤلك أو تقديم إقتراحك على الإدارة من خلال مركز المساعدة، تحياتي.
  10. دورة علوم الحاسوب هي عبارة عن حجر الأساس ونُقطة الإنطلاق لتعلم أحد المجالات والتخصص فيه، يُفترض أنه بعد إنهائك لهذه الدورة وفهم دروسها بالكامل أن تجد سهولة في إحتراف المجال الذي يناسبك وتبدأ رحلتك فيه. مسألة إختيار المجال تتعلق بك وبسوق العمل الذي تريد أن تستهدفه. أنصحك بالإطلاع على هذا المقال حتى تتضح لك الصورة وتُحدد الهدف الذي تريد بلوغه: تم التطرق في المقال لمعظم المجالات الموجودة وشرح مختصر للمجالات كما تم إرفاق مصادر لبداية تعلم كل مجال وإحترافه، بالتوفيق.
  11. الموضوع مطول قليلاً لكنه بسيط فقط ستحتاج إلى إلمام بأساسيات الإطار يُمكنك الإطلاع على المقالات التي تخص لارافيل في الأكاديمية لفهم الموضوع بشكل أكبر. مبدئياً ستحتاج إلى نموذج بيانات (model) مربوط بجدول في قاعدة البيانات (migration)، مسارات (routes) تخص عمليات crud على النموذج يُمكن إستعمال مسار من النوع resource هنا لأنه يختصر كل المسارات في سطر واحد، متحكم (controller) لتحويل الطلبات إليه لمعالجتها وإرسال رد يوافق الطلب، من الممكن أن تحتاج إلى أشياء إضافية مثلاً كصنف مصنع (factory) وصنف بذر (seeder) للتعامل مع بيانات إختبارية أثناء التطوير (أي لبذر جدول البيانات ببيانات وهمية لإختبار العمليات) سأحاول شرح الموضوع بإختصار وعلى عمود واحد هو name، بإمكانك بعد ذلك تخصيص العمليات وإضافة الحقول التي تريدها بشكل كامل: 1 - إنشاء الملفات والأصناف، يمكنك هنا إستخدام أوامر artisan لهذا الأمر: php artisan make:model Student -mcsf الأمر السابق لإنشاء نموذج سميناه Student، و مررنا له الخيارات m وتعني migration و c تعني controller و s تعني seeder و f تعني factory. 2 - إنشاء مسار resource في ملف web.php: use App\Http\Controllers\StudentController; Route::resource('students', StudentController::class); السطر السابق سيمكننا من تعريف 7 مسارات كاملة ويُعطي لكل واحد منها إسم: /students -> name: students.index (GET) - controller method: index /students -> name: students.store (POST) - controller method: store /students/create -> name: students.create (GET) - controller method: create /students/{student} -> name: students.show (GET) - controller method: show /students/{student} -> name: students.update (PATCH) - controller method: update /students/{student} -> name: students.destroy (DELETE) - controller method: destroy /students/{student}/edit -> name: students.edit (GET) - controller method: edit 3 - ملء حقول جدول قاعدة البيانات (students) من خلال ملف التهجير الذي تم إنشاؤه: public function up(): void { Schema::create('students', function (Blueprint $table) { $table->id(); $table->string('name'); // add all fields later $table->timestamps(); }); } 4 - تنفيذ أمر التهجير: php artisan migrate سيقوم الأمر السابق بتهجير الملف السابق (إنشاء جدول students) وملئه بالحقول التي حددناها. 5 - تخصيص صنف المصنع وصنف البذر: من خلال صنف المصنع StudentFactory سنقوم بإضافة الحقل name وإسناد قيمة وهمية له عبر الدالة fake: public function definition(): array { return [ 'name' => fake()->name ]; } ومن خلال صنف البذر StudentSeeder سنستعمل النموذج والتابع factory لإنشاء 100 سجل مثلاً: use App\Models\Student; public function run(): void { Student::factory(100)->create(); } ثم من خلال الملف DatabaseSeeder سنضيف صنف البذر الخاص بالطلاب حتى يتم تنفيذه مع البذر: public function run(): void { $this->call([ StudentSeeder::class ]); } 6 - تنفيذ أمر البذر: php artisan db:seed الآن يُفترض أن تجد جدول الطلاب به 100 سجل. 7 - كتابة المنطق في وظائف المتحكم: <?php namespace App\Http\Controllers; use App\Models\Student; use Illuminate\Http\Request; class StudentController extends Controller { public function index() { $students = Student::latest()->paginate(10); return view('students.index', compact('students')); } public function create() { return view('students.create'); } public function store(Request $request) { $data = $request->validate([ 'name' => 'required|min:5|max:100', ]); Student::create($data); return redirect()->route('students.index') ->with('success', 'Student created successfully.'); } public function show(Student $student) { return view('students.show', compact('student')); } public function edit(Student $student) { return view('students.edit', compact('student')); } public function update(Request $request, Student $student) { $data = $request->validate([ 'name' => 'required|min:5|max:100', ]); $student->update($data); return redirect()->route('students.index') ->with('success', 'Student updated successfully.'); } public function destroy(Student $student) { $student->delete(); return redirect()->route('students.index') ->with('success', 'Student deleted successfully.'); } } 8 - ستحتاج إلى إضافة الحقل name إلى مصفوفة fillable في النموذج Student: protected $fillable = ['name']; 9 - إنشاء العروض (views) الأمر يعتمد على هيكلية ملفات العروض التي لديك وكيف تريد تنظيمها، لكن حسب الشيفرة التي كتبناها في المتحكم يُفترض أن يكون لدينا مجلد بالإسم students بداخل مجلد views وبداخله ملفات العروض (index - create - show - edit)، سأضيف ملف مخطط بالإسم main بداخل مجلد layouts لإستعماله كهيكل لبقية الملفات: views: - layouts: - main.blade.php - students: - create.blade.php - edit.blade.php - index.blade.php - show.blade.php في ملفات العروض ستقوم فقط بعرض البيانات المُرسلة من المتحكم، و ستوجه الروابط والإستمارات إلى المسارات التي أنشأناها، حتى لا يطول الجواب ستجد مُحتوى ملفات العروض والشرح ككل في مستودع github التالي: laravel11-crud يُمكنك بعدها تخصيص الحقول والقالب بالشكل الذي تريد.
  12. كما تعلم فإن الحلقة التكرارية for تتكون من 3 أجزاء رئيسية، أول جزء يُسمى التمهيد و هو يُنفذ مرة واحدة فقط يتم من خلاله تمهيد متغيرات أو غيره، الجزء الثاني هو شرط إنتهاء الحلقة ويتم إختبار الشرط قبل تنفيذ ما بداخل الحلقة و يتم هذا الأمر بإستمرار مع كل تكرار، آخر جزء يتم تنفيذه بعد إنتهاء تنفيذ جسم الحلقة لكل تكرار ونقوم فيه بالغالب بزيادة العداد أو التغيير في قيمة المتغيرات التي تمت تهيأتها في أول جزء. يُمكننا التخلي عن أي جزء من هذه الأجزاء و كتابته قبل أو بداخل الحلقة، لكن يجب المحافظة على هيكلية الحلقة نفسها، يعني لو تخليت عن جزء تعريف الشرط في كتابة الحلقة نفسها ونقلته إلى الجسم كما هو الحال لديك يجب المحافظة على الفواصل المنقوطة كما هي بالشكل التالي: for (let current = 22; ; current+= 1) { if (current % 7 === 0) { console.log(current) break; } } أقصد هذا الجزء: for (let current = 22; ; current+= 1) ^^^ ما قبل الفاصلة المنقوطة الأولى يُمثل الجزء الأول من الحلقة وما بعدها إلى غاية الفاصلة المنقوطة الثانية يُمثل الجزء الثاني ثم يأتي الجزء الثالث والأخير. يُمكنك التخلي عن كل ذلك لكن يجب ترك الفواصل و هذا نفس المثال السابق: let current = 22 for (;;) { if (current % 7 === 0) { console.log(current) break; } current+= 1; } تم نقل جزء التمهيد إلى قبل الحلقة، التعليمة break ستُوقف الحلقة إذا تحقق الشرط، جزء زيادة العداد تم نقله إلى داخل الحلقة ليتم تنفيذه في آخر كل تكرار
  13. قد يتأخر الرد أحياناً من مركز المساعدة وذلك قد يكون بسبب الضغط أو مراجعة للمشاريع أو غير ذلك، وهذا شيء طبيعي يُرجى الإنتظار بعض الوقت وعدم القلق من هذا الأمر. سيتم الرد عليك في أقرب وقت ممكن، شكراً لتفهمك.
  14. يمكنك الإطلاع على الصفحة التالية الامتحان والحصول على الشهادة بها كل شيء يتعلق بموضوع الشهادة و الإمتحان و الخطوات مقتبسة من الصفحة: خطوات الامتحان 1. تواصل معنا أخبرنا برغبتك باجراء الامتحان مع تزويدنا بروابط مشاريعك التي طبقتها أثناء الدورة. يجب أن تكون قد طبقت المشاريع مع المدرب أثناء الدورة، ولا يمكن اجراء امتحان بمشاهدة المحتوى فقط. 2. محادثة صوتية سنحدد لك موعد لاجراء محادثة صوتية لمدة 30 دقيقة يطرح المدرب فيها أسئلة متعلقة بالدورة ويناقش معك ما نفذته خلالها. 3. مشروع التخرج سيحدد لك المدرب مشروعًا مرتبطًا بما تعلمته أثناء الدورة لتنفيذه خلال فترة محددة تتراوح بين أسبوع الى أسبوعين. 4. مراجعة المشروع والتخرج سيراجع المدرب المشروع الذي أنجزته، وإن سارت جميع الخطوات السابقة بشكل صحيح، ستتخرج وتحصل على الشهادة أو يرشدك المدرّب لأماكن القصور ويطلب منك تداركها ثم التواصل من جديد. الشروط التي يجب تحقيقها قبل التقدم للإمتحان: يمكنك التقدم إلى امتحان الدورة، من خلال التواصل مع مركز مساعدة أكاديمية حسوب، مع مراعاة الشروط التالية: إتمام أربعة مسارات تعليمية على الأقل التطبيق العملي مع المدرب، والاحتفاظ بالمشاريع العملية الناتجة لإرسالها للمراجعة رفع المشاريع على حسابك على GitHub أولًا بأول لمشاركتها معنا بالتوفيق.
  15. أطر العمل الشهيرة في PHP والتي من بينها لارافيل تعتمد على ما يُسمى بحاوية الخدمات (Service Container) وهي عبارة عن حاوية يتم ملؤها بكافة الإعتماديات والتبعيات التي يحتاجها إطار العمل للإقلاع وتتم هذه العملية أثناء التمهيد (Bootstrapping)، تعتمد لارافيل كثيراً على مزودي الخدمات (Service Providers) لتحميل الأصناف و الكائنات وغيرها من إعتماديات، وأثناء التنفيذ إذا ما احتاج صنف معين إلى شيء ما يتم جلبه من تلك الحاوية إن كان موجود وإذا لم يكن كذلك يتم إنشاؤه و الإحتفاظ به في الحاوية لجلبه عند الطلب مرة أخرى. في الرابط التالي: DefaultProviders ستجد كل مزودي الخدمات الإفتراضية التي يستعملها إطار العمل، كل مزود خدمة به تابع register يقوم بتسجيل الخدمة التي يقدمها في حاوية الخدمات، أثناء عملية التمهيد يتم المرور عليها كلها وتنفيذ التابع register لتسجيل تلك الإعتماديات. بعد تسجيل مزود الخدمة يتم أيضًا إستدعاء التابع boot يُمكنك الإطلاع على المقال التالي للمزيد من المعلومات: مُعظم الحزم الشهيرة بها مزود خدمة يتم تسجيله بعد تثبيت الحزمة و هنا مثال عن FortifyServiceProvider ، بإمكانك إنشاء مزودو خدمة خاصين بتطبيقك الذي تبنيه، كل ما عليك هو تسجيلهم في الملف providers.php الموجود في مجلد bootstrap أو إستخدام AppServiceProvider الموجود بشكل إفتراضي المفهوم نفسه لم يتغير سواء في لارافيل 11 أو الإصدارات التي قبله، ما تغير هو فقط مكان تسجيل مزودي الخدمات الخاصة بالحزم أو تلك التي تُنشؤها بنفسك، سابقاً كان في ملف app.php بمجلد config و الآن أصبح يتم من خلال الملف providers.php الموجود في مجلد bootstrap. بالنسبة للحزم التي تقوم بتثبيتها يُفترض أن عملية التسجيل ستتم بشكل تلقائي أما إذا أنشأت مزود خدمة بنفسك فستسجله بنفسك وذلك فقط بإضافته إلى المصفوفة في الملف. ستجد في المساهمة التالية مثال عن الإستخدام لإنشاء نظام صلاحيات و أدوار:
×
×
  • أضف...