Moduleهيكل الموديول.
أول احتكاك حقيقي بـ Magento. كل feature بتعملها بتعيش جوّه module. هنفهم كل مجلّد وملف ودوره ومتى تستخدمه — عشان لما تحتار "الملف ده يروح فين"، ترجعله وتعرف.
الـ module في Magento 2 وحدة مستقلة بتضيف feature، وأقل حاجة محتاجها ملفين: registration.php اللي بيسجّل اسم الموديول، و etc/module.xml اللي بيعرّفه. باقي المجلدات بتضيفها حسب الحاجة: etc للإعدادات، و Model و Controller و Block للكود، و view للواجهة. وبتفعّله بأمر module:enable وبعدين setup:upgrade.
يعني إيه Module؟
الوحدة الأساسية اللي Magento كله مبني منها.
الـ Module هو وحدة مستقلة بتضيف وظيفة معيّنة لـ Magento. كل حاجة في Magento — الكتالوج، الـ checkout، العملاء — كلها modules. حتى الكود بتاعك بيكون module.
عشان العزل والمرونة. كل module منفصل، تقدر تفعّله أو تعطّله، تضيف أو تشيل، من غير ما تكسر الباقي. ده تطبيق مباشر لمبدأ الـ modularity.
الـ modules بتاعتك بتكون في app/code/Vendor/Module/. الـ Vendor اسم شركتك/اسمك، والـ Module اسم الموديول.
الملفان الإجباريان
أقل موديول ممكن = ملفين بس. دول اللي بيخلّوه "موجود".
بيسجّل الموديول في نظام Magento. بيقول "أنا موجود، اسمي كذا، ومكاني كذا". من غيره، Magento مش هيعرف الموديول أصلًا.
use Magento\Framework\Component\ComponentRegistrar; ComponentRegistrar::register( ComponentRegistrar::MODULE, 'Vendor_Module', __DIR__ );
بيعرّف بيانات الموديول: اسمه، وأهم حاجة — الاعتماديات (dependencies) والترتيب. بيقول "أنا محتاج الموديولات دي تتحمّل قبلي".
<config> <module name="Vendor_Module"> <sequence> <!-- load these before me --> <module name="Magento_Catalog"/> </sequence> </module> </config>
مهم لما موديولك بيعتمد على تاني. مثلًا لو بتعمل plugin على method من الكتالوج، لازم الكتالوج يتحمّل الأول. الـ sequence بيضمن ده.
الهيكل الكامل
الخريطة الكاملة للمجلّدات. النجمة (★) = الأكثر استخدامًا.
registration.php # ★ التسجيل etc/ # ★ الإعدادات (XML) ├─ module.xml # ★ تعريف الموديول ├─ di.xml # ★ الـ DI ├─ events.xml # الـ observers ├─ db_schema.xml # ★ الجداول ├─ frontend/ # إعدادات الواجهة └─ adminhtml/ # إعدادات الأدمن Model/ # ★ المنطق والبيانات Block/ # منطق العرض Controller/ # ★ معالجة الطلبات Plugin/ # الـ plugins Observer/ # مستمعي الأحداث Setup/Patch/ # تعديل البيانات Api/ # ★ الـ interfaces ├─ Data/ # data interfaces view/ # ★ الواجهة ├─ frontend/ # templates, layout, js └─ adminhtml/ # واجهة الأدمن Ui/ # UI components Test/ # الاختبارات
مجلّد etc (الأهم)
قلب الإعدادات. كل ملفات الـ XML اللي بتربط الموديول ببعضه.
بعض الملفات بتتحط في etc/frontend/ أو etc/adminhtml/ عشان تخص area معيّنة. مثلًا etc/frontend/routes.xml بيعرّف routes الواجهة بس.
مجلّدات الكود (PHP)
فين بيروح كل نوع كود PHP.
مجلّد view (Frontend)
كل ما يخص الواجهة: templates، layouts، CSS، JS.
view/ ├─ frontend/ │ ├─ layout/ # XML layouts │ ├─ templates/ # .phtml files │ ├─ web/ # css, js, images │ └─ requirejs-config.js ├─ adminhtml/ # نفس البنية للأدمن └─ base/ # مشترك بين الاتنين
الـ Areas
مفهوم مهم بيفسّر ليه في مجلّدات frontend و adminhtml في كل مكان.
الـ Area هي سياق تشغيل في Magento. كل area ليها إعداداتها وملفاتها. ده بيسمح إن نفس الموديول يتصرّف بشكل مختلف في الواجهة عن الأدمن.
- frontend — واجهة المتجر (اللي العميل بيشوفها).
- adminhtml — لوحة تحكّم الأدمن.
- global — مشترك بين الكل (ملفات في etc/ مباشرة).
- webapi_rest / webapi_soap — سياق الـ APIs.
- crontab — سياق المهام المجدولة.
التفعيل وأسئلة
إزاي تفعّل الموديول بعد ما تعمله، والأسئلة المتكررة.
# تفعيل الموديول bin/magento module:enable Vendor_Module # تطبيق التغييرات (schema, data) bin/magento setup:upgrade # إعادة توليد الكود (في production) bin/magento setup:di:compile # مسح الـ cache bin/magento cache:clean # التأكد إنه اتفعّل bin/magento module:status Vendor_Module
هيكل الموديول ✓
دلوقتي عندك خريطة كاملة للموديول: الملفان الإجباريان، مجلّد etc، مجلّدات الكود، الـ view، والـ areas. مش مطلوب تحفظ — مطلوب تفهم إن كل نوع ملف ليه مكان منطقي.
الخلاصة: كل حاجة معزولة في module، وكل نوع ملف ليه مكانه، والـ areas بتفصل السياقات. بمجرد ما تألف البنية دي، أي موديول تفتحه هيبقى مفهوم — وده أساس كل اللي جاي.
خلّصت الدرس؟علّمه عشان تتابع تقدّمك في الكورس.
أسئلة شائعة
إيه أقل ملفات محتاجها عشان أعمل module في Magento 2؟
ملفين بس: registration.php اللي بيسجّل الموديول بـ ComponentRegistrar::register() باسمه الرسمي زي Vendor_Module، وetc/module.xml اللي بيعرّف اسمه والـ sequence بتاعه. بتحطهم في app/code/Vendor/Module/، وأي مجلّد تاني بتضيفه لما تحتاجه.
ما الفرق بين app/code و vendor في Magento 2؟
app/code/ مكان الموديولات بتاعتك (custom)، وvendor/ فيه الموديولات اللي اتثبّتت عن طريق Composer زي Magento core والحزم الخارجية. متعدّلش حاجة في vendor/ أبدًا، ولو عايز تغيّر سلوك موديول core استخدم plugins أو events من موديولك.
إزاي أفعّل module جديد في Magento 2؟
الترتيب المعتاد: bin/magento module:enable Vendor_Module وبعده bin/magento setup:upgrade وبعده bin/magento cache:clean. لو ضفت إعدادات DI أو شغّال production شغّل setup:di:compile، واتأكد إن الموديول اتفعّل بـ bin/magento module:status Vendor_Module.
يعني إيه Area في Magento 2؟
الـ Area سياق تشغيل ليه إعداداته وملفاته: frontend لواجهة المتجر، وadminhtml للوحة التحكم، وwebapi_rest وwebapi_soap للـ APIs، وcrontab للمهام المجدولة، وglobal للمشترك. عشان كده etc/di.xml بيتطبّق على الكل، وetc/frontend/di.xml على الواجهة بس.
إيه أهم ملفات مجلد etc في Magento 2 module؟
أهمهم module.xml (إجباري) وdi.xml للـ preferences والـ plugins والـ virtual types، وevents.xml لربط الـ observers، وdb_schema.xml لتعريف الجداول بالـ declarative schema. وفيه كمان acl.xml للصلاحيات، وcrontab.xml للـ cron jobs، وwebapi.xml لتعريف الـ REST endpoints.
ليه الموديول بتاعي مش ظاهر في Magento 2؟
غالبًا نسيت تشغّل setup:upgrade أو cache:clean بعد ما فعّلته. ومن الأسباب كمان اختلاف اسم الموديول بين registration.php وmodule.xml، أو إن الـ namespace مش مطابق لمسار الملف.
ما الفرق بين مجلد Block و templates في Magento 2؟
مجلّد Block/ في جذر الموديول فيه كلاسات PHP بتجهّز البيانات للعرض. أما view/frontend/templates/ فيه ملفات .phtml (HTML + PHP) اللي بتعرضها فعليًا، وملفات الـ layout/ XML بتحدد أنهي blocks تظهر فين في الصفحة.