كيفية إنشاء مقطع مخصص في موقع أودو
دليل خطوة بخطوة لبناء مكوّنات قابلة للسحب والإفلات في محرر موقع أودو — من قالب XML إلى لوحة المقاطع المباشرة. موثق لأودو 18 و19.
محرر السحب والإفلات في موقع أودو مبني على مكوّنات قابلة لإعادة الاستخدام تُسمى المقاطع. كل مكوّن تراه في لوحة المحرر — من البانرات الرئيسية إلى عروض الشهادات — هو مقطع مسجّل عبر عرض XML يرث من قائمة المقاطع الرئيسية. إنشاء مقطعك الخاص يتبع النمط ذاته: كتابة قالب HTML وتسجيله في لوحة المحرر وإضافة خيارات CSS وJavaScript اختياريًا. يغطي هذا الدليل سير العمل الكامل لأودو 18 و19.
ما هو مقطع أودو؟
المقطع (يُسمى أيضًا مكوّن البناء) هو قسم HTML مستقل يمكن لمحرري الموقع سحبه من اللوحة ووضعه في أي صفحة. تتكوّن المقاطع من ثلاثة أجزاء: قالب HTML (المكوّن المرئي)، وعرض تسجيل المقطع (الذي يجعله يظهر في لوحة المحرر)، وخيارات المقطع الاختيارية (فئات JavaScript تضيف عناصر تحكم في المحرر مثل منتقيات الألوان أو تبديلات التخطيط).
| المكوّن | موقع الملف | مطلوب | الغرض |
|---|---|---|---|
| قالب HTML | views/snippets/s_my_snippet.xml | نعم | المكوّن المرئي الذي يُسقط على الصفحة |
| عرض التسجيل | views/snippets/snippets.xml | نعم | يضيف المكوّن إلى لوحة المحرر ضمن فئة |
| خيارات JS للمقطع | static/src/js/options.js | لا | عناصر تحكم المحرر (التخطيط والألوان ومبدّلات الرؤية) |
| أنماط CSS | static/src/scss/s_my_snippet.scss | لا | أنماط خاصة بمكوّن المقطع |
| إدخال __manifest__.py | جذر الوحدة | نعم | يُعلن ملفات XML وJS وCSS لمسار الأصول في أودو |
هيكل الوحدة
يجب أن تكون المقاطع المخصصة داخل وحدة أودو. إذا كنت تضيف مقطعًا إلى وحدة موقع موجودة، تخطَّ خطوة الهيكل. بالنسبة لوحدة جديدة، التخطيط الأدنى للمجلد هو:
my_website_snippets/
├── __init__.py
├── __manifest__.py
├── static/
│ └── src/
│ ├── js/
│ │ └── options.js # snippet options (optional)
│ └── scss/
│ └── s_my_snippet.scss # snippet styles (optional)
└── views/
└── snippets/
├── s_my_snippet.xml # HTML template
└── snippets.xml # editor panel registrationالخطوة 1 — كتابة قالب HTML
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<template id="s_my_cta_banner" name="My CTA Banner">
<section class="s_my_cta_banner" data-snippet="s_my_cta_banner"
data-name="My CTA Banner">
<div class="container text-center py-5">
<h2 class="s_my_cta_banner_title">Your headline goes here</h2>
<p class="lead s_my_cta_banner_subtitle">
Supporting text for your call to action.
</p>
<a href="#" class="btn btn-primary btn-lg">Get Started</a>
</div>
</section>
</template>
</odoo>نقاط رئيسية: يجب أن يكون العنصر الجذري ``. يجب أن تتطابق سمة `data-snippet` مع معرّف القالب `id`. تحدد سمة `data-name` تلميح الأداة المعروض في المحرر عند تمرير المستخدم على المكوّن المُسقط.
الخطوة 2 — تسجيل المقطع في لوحة المحرر
تتحكم في لوحة المحرر العرض `website.snippets`. تمدّده باستخدام XPath لحقن صورة مصغّرة لمقطعك في إحدى فئات اللوحة: المحتوى أو الهيكل أو المحتوى الداخلي أو الميزات.
| الفئة | هدف XPath | الاستخدام النموذجي |
|---|---|---|
| المحتوى | //div[@id="snippet_content"] | بانرات رئيسية وكتل نصية ووسائط |
| الهيكل | //div[@id="snippet_structure"] | أعمدة وبطاقات وتخطيطات |
| الميزات | //div[@id="snippet_feature"] | عدادات وعلامات تبويب وأقسام قابلة للطي |
| المحتوى الداخلي | //div[@id="snippet_innerContent"] | عناصر توضع داخل مقاطع أخرى |
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<!-- Register snippet in the "Content" panel category -->
<template id="snippets" inherit_id="website.snippets">
<xpath expr="//div[@id='snippet_content']" position="before">
<t t-snippet="my_website_snippets.s_my_cta_banner"
t-thumbnail="/my_website_snippets/static/src/img/thumb_my_cta_banner.png"/>
</xpath>
</template>
</odoo>الخطوة 3 — تعريف الملفات في __manifest__.py
{
'name': 'My Website Snippets',
'version': '1.0',
'category': 'Website',
'depends': ['website'],
'data': [
'views/snippets/s_my_snippet.xml',
'views/snippets/snippets.xml',
],
'assets': {
'web.assets_frontend': [
'my_website_snippets/static/src/scss/s_my_snippet.scss',
'my_website_snippets/static/src/js/options.js',
],
},
'installable': True,
}الخطوة 4 — إضافة خيارات المقطع (اختياري)
خيارات المقطع هي فئات JavaScript تمتد من `SnippetOptionWidget` (أو إحدى الفئات الفرعية). تضيف عناصر تحكم لوحة المحرر — منتقيات الألوان ومبدّلات التخطيط وحقول النص — التي تظهر عندما ينقر المستخدم على مقطعك في المحرر. ترتبط الخيارات بمحدد CSS الجذري للمقطع.
/** @odoo-module **/
import options from "@web_editor/js/editor/snippets.options";
options.registry.MyCTABanner = options.Class.extend({
// Called when the user changes an option value
setBannerStyle: function (previewMode, value) {
this.$target.toggleClass("s_my_cta_banner_dark", value === "dark");
this.$target.toggleClass("s_my_cta_banner_light", value === "light");
},
});يجب أن يتطابق مفتاح السجل (`MyCTABanner`) مع سمة `data-js` التي تضيفها إلى عنصر التسجيل ``، وإلا يستخدم أودو اسم فئة CSS للعنصر الجذري للمقطع كمفتاح احتياطي.
الخطوة 5 — تثبيت الوحدة والاختبار
- أعد تشغيل خادم أودو لاستيعاب الوحدة الجديدة: `./odoo-bin -c odoo.conf -u my_website_snippets`.
- افتح تطبيق الموقع وانقر على **تعديل** في أي صفحة.
- في لوحة مكوّنات البناء، حدد مقطعك ضمن الفئة التي سجلته فيها (مثلًا المحتوى).
- اسحب المقطع إلى الصفحة وتأكد من أنه يُعرض بشكل صحيح.
- انقر على المكوّن المُسقط لفتح لوحة المحرر وتحقق من ظهور أي خيارات مخصصة.
- احفظ الصفحة وأعد تحميلها في الوضع العادي (غير التعديل) للتأكد من عرض المقطع بدون نصوص المحرر.
استكشاف الأخطاء — المشكلات الشائعة
| الأعراض | السبب المحتمل | الحل |
|---|---|---|
| المقطع غير مرئي في لوحة المحرر | XML غير مُعلَن في قائمة `data` في __manifest__.py، أو لم يتم تحديث الوحدة | أضف ملف XML إلى `data`، ثم شغّل `-u my_module`. امسح ذاكرة التخزين المؤقت للمتصفح. |
| يظهر المقطع لكنه فارغ | عدم تطابق معرّف القالب بين s_my_snippet.xml ومرجع `t-snippet` | تحقق من أن `t-snippet='module_name.template_id'` يتطابق تمامًا، بما في ذلك بادئة الوحدة. |
| أنماط CSS غير مطبّقة | ملف SCSS غير موجود في `web.assets_frontend` أو لم تتجدد أصول أودو | أضف مسار SCSS إلى أصول الملف الظاهر، وأعد تشغيل الخادم مع `-u`، وامسح الذاكرة المؤقتة بـ `?debug=assets`. |
| لوحة خيارات المقطع فارغة / JS لا يعمل | خيارات JS غير مجمّعة في الأصل الصحيح (يجب أن تكون في `web.assets_backend` لوضع المحرر) | أضف options.js إلى `web.assets_frontend` و`web.assets_backend` في الملف الظاهر. |
| تحذير `data-snippet` في وحدة تحكم المتصفح | قيمة `data-snippet` لا تتطابق مع معرّف القالب في الوسوم الجذرية `<section>` | اضبط `data-snippet='s_my_cta_banner'` على الوسوم الجذرية بما يتطابق مع معرّف القالب `id` تمامًا. |
ملاحظات الإصدار
| إصدار أودو | التغيير الرئيسي المؤثر على المقاطع |
|---|---|
| أودو 15 | حزمة أصول قديمة: `website.assets_frontend`. تستخدم خيارات المحرر `options.Class.extend()`. |
| أودو 16 | تمت إعادة تسمية حزمة الأصول إلى `web.assets_frontend`. تم تقديم OWL 2 — لكن خيارات المقطع لا تزال تستخدم نظام فئات JS القديم. |
| أودو 17 | مطلوب صيغة ESM `@odoo-module` لملفات JS الجديدة. سمة `data-snippet` مطلوبة — تحذير في وحدة التحكم إذا كانت غائبة. |
| أودو 18 | تم إعادة تصميم واجهة لوحة المقاطع — قد يختلف ترتيب الفئات. اتفاقية مسار `t-thumbnail` غير متغيرة. واجهة API لـ JS الخيارات مستقرة. |
| أودو 19 | لا توجد تغييرات كسرية على تسجيل المقاطع أو واجهة API للخيارات. تظل حزمة `web.assets_frontend` معيارية. |
تحتاج إلى مكوّنات موقع مخصصة لموقعك في أودو؟
يبني مطورونا المعتمدون من أودو مقاطع مخصصة وقوالب موقع وتكاملات متجر إلكتروني كاملة مُصمَّمة وفق متطلبات الأعمال السعودية.
الأسئلة الشائعة
ما الفرق بين المقطع والودجة في موقع أودو؟
هل يمكنني إضافة مقطع مخصص دون إنشاء وحدة أودو جديدة؟
كيف أجعل المقطع متاحًا على صفحات محددة فقط؟
تم حفظ مقطعي على صفحة لكنه اختفى بعد تحديث الوحدة. لماذا؟
هل يمكنني استخدام أودو Studio لإنشاء مقطع؟
كيف أجعل نص المقطع قابلًا للتحرير بواسطة محرري الموقع؟

iWesabe Editorial Team
رؤى عملية حول Odoo ERP وامتثال ZATCA والعمليات الرقمية للشركات السعودية — بقلم فرق الاستشارات والمالية والهندسة في iWesabe.
مقالات ذات صلة
كيفية تهيئة البريد الإلكتروني في أودو
دليل شامل لإعداد خوادم البريد الصادر والوارد في أودو — يشمل SMTP وGmail وMicrosoft 365 والأسماء المستعارة الشاملة وأفضل ممارسات إمكانية تسليم البريد الإلكتروني.
تنسيق الورق المخصص في تقارير QWeb لأودو
كيفية إنشاء وتهيئة وربط تنسيقات الورق المخصصة بتقارير QWeb لأودو — يشمل إعداد واجهة المستخدم، وتجاوز XML، والتحكم في الهوامش، وضبط حجم الرأس والتذييل.
إهمال attrs في أودو: الانتقال إلى invisible وreadonly وrequired في أودو 16–19
تم إهمال قاموس attrs في أودو 16 وحذفه في أودو 17. يحدد هذا الدليل كل نمط attrs ومقابله من السمات المباشرة — مع كود قبل/بعد لحالات الاستخدام الأكثر شيوعًا. موثق لأودو 18 و19.