-
المساهمات
3552 -
تاريخ الانضمام
-
تاريخ آخر زيارة
-
عدد الأيام التي تصدر بها
34
نوع المحتوى
ريادة الأعمال
البرمجة
التصميم
DevOps
التسويق والمبيعات
العمل الحر
البرامج والتطبيقات
آخر التحديثات
قصص نجاح
أسئلة وأجوبة
كتب
دورات
كل منشورات العضو سمير عبود
-
السبب أنك تقومين بالإشارة إلى جدول لم يتم إنشاؤه بعد فملف التهجير genders موجود في الترتيب بعد ملف people فلحل المُشكل قومي بتغيير إسم ملف التهجير لجدول genders ليكون قبل people مثلاً بهذا الإسم: 2021_06_01_095234_create_genders_table.php بعد ذلك في ملف people قومي بتغيير: $table->increments('id'); إلى: $table->id(); حتى يتم إستخدام نفس النوع لحقول المفاتيح الأولية و حتى لا تحدث أخطاء مستقبلية بسبب النوع. بعد ذلك يُمكنك إعادة تنفيذ أمر التهجير: php artisan migrate:fresh
-
الخطأ المُرفق ليس لنفس الملف بل لمشروع آخر، أيضاً هل بإمكانك توضيح الكيفية التي تقومين بها بإضافة المفتاح الثانوي أعتقد أنك تتبعين طريقة خاطئة.
-
يوفّر Laravel دعم لإنشاء قيود المفاتيح الثانوية، على سبيل المثال لنفرض أننا نريد إضافة مفتاح ثانوي على مُستوى جدول مقالات مرجعه هو المفتاح الأولي في جدول المُستخدمين فإننا نعرّف عمود user_id على جدول posts الذي يشير إلى عمود id في جدول users بهذا الشكل: Schema::table('posts', function (Blueprint $table) { // .. $table->unsignedBigInteger('user_id'); $table->foreign('user_id')->references('id')->on('users'); }); ملاحظة يجب أن يكون المفتاح الثانوي و المفتاح الأولي الذي يشير إليه من نفس النوع و في الإصدارات الأخيرة أصبح نوع المفتاح الأولي المستخدم من طرف لارافل هو BigInteger بعكس الإصدارات الأقدم كان Integer. يمكنك تحديد الإجراء المطلوب أيضًا لخصائص "on delete" و"on update" من القيد: $table->foreign('user_id') ->references('id')->on('users') ->onDelete('cascade'); في الإصدار الثامن تم إختصار السطرين أي تعريف الحقل و جعله كمفتاح ثانوي و إضافة القيد بالتالي: Schema::table('posts', function (Blueprint $table) { $table->foreignId('user_id')->constrained(); }); حيث أن التابع foreignId هو إختصار ل unsignedBigInteger بينما constrained هو تابع يُستخدم لتحديد الجدول و العمود الذي سيتم الإشارة إليه. إذا كنت تتبع التسمية user_id فلارافل ستُحدد الجدول المشار إليه من إسم الحقل على أنه users لكن إن لم تتبع العُرف في التسمية و لنفرض أنك أردت تسمية الحقل ب created_by فتحتاج إلى تمرير إسم الجدول كمعامل للتابع constrained بهذا الشكل: Schema::table('posts', function (Blueprint $table) { $table->foreignId('created_by')->constrained("users"); });
-
يُمكنك دائما تتبع طلبات ajax من خلال قسم Network في أدوات المطورين للمتصفح لمعرفة نتيجة الطلب و معرفة سبب المُشكلة. أعتقد أن لديك مُشكلة في كتابة الإستعلام هل يُمكنك تغيير السطر: إلى التالي $result = $conn->query("INSERT INTO supplying_items (name) VALUES ($name)"); كما أنصحك بالإطلاع على: parameterized prepared statements للحماية من ثغرة SQL injection
- 3 اجابة
-
- 1
-
الخطأ الذي أدرجته لا يُسببه هذا السطر: $image=$user->images->first(); فحتى لو لم يكن للمُستخدم أية صورة سيُرجع السطر أعلاه null. أي أن المُتغير image سيحوي null. ما يعني أنك إن أردت الوصول إلى أحد خصائص الغرض image بالشكل التالي: $image['path'] سيُعطي الخطأ المُدرج في السؤال: Trying to access array offset on value of type null أما إن أردت الوصول للخاصية بإعتبار image كائن بهذا الشكل مثلاً: $image->path; سيُعطي الخطأ التالي: Trying to get property 'path' of non-object و في هذه الحالة يُمكنك إستخدام عامل التحقق من القيمة الفارغة Null Coalescing Operator بهذا الشكل مثلاً: $image['path'] ?? "default image path" و هكذا إن كانت هناك صورة سيتم إرجاع مسارها أما إن لم يكن هنالك صورة سيتم إرجاع مسار الصورة الإفتراضية و هذا فقط مثال للتوضيح.
-
المصفوفة fillable ليست إجبارية و إنما يتم إستخدامها في حالة أردنا إتاحة التعيين الجماعي لبعض الحُقول و في هذه الحالة يتم وضع هذه الحقول بداخل هذه المصفوفة. يمكن استخدام التابع create لحفظ سجل جديد في سطر وحيد. لكن قبل القيام بذلك، يجب أن تُعيّن أحد الخاصيات fillable بسبب حماية نماذج Eloquent افتراضيًّا من التعيين الجماعي. لنفترض أنه لديك النموذج User والخاصية name و أردت إنشاء كائن من هذا النموذج ثم تخزينه في قاعدة البيانات فيُمكنك ذلك كالتالي: public function store(Request $request) { // تحقق من الطلب.. $user = new User; $user->name = $request->name; $user->save(); } بهذا الشكل أنت لم تستخدم التعيين الجماعي و في هذه الحالة لست بحاجة لإستخدام المصفوفة fillable. أما إن قمت بالعملية بهذا الشكل: $user = User::create(['name' => 'John Doe']); فسيتم رمي إستثناء من النوع MassAssignmentException و السبب هنا أنك تستخدم التعيين الجماعي و لارافل ستقوم بحمايتك. الآن إن أردت أن تحمي نفسك بنفسك و تُلغي تفعيل حماية لارافل ستستخدم المصفوفة fillable او guarded فالمصفوفة fillable هي بمثابة القائمة البيضاء نضع بها الحقول التي نسمح بتعيينها جماعياً و guarded عكسها. هناك عدة توابع أخرى يُمكن إستعمال التعيين الجماعي معها منها update، firstOrCreate و غيرها ..
- 2 اجابة
-
- 1
-
مرحباً بك، سيتم التواصل معك عبر بريدك الإلكتروني الذي قمت بالإشتراك من خلاله و سيتم إرسال كافة الإرشادات اللازمة لك التي من خلالها تتمكن من الإلتحاق بالدورة، لمعلومات أكثر يٌمكنك التواصل مع الدعم الفني من خلال مركز المساعدة من: مركز مساعدة أكاديمية حسوب
-
يُمكنك إستخدام الأفكار التالية لإنشاء البرنامج: لطباعة جملة نستخدم التعليمة System.out.println فمثلاً لسؤال المستخدم عن إسمه يُمكننا إستخدام: System.out.println("Enter your name: "); لإستقبال مُدخلات من المُستخدم نستعمل الحزمة Scanner نقوم بإستيرادها: import java.util.Scanner; ثم نُنشئ كائن من الصنف Scanner: Scanner scanner = new Scanner(System.in); الآن إذا أردنا إستقبال و تخزين إسم المستخدم نقوم بالتالي بعد سؤاله: Scanner scanner = new Scanner(System.in); System.out.println("Enter your name: "); String name = scanner.nextLine(); و هنا عند تشغيل البرنامج سيتم طباعة الجملة و الإنتظار لحين إدخال أي شيء من طرف المُستخدم و الضغط على enter تُخزن في المُتغير name. بعد ذلك يُمكننا سؤال المُستخدم عن عمره و إستقبال المُدخلات في مُتغير: System.out.println("Enter your age: "); int ageInYears = scanner.nextInt(); الآن بما أنه لديك كافة البيانات لحساب العُمر بأي وحدة فمثلاً العُمر بالاشهر هو حاصل ضرب العمر بالسنوات في 12: int ageInMonths = ageInYears * 12; و العمر بالأيام هو حاصل ضرب العمر بالسنوات في 365 لأن السنة بها 365 يوم: int ageInDays = ageInYears * 365; و العمر بالساعات هو حاصل ضرب العمر بالأيام في 24 بعد الحساب يُمكنك الطباعة بأي شكل تريدين: System.out.println("Hello " + name + "\nYour Age in:\nYears: " + ageInYears + "\nMonths: " + ageInMonths + "\nDays: " + ageInDays + "\nHours: " + ageInHours );
- 8 اجابة
-
- 2
-
المطلوب هو إن كان عدد تكرار الحرف e محصور بين 1 و 3 ترجع الدالة true بينما في الحالة المعاكسة ترجع الدالة false. هناك عدة طرق لمعرفة تكرار حرف ما داخل سلسلة نصية من بينها إستخدام الدالة split التي تقسم السلسلة إلى عناصر حسب محدد و ترجع مصفوفة بهذه العناصر. مثلا: "str1,str2,str3,str4".split(","); // ["str1", "str2", "str3", "str4"] فبالتالي إن أردنا معرفة تكرار الفاصلة في السلسلة أعلاه نقوم بتقسيمها على حسب الفاصلة، ينتج لدينا مصفوفة نحسب عناصرها و ننقص واحد لإرجاع كم مرة تكررت الفاصلة: "str1,str2,str3,str4".split(",").length - 1; // 3 بالتالي نستخدم القاعدة أعلاه لإنشاء الدالة stringE: function stringE(str) { count = str.split("e").length - 1; if (count >= 1 && count <= 3) return true; return false; }
- 3 اجابة
-
- 1
-
يُمكنك إستخدام المكتبة التالية: natsort فبعد تثبيتها يُمكنك إستخدامها بالشكل التالي: from natsort import os_sorted x = ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9'] print(os_sorted(x)) و الخرج سيكون كالتالي: ['elm0', 'elm1', 'Elm2', 'elm9', 'elm10', 'Elm11', 'Elm12', 'elm13'] كما أنه بإمكانك إنشاء دالة تقوم بما تريد بإستعمال التعابير النمطية و دوال lambda كالتالي: import re def natural_sort(l): convert = lambda text: int(text) if text.isdigit() else text.lower() alphanum_key = lambda key: [ convert(c) for c in re.split('([0-9]+)', key) ] return sorted(l, key = alphanum_key) x = ['Elm11', 'Elm12', 'Elm2', 'elm0', 'elm1', 'elm10', 'elm13', 'elm9'] print(natural_sort(x)) و ستحصل على نفس النتيجة أيضاً.
- 2 اجابة
-
- 2
-
أنت كمطور واجهات ليس عليك أن تكون مصمم فالمصمم هو الذي سيختار الألوان و يحدد تموضع العناصر في التصميم و إنما مهمتك هي تحويل التصميم إلى صفحات ويب متجاوبة سواء كان التصميم صورة أو psd يجب عليك إحترام الألوان الموجودة في التصميم و أهم شيء هو البحث في الانترنت فمثلاً إن أردت البحث عن قوالب psd مجانية لتقليدها و اكتساب خبرة يُمكنك البحث عن: free psd landing page template أو أي شيء يوضح ما تبحث عنه و سيُرشح لك محرك البحث العديد من المواقع التي توفر لك مثل هذه القوالب المجانية. لم أفهم هذا الجزء فالعميل في هذه الحالة لم يطلب منك أن تُصمم الصفحة و إنما هو مجال عملك على ما أعتقد فتحويل psd إلى صفحة ويب أو تحويل تصميم موجود على صورة لا يختلفان عن بعضهما كثيراً. إن كنت لا تعرف ماهي الألوان التي يجب إستخدامها يُمكنك إستخدام إضافة ColorZilla فهي تسمح لك بإلتقاط اللون من على صفحة ويب يُمكنك إضافتها لكروم أو موزيلا فهي موجودة. كما أني أنصحك بأخذ أحد التصاميم الموجودة في مسار خمس صفحات هبوط و حاول تقليدها بنفسك دون الإستعانة بالدروس أو المدرب. إستخدم أحد أطر العمل الخاصة ب css لأنه سيُساعدك كثيراً في إنجاز العمل. إن أردت زيادة و تعلم مهارات التصميم فيُمكنك الإطلاع على الأسئلة في قسم التصميم أو طرح سؤالك في هذا الموضوع هناك حيث ستجد أصحاب خبرة و محترفين في التصميم لتقديم النصح لك.
-
تتم الوراثة في بايثون عن طريق تمرير الصنف الأب إلى الصنف الإبن كمعامل على هذا الشكل: class BaseClass: Body of base class class DerivedClass(BaseClass): Body of derived class حيث أن BaseClass هو الصنف الأب و DerivedClass هو الصنف الإب. أنصحك بالإطلاع و قراءة هذا الكتاب لأن به كل ما تحتاجين له: البرمجة بلغة بايثون 1.0.0
-
يتم الأمر بإستخدام لغة css تقوم بإنشاء ملف تنسيقات و تضيف له الخط عن طريق الخاصية font-face: @font-face { font-family: 'Cairo'; src: url('fonts/Cairo-Regular.ttf'); } ثم تقوم بتطبيقه على العناصر التي تريد: .label { -fx-font-family: 'Cairo'; -fx-font-size: 50; } .button .text { -fx-font-family: 'Cairo'; } بعد ذلك تستدعي و تُطبق التنسيقات على ال scene: scene.getStylesheets().add(getClass().getResource("resources/style.css").toExternalForm()); المثال موجود على مستودع github من خلال هذا الرابط: JavaFx Font Test Application و هذه النتيجة استخدمت خط Cairo:
-
انا فقط اعطيتك رؤوس أقلام و ماهي الطرق المتاحة فمثلا الوقت الذي ستقضيه في بناء تطبيقين ios و اندرويد باللغات الأم ( java و swift ) أكبر من إنشائك للتطبيقين بكود base واحد، فهناك عدة عوامل للإختيار و في الأخير يعتمد الأمر عليك فأنت وحدك من يختار الأنسب و الأفضل لك. خذ كامل وقتك في دراسة الطرق و الأساليب المتاحة و الفروقات بينها بعد ذلك حدد هدفك و ابدأ في التعلم و لا تنتقل من تقنية إلى اخرى دون إتقان ما بين يديك و إنشاء مشاريع فعلية. لنفترض أنك إطلعت على عدة مقالات و درست الطرق الموجودة و في الأخير قررت ان تبرمج التطبيقات على منصة flutter فلا تتعلم جزء من الأساسيات ثم تنتقل إلى تقنية أخرى، بما أنك قررت ان تبرمج على منصة flutter فأكمل الطريق حتى تبرمج تطبيقات كبيرة او متوسطة الحجم و ترفعها على متاجر التطبيقات و لا تستمع إلى الأقاويل التي تشتت المتعلم ان التقنية الفلانية افضل من تقنية أخرى. ادرس الميزات و الفروقات من البداية و حدد الأفضل لك ثم إبدأ. بالتوفيق
-
ستجد في هذا الدليل كل ما تبحث عنه لأنه سيضعك في بداية الطريق: بعد إختيار مجالك الذي تريد أن تتعلمه ستتضح لك الرؤية. في برمجة تطبيقات الهاتف هناك عدة خيارات بالنسبة لك: فإن أردت إنشاء تطبيقات أصيلة لنظام ios عليك تعلم لغة swift، أما إن أردت إنشاء تطبيقات أصيلة لنظام اندرويد فعليك تعلم لغة جافا (Java) أو لغة كوتلن (Kotlin). لكن في هذه الحالة إن أردت إنشاء تطبيق للمنصتين معاً تحتاج إلى مشروعين مختلفين تطبيقين بأكواد مختلفة. و من هنا جاءت فكرة التطبيقات الهجينة بإستعمال منصة كوردوفا و منصة ionic التي تسمح لك بإنشاء تطبيقين للمنصتين إنطلاقاً من كود و مشروع واحد. لكن أداء هذه التطبيقات مقارنة بالتطبيقات الأصيلة ضعيف. و في السنوات الأخيرة ظهرت فكرة التطبيقات المترجمة ( compiled apps ) الفكرة هنا أنك تبني التطبيق الخاص بك بإستعمال أحد المنصات مثل flutter او react native او غيرها و عند بناء التطبيق لتحويله إلى تطبيق ios او اندرويد يتم ترجمة الكود من لغة المنصة إلى native code أي إلى جافا أو كوتلن في حالة أندرويد و إلى سويفت في حالة ios. قبل البدأ بالتعلم و الخوض في أي مجال إطلع و أدرس الفروقات من خلال البحث عن مقالات تشرح هذه المجالات ثم حدد خيارك و إبدأ التعلم.
-
sass تم إجراء بعض التعديلات عليها في الإصدارات الحديثة يُمكنك تلافي المشكلة بالتعديل على ملف package.json الموافق للمشروع في إصدار الحزمة: "sass": "1.32.13", ثم إعادة تنفيذ: npm install && npm run dev
- 2 اجابة
-
- 2
-
في ملف jetstream.php الخاص بالإعدادات تجد أن jetstream يستخدم: 'profile_photo_disk' => 'public', و إذا ذهبنا إلى ملف الإعدادات الخاص ب filesystem نجد: <?php 'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ], اي أن ال disk public يعتمد على الثابت: APP_URL في ملف env. و يعتمد على الوصلة التي يتم إنشاؤها بين مُجلد storage و مُجلد public لذلك عليك الإنتباه لهذا الأمر: فأولا قم بإنشاء الوصلة عن طريق الأمر: php artisan storage:link بعد ذلك إن كنت تتصفح المشروع عن طريق: http://127.0.0.1:8000 عليك تعديل قيمة APP_URL بهذا الشكل: APP_URL=http://127.0.0.1:8000 و بهذا الشكل ستظهر الصور بشكل طبيعي، أما إن كنت تستخدم خادم وهمي بالرابط التالي مثلاً: http://blog.test تحتاج إلى وضع ذلك الرابط في APP_URL بنفس الطريقة: APP_URL=http://blog.test و في هذه الحالة ستظهر الصور أيضاً.
-
نعم يوجد بعض الإستضافات المجانية لكن مشكلتها أنها تكون محدودة الموارد و غالباً لا يتم إستعمالها في مرحلة الإنتاج، بل فقط لإختبار ميزات التطبيق او المشروع من طرف العميل أو في مرحلة التطوير او المشاريع الشخصية و ليس التجارية، إن أردت البحث عن بعضها يُمكنك ذلك من خلال محرك البحث و سيُرشح لك بعضها من خلال بعض المقالات، عُموما أنا أستعمل منصة هيروكو (Heroku) فهي تتيح لك نشر 5 تطبيقات على ما أعتقد في الخطة المجانية. وقد تم نشر درس لعملية ال deploy على هذه المنصة في أحد المسارات التطبيقية لدورة php.
- 4 اجابة
-
- 1
-
إسمه معامل الشرط الثلاثي او ternary operator و هو موجود في معظم لغات البرمجة على ما أعتقد، في المثال الذي أرفقته فإننا نفحص حالة المشروع إن كانت تساوي واحد فإننا نعرض كلمة مكتمل أما في الحالة المعاكسة فإننا لا نعرض شيء. و هذا شرحه في موسوعة حسوب الخاص بلغة جافاسكربت و نفس الشيء في لغة php: المعامل الشرطي في JavaScript كما أنه يوجد له شرح في أحد دروس دورة php في مسار الأساسيات: العامل الثلاثي Ternary Operator
- 2 اجابة
-
- 2
-
يُمكنك التوجه إلى مركز المساعدة و شرح المشكلة لهم و سيوجهونك إلى الدورة التي ترغب الإشتراك فيها.
-
بالطبع بإمكانك ذلك لأنه يوجد علاقة بين النموذج Role و النموذج Permission فمثلاً إذا كان لديك: $admin = Role::where('name', 'admin')->first(); يُمكنك الحصول على الصلاحيات المُتاحة لهذا الدور عن طريق العلاقة permissions: $admin = Role::where('name', 'admin')->first(); $adminPermissions = $admin->permissions; dd($adminPermissions); و بما أنه توجد علاقة فيُمكنك عمل أي شيء تريده مثلاً إذا أردت جلب كل الأدوار و تحميل الصلاحيات بشكل حثيث يُمكنك ذلك من خلال: $roles = Role::whereRoleNot(['super_admin', 'admin', 'user']) ->whenSearch(\request('search')) ->with(['permissions']) ->withCount('users') ->paginate(5); و في صفحة العرض و أنت تقوم بعرض الأدوار يُمكنك عمل حلقة لصلاحيات الدور: @foreach($roles as $role) ... @foreach($role->permissions as $permission) ... @endforeach @endforeach
- 4 اجابة
-
- 1
-
بإمكانك تخصيص تطبيق الطبقات الوسيطة (middlewares) في المتحكم و ذلك في الباني الخاص به مثال: <?php class DiscountController extends Controller { public function __construct() { $this->middleware('permission:read discount codes')->only('index'); $this->middleware('permission:add discount code')->only(['create', 'store']); $this->middleware('permission:edit discount code')->only(['edit', 'update']); $this->middleware('permission:delete discount code')->only('destroy'); } } مثلاً أنت تريد تطبيق الmiddleware auth على index فقط فتقوم بالتالي: $this->middleware('auth')->only('index'); و إن كنت تريد تطبيق أكثر من middleware على نفس التابع يُمكنك تمريرها على شكل مصفوفة: $this->middleware(['auth', 'middl2'])->only('index'); بطريقة عكسية للتابع only هناك تابع آخر يُسمى except و هو يعمل بعكس only.
- 2 اجابة
-
- 2