لوحة المتصدرين
المحتوى الأكثر حصولًا على سمعة جيدة
المحتوى الأعلى تقييمًا في 02/08/22 في كل الموقع
-
سنتعلم في هذا المقال كيفية الاستخراج Extrude وتعديل الكائنات في برنامج بلندر Blender، وذلك عبر إنشاء منزل بسيط بدءًا من كتلة واحدة. إليك النتيجة النهائية للمشروع: ستحتاج في هذا المشروع إلى: عتاديات: حاسوب مكتبي أو شخصي قادر على تشغيل برنامج بلندر. برمجيات: برنامج بلندر Blender الإصدار 2.8 (أو أي إصدار أحدث). كما يمكنك الحصول على موارد المشروع ونتيجته النهائية من مستودع GitHub. التعامل مع الرؤوس والحواف والأسطح أغلق الشاشة الافتتاحية لبرنامج بلندر وستلاحظ ظهور مكعب على الشاشة تلقائيًا. لاحظ أنك مهما حركت المكعب باستخدام الفأرة لن يبدو الشكل الحالي مشابهًا للمنزل بعد، وقد يخطر في بالك أن تضيف مخروطًا من علامة تبويب إنشاء Create في شريط الأدوات Toolbox، كما يلي: لكن، لا يزال المجسم بعيدًا كل البعد عن شكل المنزل. لهذا يُفضل تعديل المكعب للحصول على شكل المنزل. بالتالي. حدد المكعب ثم اختر وضع التحرير Edit Mode من القائمة أعلى الزاوية اليسرى. يُتيح لك وضع التحرير إمكانية تعديل كل جزءٍ من المكعب لإعادة تشكيله، وتوجد فيه ثلاثة خيارات هي: تعديل الرؤوس vertices، أو الحواف edges، أو الوجوه faces، وتجدها جميعًا في القائمة العلوية. الرؤوس اختر رمز الرؤوس من القائمة، إذ سيمكّنك من تحديد زوايا المكعب. بعد ذلك اختر أحد زوايا vertex المكعب، وذلك عبر الضغط عليها. اسحب الرأس باستخدام المقابض الزرقاء والخضراء والحمراء، وذلك لإنشاء شكل جديد. تأكد من تحديد أداة النقل move tool من القائمة الموجودة على اليسار إن لم تظهر المقابض. لا تنسى أنه يمكنك التراجع عن التعديلات التي أجريتها على الشكل. وإن لم تعجبك، اضغط على مفتاحي CTRL + Z. الحواف اختر رمز الحوافر الذي يتيح لك إمكانية تحديد حواف المكعب. اضغط على الحافة لتمييزها باللون الأبيض. حرك الحافة باستخدام المقابض الزرقاء والخضراء والحمراء، وذلك لإنشاء شكل جديد، كما يلي: الأسطح اختر رمز الأسطح الذي يتيح لك تحديد أسطح أو أوجه المكعب. بعد ذلك اختر أحد أسطح المكعب، وذلك عبر الضغط عليها. حرك السطح باستخدام المقابض الزرقاء والخضراء والحمراء، وذلك لإنشاء شكل جديد، كما يلي: ثم تراجع عن التعديات التي أجريتها بالضغط مرارًا على مفتاحي CTRL + Z، وذلك حتى تحصل على شكل المكعب الأصلي. إنشاء نصف سقف سننشئ أولًا نصف السقف، ثم ننشىء النصف الآخر. لهذا ابدأ بتحديد إحدى الحواف، وذلك باختيار أداة الحواف من القائمة العلوية. اضغط الآن على الحافة العلوية اليمنى للمكعب. ثم اسحبها للأعلى باستخدام المقبض الأزرق، كما يلي: وبذلك نكون قد حصلنا على نصف منزل ذو حافة مرتفعة للأعلى، ولازلنا بحاجة النصف الآخر، وسنستخدم لذلك أداة الاستخراج أو "التمديد" Extrude لإكمال الشكل، لأن المكعب قد أدى وظيفته. الاستخراج اختر أداة الأسطح من القائمة العلوية. ثم اضغط على الوجه الأيمن الخارجي للمكعب لتحديده. اضغط على منطقة الاستخراج Extrude Region من قائمة الأدوات الموجودة على اليسار. اضغط باستمرار على علامة الزائد واسحبها باستخدام الفأرة لاستخراج السطح، استمر بالسحب حتى تحصل على الشكل الذي تريده. إنشاء النصف الآخر من السقف اختر أداة الحواف من القائمة العلوية. اضغط الآن على الحافة العلوية اليمنى للمكعب. ثم اختر أداة التحريك move tool، واسحب الحافة العليا نحو الأسفل إلى مستوى نظيرتها في الطرف الآخر لتحصل على شكل متناظر في كلا الجانبين ويبدو شبيهًا بالمنزل. قد لا يبدو المنزل متناسقًا حتى الآن، لهذا مهمتك الآن هي تحسين مظهره، إذ يمكنك توظيف ما تعلمناه في صنع نماذج معقدة. تحدي تلوين المنزل تحدى نفسك واختبر مهاراتك عبر تلوين المنزل لتحصل على نتيجة مشابهة لما يلي: اختر أحد الأسطح وأضف له مادة Material لتتمكن من تلوينه وذلك باتباع الخطوات التالية: انقر على نافذة خصائص المواد Material Properties الموجودة على يمين الشاشة، ثم اضغط على رمز الزائد ثم اختر إنشاء مادة جديدة create a New material. اختر لونًا للمادة من مربع اختيار اللون الأساسي Base Color. أخيرًا، حدد المادة ثم اضغط على خيار تعيين Assign لإضافة المادة على السطح. اطلق العنان لمخيلتك وأضف المزيد من الألوان إلى منزلك. ختامًا بهذا تكون قد أتممت مشروعك باستخدام برنامج بلندر. ننصحك بتنفيذ مشاريع إضافية مثل خطوتك التالية لتنمية مهاراتك في العمل على برنامج بلندر. كما تتوفر في قسم التصميم في أكاديمية حسوب عدد من المقالات حول تعليم العمل على برنامج التصميم ثلاثي الأبعاد بلندر. إذا واجهت مشاكل مع برنامج بلندر فيمكنك الحصول على الدعم والمساعدة عبر إضافة سؤالك في قسم الأسئلة والأجوبة في أكاديمية حسوب. ترجمة -وبتصرف- للمقال Block House من الموقع الرسمي لراسبيري باي. اقرأ أيضًا إنشاء نموذج ثلاثي اﻷبعاد لقرد يرتدي قبعة احتفال باستخدام برنامج بلندر بلندر للمبتدئين: كيف تصمّم وتحرّك روبوت - نمذجة الجسم والرأس كيف تصمم وتحرك روبوت: التحريك ومفاتيح التأطير في بلندر بلندر للمبتدئين: كيف تصمّم وتحرّك روبوت - تنسيق التناظر وتصميم الفم1 نقطة
-
اقوم بعمل تسجيل الدخول و اريد ان اخزن cookie لدي مشكلة و هو cookie لا يتم تخزينه لا اعلم لماذا و لا يقوم بارجاع خطأ لكي اعلم ما سبب عدم تخزين cookie حتى .. للتو قمت بالبحث و وجدت ان المشكلة ربما انني لا اقوم بتخزين ال cookie من طرف العميل هل هناك طريقة لفعل ذلك؟ وهل فكرة تخزين ال cookie من طرف العميل طريقة امنة؟. شكرا1 نقطة
-
لدينا في صفحة HTML : <div class="parent"> <div>1</div> <div>2</div> <div>3</div> <div>4</div> </di> و في صفحة CSS : * { box-sizing: border-box; } .parent { background-color: #eee; display: flex; flex-wrap: wrap; gap: 10px; } .parent > div { background-color: red; padding: 10px; flex: 1 100px; } أريد معرفة لماذا عندما أقوم بتصغير عرض الشاشة و أصل للعرض 307px تقريبا يظهر تجاوز للعناصر على المحور الأفقي overflow كالتالي: ألا يفترض أن لا يحدث ذلك كون الحاوية parent مرنة؟ لتجربة الكود : https://codepen.io/Lodlma_45/full/MWOpjoB1 نقطة
-
سلام انا ادرس هندسه حاسوب مرحلى ثانيه وحاب اشترك بواحد من الدورات بس محتار وخايف ادخل بمجال يختلف عن تخصصي ، مارآيكم بدوره علوم الحاسوب وهل لها مستقبل جيد، وشنو ممكن اشتغل مستقبلا بها؟ وهل مكن اشتغل من المنزل ؟؟ لانني ملتزم بدوامي ودراستي والوقت جدا ضيق1 نقطة
-
يمكنك اكتساب أي مهارة إضافية بجانب تخصصك وبما أن تخصصك يتقاطع مع مجال البرمجة سيكون ذلك إضافة جيدة لك، هناك طلب في مجال البرمجة وقلة في العرض والخبرات والمهارات لذا يوجد فرص جيدة لمن يتقن هذا المجال على الأقل في المستقبل القريب. دورة علوم الحاسب ستعرفك على كثير من المفاهيم الأساسية ضمن هذا المجال وستوسع آفاقك للفهم الصحيح ضمن مواضيع عدة وهي تعتبر بداية جيدة للدخول ضمن هذا المجال، يمكنك قراءة المقال التالي: يمكنك العمل بشكل حر من المنزل، لن تكون مضطرًا للالتزام بوقت فقط عليك اكتساب بعض مهارات تنظيم الوقت للموازنة بين الدراسة والالتزام بالعمل، منصات العمل الحر مثل مستقل و خمسات تتيح لك استثمار مهاراتك مع من يحتاجها مع ضمان الطرف الثاني لك، يمكنك الاطلاع على المقال التالي: اشتراكك بأحد دورات أكاديمية حسوب يضمن لك الوصول لمحتوياتها مدى الحياة، وخلال الدورة يوجد دعم من قبل مدربين متخصصين يمكنك تقديم أي استفسار او طرح مشكلة تواجهك وسيقومون بمساعدك، كما أن هناك ضمان لاسترداد مبلغ الدورة من خلال عملك الشخصي خلال 6 أشهر، وفي حال لم ترغب بإكمال الدورة يمكنك الانسحاب منها وإعادة المبلغ المدفوع بعد التواصل مع مركز المساعدة يمكنك القراءة أكثر ضمن صفحة الأسئلة الشائعة1 نقطة
-
لدي مشروع مبني بإستخدام جانغو Django، ولكن بسبب أني أقوم بعمل الكثير من إستعلامات SQL أجد أن المشروع أصيح بطيئًا بعض الشيء، وعند البحث عن حل للمشكلة سمعت عن redis-cache ، ولكن لا أعرف من أين أبدأ في إستخدامه. هل يتم استخدامه كطبقة بين جانغو Django و بين قاعدة البيانات الخاص بي، عن طريق تخزين استعلامات SQL بطريقة أو بأخرى؟ أم أنه من المفترض أن يتم استخدامها مباشرة كقاعدة بيانات بدلًا من MySQL بالكامل؟1 نقطة
-
دورة علوم حاسوب دورة ممهدة لمجال الحاسوب والبرمجة وهي مكان جيد للبدء في طريقك محو التعمق في المجال ويمكنك اعتبارها دورة عامة لذلك هي مناسبة للجميع أما عن ماذا يمكنك ان تشتغل ففي هذا المجال كونك أصبحت متمكن منه فيمكنك ان تشتغل أي شئ لديه علاقة بالحواسب والبرمجة وهذا العمل عادة يكون من امنزل كمتعاقد حر أو في شركة ومجال الحاسوب والبرمجة مجال ذو مستقبل وفرص كثيرة لذا أنصحك به كمجال أساسي لك1 نقطة
-
ماهي افضل الكتب للغة بايتون للمستوى المتوسط ،التي يمكن من خلالها صقل ما تعلمته سابقا وإضافة معلومات جديدة؟1 نقطة
-
اسلام عليكم شباب الي يعرف فيجوال انا عندي مشروع وابي احط ProgressBar مميز بس ابي احمل الحزمة ذي Circular ProgressBar ما يطلعلي وش الحل؟1 نقطة
-
السلام عليكم ورحمة الله وبركاته، في عدة برامج مشابهة لتطبيقي يوجد فيها recyclerview مع اعلان بيني يخرج عندما يضغط المستخدم على الitemview منها ويقوم التطبيق بأظهار الاعلان على كامل الشاشه لعدة ثوان ثم يتحرك الى الصفحة التاليه عندما يغلق المستخدم الاعلان. في تلك التطبيقات هناك خاصية مشابهه لعداد فعندما يضغط المستخدم بشكل عشوائي على الitemviews ثلاث مرات كمثال يقوم بأظهار الاعلان واما اذا ضغط مرة او مرتين لا يظهر الاعلان الكامل - فكيف انا استخدم مثل هذه الخاصية في تطبيقي مع العلم انا استخدم جافا او كوتلن واستخدم Admob لعرض الاعلانات.1 نقطة
-
سلام عليكم ورحمة الله كيف ممكن في php نغير المسار للرابط بحيث لايظهر مسارات المجلدات فقط على سبيل المثال /https://example/1188727590 بدون ماتظهر اسماء المجلدات مثل public وغيرها1 نقطة
-
عند إستعمال save مع commit=False الكائن المُعاد من الدالة لن يُحفظ في قاعدة البيانات عكس الأمر عند إستخدام commit=True الكائن سوف يٌحفظ وبعدها يُعاد. يكون هذا الفعل مٌفيداً عندما نٌريد إجراء مُعالجة إضافية للكائن قبل حفظه في قاعدة البيانات. كمثال تطبيقي، نفرض أننا نملك نموذجاً حيثُ يكون عنوان البريد الالكتروني واسم المستخدم مُتماثلين دائما في هذه الحالة عند رسم النموذج نقوم بوضع حقل واحد خاص بالبريد الإلكتروني مثلاً وعند حفظ النموذج نُعبئ حقل اسم المستخدم بنفس القيمة. class UserForm(forms.ModelForm): ... def save(self): # نقوم بتمرير #commit=False # للنموذج # الكائن المُعاد # لا يكون محفوظا في قاعدة البيانات في هذه اللحظة user = super(UserForm, self).save(commit=False) # "هنا نجعل قيمة "اسم المستخدم" هي نفس قيمة "البريد الالكتروني user.username = user.email # هنا يتم الحفظ user.save() return user عكس ما إذا استخدمنا commit=True فإن الكائن سوف يٌحفظ في قاعدة البيانات قبل أن نقوم بوضع قيمة "اسم المستخدم".1 نقطة
-
يُعتبر DevOps بمثابة زواج بين إدارتين متنافستين منذ الأزل: التطوير "Development" وإدارة العمليات/التنفيذ "Operations". فمنذ عُرفت الإدارة بشكلها الحديث، عانت فرق التطوير وفرق التنفيذ من ضعف التواصل والتعاون، لما؟ لأن لدى كل منها هدف يتعارض مع هدف الأخرى: ففي حين ترغب فرق إدارة العمليات برؤية المنتج مكتملاً بأعلى جودة وبأقل قدر ممكن من الموارد، تُصرّ فرق التطوير على التأكد من إنجاز العمل بالكامل وبجودة عالية، بغض النظر عن الموارد اللازمة لتحقيق النجاح. تكمن المفارقة في كون هذا التعارض لا يؤدي لتخصيص الموارد بشكل مناسب ولا لإنجاز العمل بالجودة المطلوبة! وهنا يأتي دور DevOps. تُستخدَم كلمة DevOps (اختصارٌ للكلمتين Development و Operations) لوصف مجموعةٍ من أنشطة التكنولوجيا الحديثة التي تسعى إلى تقريب مطوري البرمجيات وموظفي العمليات من بعضهم بعضًا بشكلٍ أوثق بغية العمل بصورة أكثر تعاونية على نفس المشروع. تهدف DevOps لخلق بيئة تطوير تدعم التكامل المتواصل والتسليم المستمر. وذلك من خلال أربعة مبادئ رئيسية تقوم عليها DevOps: التكامل المتواصل (CI: Continuous integration): هو مصطلح خاص بهندسة البرمجيات يصف أسلوبًا في تطوير البرمجيات يتسم بتواصل عملية إعادة بناء تطبيق ما مصحوبة باختباره بصفة متكررة التسليم المتواصل (CD: Continuous delivery): هو منهج يعتمده مهندسو البرمجيات في تطوير البرامج ضمن دورات قصيرة، ويهدف إلى تسريع بناء واختبار وإطلاق البرامج الاختبار المتواصل (Continuous Testing): هي عملية تنفيذ الاختبارات الآلية كجزء من خط أنابيب تسليم البرامج للحصول على تعليقات فورية حول مخاطر العمل المرتبطة بإصدار البرنامج المراقبة المتواصلة (Continuous Monitoring): وهي العملية المسؤولة عن مراقبة البرنامج أو الميزة الجديدة بحثًا عن الأخطاء والأمان والتوافق. بإمكانك الإطلاع على هذه المقالات للتوسع أكثر في مجال ال DevOps و أخذ فكرة شاملة عنه: ما المقصود بـ DevOps؟ ما هي الغاية من DevOps؟ ثلاث خطوات لتأمين DevOps مفتوح المصدر أفضل 5 لغات برمجة لـ DevOps رحلة المطور عبر DevOps لماذا تعد DevOps الاستراتيجية التقنية الأكثر أهمية و هناك عدة مقالات أخرى في المجال يُمكنك الوصول لها من القائمة العُلوية تحت قسم : دروس و مقالات > DevOps.1 نقطة
-
مفهوم التجريد: تعني Abstraction في اللغة الإنجليزية, و هو أسلوب مهم جداً من أساليب البرمجة الغرضية التوجه OOP و يستخدم لتسهيل كتابة الأوامر على المبرمجين, فهو يجعلك قادراً على تنفيذ ما تريد دون الحاجة إلى معرفة كافة التفاصيل التي تم فيها تنفيذ ذلك. إذاً الـ Abstraction يجعلك تتعامل مع الأشياء بسطحية بدل أن تغوص في معرفة تفاصيل الكودات المعقدة. لتطبيق مفهوم الـ Abstraction نستخدم الكلمة abstract ضمن شروط محددة. الكلاس المعرف كـ abstract يسمى Abstract Class. الكلاس العادي الغير معرف كـ abstract يسمى Concrete Class. الدالة المعرفة كـ abstract تسمى Abstract Method أو Abstract Function. نقاط مهمة حول الـ Abstract Class: الكلاس العادي لا يمكنه أن يحتوي على دوال نوعها abstract. الـ Abstract Class يمكنه أن يحتوي على دوال عادية, و يمكنه أن يحتوي على دوال نوعها abstract. إذا قمت بتعريف الكلاس كـ abstract, فهذا يعني أن هذا الكلاس لا يمكن إنشاء كائنات منه. بما أنه لا يمكن إنشاء كائنات من Abstract Class, فهذا يعني أنه للإستفادة من هذا الكلاس, يجب وراثته. الكلاس الذي يرث من كلاس نوعه abstract, يجب أن يفعل Override لجميع الدوال المعرفة كـ abstract. مثال لتعريف abstract class: abstract class Shape { } نقاط مهمة حول الـ Abstract Method: إذا وضعت الكلمة abstract قبل إسم الدالة, فهذا يعني أنها دالة من النوع abstract. الدالة التي نوعها abstract هي دالة لها إسم و نوع محدد, لكنها لا تحتوي على body (جسم), أي لا تملك أقواس بداية و نهاية { }. الدالة العادية تحتوي على أقواس البداية و النهاية { }. الـ Abstract Method يجب وضع فاصلة منقوطة ; في آخرها بدل أقواس البداية و النهاية. الكلاس الذي يرث من كلاس نوعه abstract, يجب أن يقوم بإعادة تعريف (Override) لجميع الدوال التي نوعها abstract, أي يجب أن يكتب الـ body لهذه الدوال. مثال عن abstract method: public abstract void calculateArea(); يُمكنك الإطلاع على هذا المقال للإطلاع على المزيد: مفهوم الواجهات (interfaces) في جافا: في جافا لا يُمكن لكلاس ما أن يرث من أكثر من كلاس أي أن الوراثة المتعددة غير متاحة بعكس اللغات مثل ++c لذلك قام مطورو اللغة بإنشاء مفهوم الinterface و يُستخدم المفهوم كوسيط لتطوير البرامج و يُساعد كثيرا في عملية توسيع البرنامج و جعله قابلاً للتطوير بكل سهولة و لتجهيز أسلوب يُمكن السير عليه و إتباعه في ربط الكلاسات. و تساعد الواجهات كثيراً و تخدم أسلوب التعددية الشكلية polymorphism. طريقة التعامل مع الواجهات تُشبه كثيراً طريقة التعامل مع الكلاسات المجردة مثال لتعريف واجهة: interface MyInterface { } و لتوسعة كلاس من خلال واجهة نستخدم الكلمة المحجوزة implements: class A implements MyInterface { } شروط أساسية لإنشاء و التعامل مع الواجهات: لا نستخدم أي Access Modifer عند تعريف الواجهة. لا نستخدم أي Access Modifer عند تعريف دالة بداخل الواجهة. بداخل الواجهة جميع الدوال يجب أن لا تملك body, و يمكن جعل الدالة ترمي إستثناء. لا يمكن للواجهة أن تملك دالة بانية لا يمكن إنشاء كائن من واجهة. لا يستطيع الكلاس أن يرث (extends) من واجهة بل يُمكنه تنفيذ (implements) واجهة أو أكثر الكلاس الذي يُنفذ واجهة ما عليه إعادة تعريف جميع دوال تلك الواجهة. يُمكن لواجهة أن ترث (extends) من واجهة أو أكثر. للحصول على معلومات أكثر يُمكنك الإطلاع على المقال التالي:1 نقطة
-
يُمكنك إستخدام التحميل الحثيث المتداخل بالشكل التالي: <?php Exam::with(['teacher', 'teacher.profile', 'subject']) ->where('level_id', $request->level) ->select('id', 'subject_id', 'teacher_id', 'created_at') ->get(); كما قد نرغب أحياناً في التحديد او عمل شروط معينة على العلاقة نفسها فنُمرر مصفوفة للتابع with حيث المفتاح هو إسم العلاقة والقيمة تكون عبارة عن closure نحدد فيها ما نرغب به بهذا الشكل مثلاً: <?php Exam::with(['teacher' => function ($query) { $query->with('profile'); }, 'subject']) ->where('level_id', $request->level) ->select('id', 'subject_id', 'teacher_id', 'created_at') ->get(); في هذه الحالة نرغب بتحميل العلاقة أيضاً لكن في حالات أخرى نكون بحاجة لعمل شروط على حقول العلاقة فالطريقة الثانية تساعد في مثل هذه الحالات.1 نقطة
-
بإمكانك إستخدام التابع whereHas لتحقيق ما تريد. سأعطيك مثالاً لتقريب الفهم لنفترض أنه لدي نموذج Module و نموذج Permission حيث أن كل Permission ينتمي إلى Module و العلاقة في النموذج Permission بالشكل التالي: public function module() { return $this->belongsTo(Module::class); } نريد جلب كافة الpermissions التي يكون الmodule الخاص بها مُفعل حيث يوجد حقل في جدول modules إسمه active يأخذ القيمة 0 أو 1 لذلك بالإمكان إستخدام whereHas بالشكل التالي: <?php $permissions = Permission::whereHas('module', function($q) { $q->where('active', 1); })->get(); بمعنى إجلب كل الصلاحيات التي لها موديل و في نفس الوقت يكون هذا الموديل مفعل. المثال الذي طرحته يُشبه تماماً ما تريد فقط تأكد من إنشائك للعلاقة student بشكل سليم .1 نقطة
-
يُمكنك إستخدام حزمة DataTables فهي سهلة و بسيطة و توفر التصدير لعدة أشكال. كما يوجد عدة بدائل يُمكنك الوصول إليها بإستخدام محرك البحث بكتابة: javascript export data to excel و هذا مثال على codepen يستخدم مكتبة table-to-excel:1 نقطة
-
بإمكانك إستخدام حزمة Maatwebsite / Laravel-Excel لتحقيق ذلك: حتى تعمل الحزمة بالشكل المطلوب لديها بعض المتطلبات: PHP: ^7.2\|^8.0 Laravel: ^5.8 PhpSpreadsheet: ^1.15 PHP extension php_zip enabled PHP extension php_xml enabled PHP extension php_gd2 enabled PHP extension php_iconv enabled PHP extension php_simplexml enabled PHP extension php_xmlreader enabled PHP extension php_zlib enabled تثبيت الحزمة: composer require maatwebsite/excel يُمكنك تسجيل مزود الخدمة الخاص بالحزمة بنفسك إن أردت في ملف config/app.php: 'providers' => [ /* * Package Service Providers... */ Maatwebsite\Excel\ExcelServiceProvider::class, ] و حفظ الإسم المستعار في المصفوفة aliases: 'aliases' => [ ... 'Excel' => Maatwebsite\Excel\Facades\Excel::class, ] هاتين الخطوتين ليستا ضروريتان لأن الحزمة auto-discovered. لنشر ملف الإعدادات الخاص بالحزمة في مجلد الإعدادات: php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config تدعم الحزمة التصدير و الإستيراد من و إلى قاعدة البيانات، مثال بسيط لتصدير سجلات النموذج User: نقوم بإنشاء صنف عن طريق الأمر: php artisan make:export UsersExport --model=User سنجد مجلد جديد بالإسم Exports في المجلد app و بداخله الملف UsersExport.php و أي صنف ننُشؤه لاحقاً بنفس الأمر نجده في نفس المسار. نقوم بملء الملف بالشكل التالي: <?php namespace App\Exports; use App\Models\User; use Maatwebsite\Excel\Concerns\FromCollection; class UsersExport implements FromCollection { public function collection() { return User::all(); } } يُمكن التصدير من مجموعة (Collection) او من إستعلام أو من صفحة عرض و كل الطرق مشروحة في توثيق الحزمة. في المتحكم المسؤول نقوم بإنشاء دالة جديدة بالشكل التالي: <?php namespace App\Http\Controllers; use App\Exports\UsersExport; use Maatwebsite\Excel\Facades\Excel; class UsersController extends Controller { public function export() { return Excel::download(new UsersExport, 'users.xlsx'); } } ثم ننُشئ المسار الذي من خلاله نصل الى الدالة export: Route::get('users/export/', 'UsersController@export'); الآن بإمكانك إنشاء زر للوصول إلى المسار او يُمكنك تصفح الرابط مباشرة من المتصفح و سيتم تحميل ملف إكسل بالإسم users.xlsx. يحتوي على البيانات. بإمكانك الإطلاع على التوثيق الرسمي للحزمة للإطلاع على الأمر بشكل موسع: Laravel Excel1 نقطة
-
يوفر Laravel طريقة ممتازة للربط بحدث معين في تطبيقك أو مشروعك باستخدام الأحداث (events) والمستمعين (listeners). ستتيح لك هذه الميزة الاشتراك والاستماع إلى الأنشطة المختلفة التي حدثت في التطبيق الخاص بك. ببساطة ، فكر في الحدث على أنه شيء حدث في تطبيقك والمستمعين كمجموعة من المنطق للرد بها على ذلك الحدث. لذلك ، يتيح هذا للمطورين ، إصدار إعلانات داخل التطبيق بحدوث شيء ما وتنفيذ مجموعة من العمليات بناءً على هذا الحدث المحدد. نتيجة لذلك ، ستساعد الأحداث والمستمعون بشكل أكبر في تبسيط أكوادنا وإعادة بناء المهام المعقدة. قد تسأل لماذا نستخدم هذه الخصائص ! تُساعد هذه الخصائص كثيراً في تحقيق مبادئ تصميم البرمجيات (SOLID) حيث أن أحد هذه المبادئ مبدأ SRP اي Single Responsibility Principle و يعني ببساطة أن كل وحدة او كلاس أو دالة يجب عليها أن تقوم بمسؤولية واحدة فقط. قد نرغب في تطبيقنا عند إنشاء منشور ما أن نُرسل إشعار إلى كافة المستخدمين عن طريق البريد الإلكتروني بوجود منشور جديد: نقوم بإنشاء الحدث و المستمع عن طريق الأمر: php artisan make:event PostCreated php artisan make:listener NotifyPostCreated --event="PostCreated" سيُنشئ الأمر أعلاه ملف للحدث بالإسم PostCreated بداخل المسار app/Events و ملف للمستمع بالإسم NotifyPostCreated بداخل المسار app/Listeners بعد ذلك ، تحتاج إلى تسجيل الأحداث والمستمعين في ملف EventServiceProvider.php. في المسار app/Providers: use App/Events/PostCreated; use App/Listeners/NotifyPostCreated; //... /** * The event listener mappings for the application. * * @var array */ protected $listen = [ //... PostCreated::class => [ NotifyPostCreated::class, ], ]; في المصفوفة listen$ مع إستدعاء الكلاسات في الأعلى. الآن بعد أن قمنا بإعداد الأحداث والمستمعين ، كل ما تبقى هو تحديد بعض المنطق داخل الحدث والمستمع. ثم ، أخيرًا إرسال الحدث. أولاً ، لنبدأ بفئة الحدث PostCreated التي أنشأناها سابقًا. ما نريده هو إخطار المستخدمين في كل مرة يتم فيها إنشاء منشور جديد. لذلك ، سنحتاج إلى تمرير كائن post الفعلي إلى باني الفئة PostCreated هذه. سنتعلم كيفية إرسال حدث في وقت لاحق ، ولكن الغرض من ذلك هو إتاحة الوصول إلى الكائن post بين جميع المستمعين. # app/Events/PostCreated.php <?php namespace App\Events; .... use App\Post; class PostCreated { use Dispatchable, InteractsWithSockets, SerializesModels; public $post; /** * Create a new event instance. * * @return void */ public function __construct(Post $post) { $this->post = $post; } } ثانيًا ، ستحتفظ فئة المستمع NotifyPostCreated بالمنطق الفعلي لإرسال البريد الإلكتروني إلى المستخدمين. لاحظ أن هناك تابع handle، هذا هو التابع الذي سيتم استدعاؤه بواسطة الحدث وضمن هذا التابع سنكتب كل الكود اللازم لإرسال البريد الإلكتروني # app/Events/NotifyPostCreated.php <?php namespace App\Listeners; use App\Events\PostCreated; use App\User; use Mail; class NotifyPostCreated { .... .... /** * Handle the event. * * @param PostCreated $event * @return void */ public function handle(PostCreated $event) { // Access the post using $event->post... $users = User::all(); foreach($users as $user) { Mail::to($user)->send('emails.post.created', $event->post); } } } يرجى ملاحظة أنني استخدمت واجهة Mail لإرسال بريد إلكتروني وقمت بتهيئة بيانات اعتماد البريد وفقًا لذلك وأنشأت أيضًا ملفًا لمحتوى البريد الإلكتروني في Resources / views / emails / post / created.blade.php. يُمكن أيضاً إنشاء صنف Notification للتعامل مع الإشعار بشكل مبسط بحيث تُصبح عملية الإخطار بالشكل التالي: $users = User::all(); foreach($users as $user) { $user->notify(new PostCreatedNotification($post)); } الخطوة الأخيرة هي تشغيل حدث PostCreated أو إطلاقه. كل ما علينا فعله هو استخدام المساعد event . سيرسل هذا المساعد الحدث إلى جميع مستمعيه المسجلين. # app/Http/Controllers/PostController.php <?php namespace App\Http\Controllers; use App\Events\PostCreated; use App\Http\Controllers\Controller; use App\Post; class PostController extends Controller { //... public function store(Request $request) { // post storing logic... event(new PostCreated($post)); } } بدلاً من ذلك ، إذا كان حدثك يستخدم Dispatchable trait ، فيمكنك استدعاء التابع الثابت dispatch بهذا الشكل: //... public function store(Request $request) { // post storing logic... PostCreated::dispatch($post); } إفتراضياً لارفل تستخدم نفس العملية عند تسجيل مستخدم جديد لإرسال بريد إلكتروني لتأكيد الحساب.1 نقطة
-
بإمكانك إستخدام select لتحديد الحقول التي تريدين جلبها مثلاً: $projects = auth()->user() ->projects() ->select('field1', 'field2') ->get(); و في هذه الحالة سيتم جلب كافة مشاريع العضو الحالي على شكل مجموعة كائنات من الصنف Project و كل كائن لديه خاصيتين هما الحقلين الذين تم تحديدهما.1 نقطة