Frontendبالتفصيل.
الجزء اللي بيشوفه العميل — وأكتر جزء بيلخبط المطوّرين لأنه نظام طبقات متكامل. هنفهم كل حاجة: الـ themes، الـ layout XML، الـ blocks، الـ templates، الـ static content، والـ JS. وبعدها أسئلة إنترفيو بإجابات مفصّلة.
الـ Frontend في Magento 2 نظام طبقات: الـ theme بيحدّد الشكل، والـ Layout XML بيحدّد مكان كل block في الصفحة حسب الـ handle، والـ Block (PHP) بيجهّز البيانات، والـ phtml template بيعرضها. الملفات الثابتة بتتنشر بـ static-content:deploy، والـ JavaScript بيتدار بـ RequireJS، والـ checkout والـ minicart معتمدين على Knockout.
الصورة الكاملة
إزاي بتتكوّن الصفحة من الطبقات المختلفة.
- Layout XML — بيحدّد "الصفحة فيها إيه" — أنهي blocks تظهر وفين.
- Block (PHP) — بيجهّز البيانات ("منطق العرض") للـ template.
- Template (phtml) — بيعرض البيانات كـ HTML فعلي.
- Theme — بيغلّف كل ده ويحدّد الشكل العام (CSS، الخطوط، الألوان).
الـ Themes
الطبقة اللي بتحدّد شكل المتجر بالكامل.
الـ Theme هو مجموعة الملفات اللي بتحدّد شكل المتجر: الـ templates، الـ styles، الـ layouts، والصور. Magento بيجي بـ theme اسمه Luma (للعرض) وBlank (أساس للبناء عليه).
مفهوم مهم: الـ theme بتاعك بيورّث من theme تاني (غالبًا Blank). يعني بتاخد كل ملفاته، وتعدّل اللي عايزه بس. مش بتبني من الصفر.
<theme> <title>My Custom Theme</title> <!-- inherit from Blank --> <parent>Magento/blank</parent> </theme>
theme.xml # تعريف الـ theme registration.php # التسجيل web/ # css, js, images, fonts etc/ # view.xml (إعدادات) Magento_Theme/ # تعديلات على module معيّن ├─ layout/ └─ templates/
الـ Layout XML
قلب الـ frontend — بيحدّد بنية كل صفحة.
الـ Layout XML ملفات بتحدّد بنية الصفحة: أنهي blocks تظهر، فين، وبأي ترتيب. ده اللي بيربط كل حاجة ببعض.
- Container — حاوية بتجمّع blocks (زي header, footer, main).
- Block — عنصر بيعرض محتوى (مربوط بـ class و template).
- Handle — اسم بيحدّد أنهي layout ينطبق على أنهي صفحة.
- Reference — بيعدّل block أو container موجود.
<page> <body> <!-- add a block into a container --> <referenceContainer name="content"> <block class="Vendor\Module\Block\Custom" name="custom.block" template="Vendor_Module::custom.phtml"/> </referenceContainer> </body> </page>
اسم الملف = الـ handle. مثلًا catalog_product_view.xml بينطبق على صفحة المنتج بس. وdefault.xml بينطبق على كل الصفحات. ده بيحدّد نطاق التعديل.
الـ Blocks
منطق العرض — بيجهّز البيانات للـ template.
الـ Block هو class PHP بيمثّل منطق العرض. بيجهّز البيانات اللي الـ template محتاجها ويقدّمها له عن طريق methods.
عشان تفصل المنطق عن العرض. الـ block بيعمل الحسابات وجلب البيانات (PHP)، والـ template بيعرض بس (HTML). ده بيخلّي الـ template نظيف وسهل التعديل.
namespace Vendor\Module\Block; use Magento\Framework\View\Element\Template; class Custom extends Template { // prepares data for the template public function getGreeting(): string { return 'Welcome to our store!'; } }
- Template Block — بيورّث من Template، مربوط بـ phtml (الأشهر).
- Structural Block — بيرتّب blocks تانية (زي الـ containers).
الـ Templates (phtml)
الطبقة اللي بتعرض الـ HTML فعليًا.
الـ Template ملف .phtml (PHP + HTML) بيعرض المحتوى. بياخد البيانات من الـ block (عن طريق $block) ويحطّها في HTML.
<?php /** @var $block \Vendor\Module\Block\Custom */ ?> <div class="custom-greeting"> <?= $block->escapeHtml( $block->getGreeting() ) ?> </div>
- الـ $block متاح تلقائيًا — بيمثّل الـ block المربوط.
- دايمًا استخدم escapeHtml() للبيانات (أمان ضد XSS).
- خلّي الـ PHP في الـ template أقل ما يمكن — المنطق مكانه في الـ block.
Static Content & LESS
الـ CSS والصور والـ JS — وإزاي بتتجهّز.
الملفات الثابتة (CSS، JS، صور، خطوط) مبتتقدّمش مباشرة من مكانها في الكود. Magento بيعالجها وينشرها (deploy) في مجلّد pub/static/ عشان تتقدّم بكفاءة.
Magento بيستخدم LESS (نسخة متطوّرة من CSS فيها متغيّرات ودوال). بتكتب LESS، وMagento بيحوّله لـ CSS عادي وقت الـ deployment.
# نشر الملفات الثابتة bin/magento setup:static-content:deploy # للغة معيّنة bin/magento setup:static-content:deploy en_US ar_SA # في developer mode، بيتولّد تلقائيًا # لكن لازم تمسح pub/static عند التغيير: rm -rf pub/static/frontend/*
JavaScript & RequireJS
إزاي Magento بيدير الـ JS بشكل منظّم.
الـ RequireJS مكتبة بتدير الـ JavaScript كـ modules بنظام تحميل حسب الحاجة (lazy loading). بدل ما تحمّل كل الـ JS مرة واحدة، بيحمّل اللي محتاجه بس.
عشان الأداء والتنظيم. الموقع فيه JS كتير — RequireJS بيحمّل كل جزء وقت الحاجة بس، وبيدير الاعتماديات بين الـ scripts.
var config = { // give your script a short name (alias) map: { '*': { 'customWidget': 'Vendor_Module/js/custom-widget' } } };
<script type="text/x-magento-init"> { "*": { "customWidget": { "label": "Hello" } } } </script>
Knockout & UI Components
الجزء الديناميكي — خصوصًا في الـ checkout والـ cart.
الـ Knockout.js مكتبة JS بتربط البيانات بالـ UI تلقائيًا (data binding). لما البيانات تتغيّر، الـ UI بيتحدّث لوحده من غير reload. Magento بيستخدمه للأجزاء الديناميكية.
بشكل أساسي في الـ checkout والـ minicart — الأجزاء اللي بتتحدّث ديناميكيًا (السلة، الإجماليات، خطوات الدفع). ده اللي بيخلّي الـ checkout يشتغل زي SPA.
<!-- UI updates automatically when data changes --> <span data-bind="text: greeting"></span> <button data-bind="click: updateGreeting"> Click </button>
طبقة أعلى من Knockout. مكوّنات جاهزة ومعقّدة (grids, forms) بتتعرّف في XML وبتشتغل بالـ JS. الـ checkout مبني عليها.
أسئلة الإنترفيو
الأسئلة المتكررة عن الـ frontend بإجابات مفصّلة.
- اربط بالطبقات: لما تشرح أي حاجة، وضّح مكانها في السلسلة (layout → block → template).
- اذكر الأمان: escapeHtml في الـ templates — بيبيّن إنك واعي بالـ security.
- فرّق checkout عن الباقي: اعرف إن الـ checkout استثناء (Knockout) مش القاعدة.
- الـ override بدل التعديل المباشر: دايمًا اذكر إنك متلمسش الـ core.
الـ Frontend بالتفصيل ✓
دلوقتي فاهم الـ frontend كنظام طبقات متكامل: theme، layout، block، template، static content، والـ JS (RequireJS/Knockout). وعندك أسئلة الإنترفيو الأساسية بإجاباتها.
الخلاصة اللي تربط كله: Layout بيحدّد البنية، Block بيجهّز البيانات، Template بيعرضها، Theme بيغلّف الشكل. والـ checkout استثناء بيستخدم Knockout. بمجرد ما تستوعب الطبقات دي، أي تخصيص frontend بيبقى واضح.
خلّصت الدرس؟علّمه عشان تتابع تقدّمك في الكورس.
أسئلة شائعة
ما الفرق بين Block و Template في Magento 2؟
الـ Block هو class PHP بيمثّل منطق العرض، بيجهّز البيانات ويقدّمها عن طريق methods. الـ Template ملف .phtml بياخد البيانات من $block ويعرضها كـ HTML. الفصل ده بيخلّيك تغيّر الشكل من غير ما تلمس المنطق، والقاعدة إن الـ template يعرض مش يفكّر.
إزاي أعدّل template من الـ core في Magento 2 من غير ما ألمسه؟
عن طريق theme override: بتعمل نسخة من الـ template في الـ theme بتاعك تحت نفس المسار بتاع الـ module، زي theme/Magento_Catalog/templates/، وMagento بيستخدم نسختك بدل الأصلية. وللـ layout بتعمل ملف بنفس الاسم في الـ theme أو الموديول بتاعك، وMagento بيدمج تعديلاتك فوق الأصل (layout merging).
يعني إيه Layout Handle في Magento 2؟
الـ handle مُعرّف بيحدّد أنهي layout ينطبق على أنهي صفحة، واسم ملف الـ layout هو نفسه الـ handle. مثلًا catalog_product_view.xml بينطبق على صفحة المنتج بس، وdefault.xml بينطبق على كل الصفحات.
ليه تعديلات CSS أو JS مش بتظهر في Magento 2؟
لأن الملف القديم لسه منشور في pub/static. الحل إنك تمسح pub/static/frontend وvar/view_preprocessed، وفي production تشغّل bin/magento setup:static-content:deploy تاني، لأن الـ static content هناك مش بيتولّد تلقائيًا.
إزاي أضيف JavaScript لصفحة معيّنة في Magento 2؟
عرّف الـ script في requirejs-config.js وإديله alias عن طريق map، زي customWidget اللي بيشاور على Vendor_Module/js/custom-widget. بعدها ناديه من الـ template بـ text/x-magento-init أو data-mage-init وابعتله الـ config اللي محتاجه.
ليه الـ checkout في Magento 2 مختلف عن باقي الصفحات؟
معظم الصفحات زي المنتج والـ category بتستخدم PHP templates عادية بتترندر على السيرفر. الـ checkout مبني على Knockout.js وUI Components وبيشتغل زي SPA، بيتحدّث من غير reload وبيكلّم الـ backend عن طريق REST APIs، عشان كده تخصيصه مختلف تمامًا.
إزاي أعمل custom theme في Magento 2؟
بتعمل مجلد الـ theme في app/design/frontend/Vendor/theme فيه theme.xml وregistration.php، وتحدد الـ parent زي Magento/blank عشان تورّث كل ملفاته وتعدّل اللي عايزه بس. الـ CSS والـ JS والصور بتتحط في web/، وتعديلات كل module بتتحط في مجلد باسمه زي Magento_Catalog/.