-
المساهمات
3558 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
34
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو سمير عبود
-
بالطبع جواب هذا السؤال يعتمد عليك بالدرجة الأولى فكل إنسان لديه قدرة إستيعاب مُحددة خصوصاً في تعلم أشياء جديدة، لذلك لا تقيس الأمر بعدد الفيديوهات. بما أنه لديك وقت كافي في اليوم فأنصحك بالتعلم في الوقت الذي يكون ذهنك صافي و لديه قابلية لإستقطاب معلومات جديدة. و قم بتنظيم مسار التعلم الخاص بك، يُمكنك مثلا تعلم 4 ساعات يومياً و تُقسمها بالشكل الذي تريده على اليوم و تقوم بممارسة نشاطاتك الأخرى كممارسة رياضة او هواية أخرى تحبها و أهم شيء الإستمرارية في الخطة التي وضعتها لنفسك و الأهم من ذلك لا تُقيد نفسك بتاريخ مُحدد لتعلم شيء، أيضاً أهم شيء في البرمجة هو التطبيق العملي، كلما طبقت أكثر كلما تطور مُستواك. بالتوفيق.
- 2 اجابة
-
- 1
-
-
ليس عليك مشاهدة دروس أرشيف المسارات الأقدم، لأن هذه المسارات تم تعويضها بمسارات جديدة بإستخدام تقنيات أحدث و مكتبات بإصدارات أحدث كما هو الحال في مسار تطوير المتجر الإلكتروني في المسار القديم كنا نستخدم تقنية gulp بإصدار قديم في عملية أتمتة المهام أما في المسار المُحدث تم إستخدام تقنية webpack ، نفس المُلاحظة بخصوص مسار تطوير واجهة مُستخدم تُشبه موقع يوتيوب و مسار بناء لوحة التحكم، على العموم لست بحاجة لمُتابعة تلك الدروس و إنما يُمكنك الإكتفاء بالمسارات الجديدة فقط و هذا ليس في دورة تطوير واجهات المستخدم فقط و إنما في كل الدورات. و هذا هو الحال في دورات أكاديمية حسوب تُحدث بإستمرار حيث تُضاف مسارات جديدة أو يتم تحديث مسارات كانت موجودة بإستعمال تقنيات حديثة لمُواكبة التطور.
- 2 اجابة
-
- 1
-
-
هذا يعني أن التطبيق الذي ستبنيه يجب أن يدعم تعدد اللغات و من بين اللغات التي يجب أن يدعمها العربية و الإنجليزية، سيكون من الأفضل تسهيل إضافة أي لغة جديدة للتطبيق الذي ستبنيه بغض النظر عن ماهية التطبيق او التقنيات المستخدمة لبنائه.
-
يحتوي Jetstream على خاصية رفع صور الملف الشخصي مضمنة ويحتوي على الإعدادات الافتراضية المدرجة بالفعل. إذا كنت تريد أن تعمل هذه الخاصية عند التسجيل ، فيمكنك استدعاء الوظيفة المضمنة بعد استدعاء: $this->createTeam($user) أو قبلها مباشرة. ما عليك سوى القيام بذلك بعد إنشاء المستخدم حتى تتمكن من استخدام التابع updateProfilePhoto: return DB::transaction(function () use ($input) { return tap(User::create([ 'name' => $input['name'], 'email' => $input['email'], 'password' => Hash::make($input['password']), ]), function (User $user) { $this->createTeam($user); if (isset($input['image'])) { $user->updateProfilePhoto($input['image']); } }); }); هذه هي الطريقة التي يقوم Fortify بتنفيذها في صنف UpdateUserProfileInformation ، يمكنك إلقاء نظرة على هذا الصنف في app/Actions/Fortify. لا تنسى إضافة جزء التحقق من الصورة في : <?php Validator::make($input, [ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users'], 'image' => ['nullable', 'mimes:jpg,jpeg,png', 'max:1024'], 'password' => $this->passwordRules(), 'terms' => Jetstream::hasTermsAndPrivacyPolicyFeature() ? ['required', 'accepted'] : '', ])->validate(); و إضافة حقل الصورة لإستمارة التسجيل.
- 1 جواب
-
- 1
-
-
بما أنك تستخدم النسخة 6 من Laravel mix فهناك بعض الإختلافات في ملف الإعدادت و لمعرفة كيفية الترقية لهذا الإصدار تستطيع ذلك من هنا لا داعي لتثبيت مُحمل vue بالرغم من أن الخطأ ينص على ذلك، بدلاً من ذلك تحتاج إلى إخبار mix أن تدعم vue بشكل صريح و يُمكنك ذلك من خلال: mix.js('resources/js/app.js', 'public/js') .vue() .postCss('resources/css/app.css', 'public/css', [ // ]); او الخيار الثاني إذا كنت تريد استخراج التنسيقات أيضًا mix.js('resources/js/app.js', 'public/js') .vue({ extractStyles: true, globalStyles: false }) .postCss('resources/css/app.css', 'public/css', [ // ]);
-
بدل السطر التالي: ->addSelect( DB::raw('date_add(formations.date_fin, interval formations.duree_validite month) as date_recyclage')) إستخدم: ->selectRaw( 'alertes.*, date_add(formations.date_fin, interval formations.duree_validite month) as date_recyclage') السبب في ذلك أنك تستطيع استخدام التابع addSelect إن كان لديك نسخة منشئ استعلامات مسبقًا ورغبت في إضافة عمود آخر لأعمدة Select الحالي لكنه ليس لديك select لذلك فالناتج هو عمود واحد فقط. و في هذه الحالة يُمكن استخدام طريقة selectRaw بدلاً من addSelect (DB :: raw (...)).
- 1 جواب
-
- 1
-
-
لا يُمكن نشر مقال بدون صلاحية لفعل ذلك، تجدين في هذه الصفحة: أكتب معنا كافة الإرشادات و الإجراءات اللازمة لكيفية المساهمة في نشر المقالات، فشركة حسوب تنشر بإستمرار على منصة مستقل مشاريع لكتابة و ترجمة مقالات للأكاديمية إن كنتِ مهتمة بذلك يُمكنك متابعة هذه المشاريع و التقديم عليها و إن وجدو أنك شخص مُناسب لتلك المهمة أو المشروع سيتواصلون معك، بالتوفيق.
-
أحد الطرق المُمكنة لتحقيق ذلك هي إستخدام نطاق خاص في النموذج User بالشكل التالي: protected $fields = ['id','pseudo','email']; // add all fields from your table public function scopeExclude($query, $excludes = []) { return $query->select(array_diff($this->fields, (array) $excludes)); } ثم في المُتحكم يُمكنك عمل: <?php $users = User::where([ ['gender', '=', 'M'], ['is_active', '=', 1], ])->exclude(['pseudo', 'email', 'created_at']) ->toArray();
- 3 اجابة
-
- 1
-
-
مرحباً مها، في الحالات العادية بعد إنهاء الطالب كافة مسارات الدورة يقوم بالتقديم على الإمتحان من خلال التواصل مع فريق الدعم عن طريق فتح تذكرة عبر مركز المساعدة لحجز موعد لإجراء الإمتحان، لكل بخصوص طلبة منحة البنك الدولي لم يتم إعلامنا بالإجراءات لا ندري هل سيتبعون نفس الإجراءات أم إجراءات أخرى، حالياً عليك التركيز في فهم مسارات الدورة و بعد ذلك لكل حادث حديث تأكدي أنه يُمكنك في أي وقت التواصل مع فريق الدعم و سيوضحون لك أي شيئ ترغبين به. بالتوفيق.
- 2 اجابة
-
- 1
-
-
يبدو أنك تستدعي الدالة published في مكان آخر في الكود، لأن دالة ال scope هي available لكن في هذا الكود أنت تُطبق الدالة available على النموذج Department في حين أن الدالة تم تعريفها في النموذج User: هناك عدة حلول للمشكلة منها أن تقوم بالتالي: $departments = Department::with(['users' => function ($q) { $q->available(); }])->get(); أو إنشاء دالة في النموذج Department: public function availableUsers() { return $this->users()->available(); } كما يجب عليك تعديل العلاقة في النموذج Department: من: public function departments() { return $this->HasMany('User'); } إلى: public function users() { return $this->hasMany(User::class); } بعد ذلك عند الإستعلام تقوم بالتالي: $departments = Department::with('availableUsers')->get(); كما يُمكنك بالطبع نقل ال scope إلى النموذح Department بهذا الشكل: public function scopeAvailable($query) { return $query->whereHas('users', function ($q) { return $q->where('available', 1); }); } ثم يُمكنك إستخدامه بنفس الطريقة: $departments = Department::available() ->with('users') ->get();
-
بإمكانك إنشاء دالة تقبل المفتاح و القيمة الجديدة بالشكل التالي: public function setEnvironmentValue($envKey, $envValue) { $envFile = app()->environmentFilePath(); $oldValue = env($envKey); if (file_exists($envFile)) { file_put_contents($envFile, str_replace( "{$envKey}={$oldValue}", "{$envKey}={$envValue}", file_get_contents($envFile) )); } } مثال للإستخدام: $this->setEnvironmentValue('APP_ENV', 'production');
- 3 اجابة
-
- 1
-
-
بإمكانك إستخدام التابع withCount لتحقيق ذلك: Hackathon::withCount('participants') ->orderBy('participants_count', 'desc') ->paginate(10); // or ->take(10) إذا كنت تريد جلب العشر الأوائل في الترتيب كما يُمكنك إستخدام join أيضاً كما هو موضح أدناه: $hackathons = Hackathon::leftJoin('hackathon_user','hackathons.id','=','hackathon_user.hackathon_id') ->selectRaw('hackathons.*, count(hackathon_user.hackathon_id) AS `participants_count`') ->groupBy('hackathons.id') ->orderBy('participants_count','DESC') ->paginate(10);
- 1 جواب
-
- 1
-
-
يُمكنك زيادة عُمر الجلسة فالمدة الإفتراضية لإنتهاء الصلاحية هي ساعتان: و التعديل يكون من خلال الملف config/session.php: /* |-------------------------------------------------------------------------- | Session Lifetime |-------------------------------------------------------------------------- | | Here you may specify the number of minutes that you wish the session | to be allowed to remain idle before it expires. If you want them | to immediately expire on the browser closing, set that option. | */ 'lifetime' => env('SESSION_LIFETIME', 120), والوحدة هي الدقيقة يُمكنك تغييرها إلى 6 ساعات أو يوم بالشكل التالي: 'lifetime' => env('SESSION_LIFETIME', 360), // 6 ساعات // أو 'lifetime' => env('SESSION_LIFETIME', 60 * 24), // يوم أو من خلال ملف env. SESSION_LIFETIME=360
- 3 اجابة
-
- 1
-
-
لطباعة الإستعلام يُمكنك إستخدام أحد الطرق التالية: التابع toSql: <?php $query = User::select("*")->toSql(); dd($query); الخرج: select * from `users` أما إذا أردت إستخدام DB::getQueryLog فتحتاج إلى تفعيل الخاصية لأنها تكون غير مُفعلة إفتراضياً: <?php use App\Models\User; use DB; DB::enableQueryLog(); $users = User::select("*")->get(); $quries = DB::getQueryLog(); dd($quries); الخرج: array:1 [▼ 0 => array:3 [▼ "query" => "select * from `users`" "bindings" => [] "time" => 4.25 ] ]
-
يمكنك استخدام Rule :: unique لتحقيق قاعدة التحقق الخاصة بك: <?php $messages = [ 'data.ip.unique' => 'Given ip and hostname are not unique', ]; Validator::make($data, [ 'data.ip' => [ 'required', Rule::unique('servers')->where(function ($query) use($ip,$hostname) { return $query->where('ip', $ip) ->where('hostname', $hostname); }), ], ], $messages); أو بهذا الشكل في الإصدارات الجديدة <?php $request->validate([ 'ip' => [ 'required', Rule::unique('servers')->where(function ($query) use($ip,$hostname) { return $query->where('ip', $ip) ->where('hostname', $hostname); }), ], ]); أو إنشاء صنف request جديد ثم تضع القواعد بنفس الطريقة أعلاه.
- 2 اجابة
-
- 1
-
-
يمكنك تعديل المسار الذي تُعيده الدالة public_path من خلال الملف index.php الموجود في مجلد public بهذا الشكل: <?php $app->bind('path.public', function() { return __DIR__; }); حيث سيقترن المسار الذي تُعيده الدالة public_path بمسار المُجلد الحاوي للملف index.php.
- 2 اجابة
-
- 1
-
-
أثناء عملية التحديث تحتاج إلى تجاهل السجل الحالي الذي تقوم بتحديثه بخصوص القاعدة unique حتى لا يتم إحتسابه و ذلك من خلال إضافة مُعرف السجل للقاعدة بهذا الشكل: $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email,' . $user->id], 'username' => ['required', 'string', 'alpha_dash', 'max:190', 'unique:users,username,' . $user->id], ]); او بهذا الشكل: $request->validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', Rule::unique('users','email')->ignore($user->id)], 'username' => ['required', 'string', 'alpha_dash', 'max:190', Rule::unique('users','username')->ignore($user->id)], ]); و الآن ستتمكن من تطبيق القاعدة unique بدون أية مشاكل أثناء التحديث.
- 3 اجابة
-
- 1
-
-
السبب في ذلك أن لارافيل يعتمد على التشفير من نوع bcrypt إفتراضيا فحتى لو قمت بتسجيل المُستخدم بإستخدام sha1 عند تسجيل الدخول سيتم مطابقة كلمة المرور بإستخدام bcrypt، تدعم لارافيل ثلاث أنواع من التشفير: "bcrypt", "argon", "argon2id" لإضافة التشفير sha1 و إعتماده يُمكنك إستخدام الطريقة التالية: أولاً ، سننشئ مجلدًا فرعيًا في مجلد app يسمى Libs أو Libaries أو أيًا كان ما تريد تسميته. في هذا المجلد ، قم بإنشاء مجلد يسمى CustomHash حيث نقوم بتخزين جميع أنواع التشفير الخاصة بك فيه. يعتمد Namespace على أسماء المجلدات التي اخترتها. تقوم بإنشاء صنف Sha1Hasher داخل المُجلد الذي أنشأته و ترث من الصنف AbstractHasher و تُطبق الواجهة: HasherContract: <?php namespace App\Libs\CustomHash; use Illuminate\Contracts\Hashing\Hasher as HasherContract; use Illuminate\Hashing\AbstractHasher; class Sha1Hasher extends AbstractHasher implements HasherContract { public function make($value, array $options = array()) { return sha1($value); } public function check($value, $hashedValue, array $options = array()) { return $this->make($value) === $hashedValue; } public function needsRehash($hashedValue, array $options = array()) { return false; } } من خلال مزود الخدمة AppServiceProvider نقوم بعمل extent للكلاس Hash في الدالة boot: Hash::extend("sha1", function($app) { return new Sha1Hasher(); }); و لا تنسى إستدعاء الكلاس فوق: use App\Libs\CustomHash\Sha1Hasher; بعد ذلك تحتاج إلى تعديل نوع التشفير من bcrypt إلى sha1 من خلال config/hashing.php: 'driver' => 'sha1',
- 2 اجابة
-
- 1
-
-
يتم استخدام رمز النجمة (*) للتحقق من القيم في المصفوفة ، وليس المصفوفة نفسها. $validator = Validator::make($request->all(), [ "names" => "required|array|min:3", "names.*" => "required|string|distinct|min:3", "description" => "required|string" ]); في المثال أعلاه: "names" يجب أن تكون مصفوفة تحتوي على 3 عناصر على الأقل ، يجب أن تكون القيم في مصفوفة "names" عبارة عن سلاسل مميزة (فريدة) ، بطول 3 أحرف على الأقل. ملاحظة: منذ Laravel 5.5 يمكنك استدعاء التابع validate مباشرة على كائن Request مثل: $data = $request->validate([ "names" => "required|array|min:3", "names.*" => "required|string|distinct|min:3", "description" => "required|string" ]);
- 3 اجابة
-
- 1
-
-
أولاً اقرأ التحذير! يقول لا تقم بتشغيل composer كجذر! ثانيًا ، من المحتمل أنك تستخدم Xammp على موقعك المحلي الذي يحتوي على مكتبات php المطلوبة بشكل افتراضي. ولكن في الخادم الخاص بك لا يوجد مكتبة ext-dom. يحتوي php-xml على جميع الحزم ذات الصلة التي تحتاجها. لذلك ، يمكنك ببساطة تثبيته عن طريق تشغيل: sudo apt-get update sudo apt install php-xml على الأرجح أنك تفتقد mbstring أيضًا على الخادم. إذا تلقيت خطأ بسببها ، فثبّت هذه الحزمة أيضًا باستخدام: sudo apt-get install php-mbstring بعد ذلك قم بتنفيذ: composer update composer require cviebrock/eloquent-sluggable
- 2 اجابة
-
- 1
-
-
يُمكنك إضافة الخاصية التي تريدها في النموذج بإضافة موصل (accessor): public function getAvailabilityAttribute() { return $this->calculateAvailability(); } ثم تضيف الخاصية إلى مصفوفة appends protected $appends = ['availability']; ليُصبح النموذج بهذا الشكل: class EventSession extends Eloquent { protected $table = 'sessions'; protected $appends = ['availability']; public function getAvailabilityAttribute() { return $this->calculateAvailability(); } } و الآن يُمكن الوصول للخاصية عند تحميل النموذج.
- 2 اجابة
-
- 1
-
-
بإمكانك إنشاء تابع جديد في النموذج User بهذا الشكل: public function sortedComments() { return $this->hasMany('Comment')->orderBy('post_id'); } و عند عرض التعليقات تقوم بالتالي: foreach($post->user->sortedComments as $comment) { echo "<li>" . $comment->title . " (" . $comment->post->id . ")</li>"; } أو يُمكنك ترتيب التعليقات في المُتحكم و تمريرها لصفحة العرض: $comments = auth()->user() ->comments() ->orderBy('post_id') ->get(); return view('view.name', compact('comments')); // و في صفحة العرض تقوم بإستخدام المُتغير comments في صفحة العرض: @foreach($comments as $comment) <li>{{ $comment->title }} ({{ $comment->post_id }})</li> @endforeach
- 3 اجابة
-
- 1
-
-
يُمكنك ببساطة إستخدام التابع updateOrCreate في هذه الحالة: $model = RepairItem::find($id); if (!empty($temp = $request->input('option'))) { $model->option() ->updateOrCreate( ['repair_item_id' => $model->id], ['option' => $temp] ); } كما يُمكنك ذلك بهذا الشكل: $model = RepairItem::find($id); if (!empty($temp = $request->input('option'))) { $option = $model->option; if(empty($option)){ $option = $model->option()->create(); } $option->someAttribute = temp; $option->save(); };
- 2 اجابة
-
- 1
-
-
يُمكنك إستخدام التالي : في المتحكم: return redirect()->back()->with('msg', 'your message here'); // او في الإصدارات الحديثة return back()->with('msg', 'your message here'); في صفحة العرض تقوم بالتالي: @if (\Session::has('msg')) <div class="alert alert-success"> <p>{!! \Session::get('msg') !!}</p> </div> @endif أو: @if (session()->has('msg')) <div class="alert alert-success"> <p>{{ session('msg') }}</p> </div> @endif
- 2 اجابة
-
- 1
-