شرح أودو

كيفية إنشاء مقطع مخصص في موقع أودو

دليل خطوة بخطوة لبناء مكوّنات قابلة للسحب والإفلات في محرر موقع أودو — من قالب XML إلى لوحة المقاطع المباشرة. موثق لأودو 18 و19.

iWesabe Editorial Team١ مارس ٢٠٢١6 دقائق للقراءة

محرر السحب والإفلات في موقع أودو مبني على مكوّنات قابلة لإعادة الاستخدام تُسمى المقاطع. كل مكوّن تراه في لوحة المحرر — من البانرات الرئيسية إلى عروض الشهادات — هو مقطع مسجّل عبر عرض XML يرث من قائمة المقاطع الرئيسية. إنشاء مقطعك الخاص يتبع النمط ذاته: كتابة قالب HTML وتسجيله في لوحة المحرر وإضافة خيارات CSS وJavaScript اختياريًا. يغطي هذا الدليل سير العمل الكامل لأودو 18 و19.

ما هو مقطع أودو؟

المقطع (يُسمى أيضًا مكوّن البناء) هو قسم HTML مستقل يمكن لمحرري الموقع سحبه من اللوحة ووضعه في أي صفحة. تتكوّن المقاطع من ثلاثة أجزاء: قالب HTML (المكوّن المرئي)، وعرض تسجيل المقطع (الذي يجعله يظهر في لوحة المحرر)، وخيارات المقطع الاختيارية (فئات JavaScript تضيف عناصر تحكم في المحرر مثل منتقيات الألوان أو تبديلات التخطيط).

نظرة عامة على مكوّنات المقطع
المكوّنموقع الملفمطلوبالغرض
قالب HTMLviews/snippets/s_my_snippet.xmlنعمالمكوّن المرئي الذي يُسقط على الصفحة
عرض التسجيلviews/snippets/snippets.xmlنعميضيف المكوّن إلى لوحة المحرر ضمن فئة
خيارات JS للمقطعstatic/src/js/options.jsلاعناصر تحكم المحرر (التخطيط والألوان ومبدّلات الرؤية)
أنماط CSSstatic/src/scss/s_my_snippet.scssلاأنماط خاصة بمكوّن المقطع
إدخال __manifest__.pyجذر الوحدةنعميُعلن ملفات XML وJS وCSS لمسار الأصول في أودو

هيكل الوحدة

يجب أن تكون المقاطع المخصصة داخل وحدة أودو. إذا كنت تضيف مقطعًا إلى وحدة موقع موجودة، تخطَّ خطوة الهيكل. بالنسبة لوحدة جديدة، التخطيط الأدنى للمجلد هو:

text
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
<?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 الخاصة بها
الفئةهدف XPathالاستخدام النموذجي
المحتوى//div[@id="snippet_content"]بانرات رئيسية وكتل نصية ووسائط
الهيكل//div[@id="snippet_structure"]أعمدة وبطاقات وتخطيطات
الميزات//div[@id="snippet_feature"]عدادات وعلامات تبويب وأقسام قابلة للطي
المحتوى الداخلي//div[@id="snippet_innerContent"]عناصر توضع داخل مقاطع أخرى
xml
<?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

python
{
    '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 الجذري للمقطع.

javascript
/** @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 — تثبيت الوحدة والاختبار

  1. أعد تشغيل خادم أودو لاستيعاب الوحدة الجديدة: `./odoo-bin -c odoo.conf -u my_website_snippets`.
  2. افتح تطبيق الموقع وانقر على **تعديل** في أي صفحة.
  3. في لوحة مكوّنات البناء، حدد مقطعك ضمن الفئة التي سجلته فيها (مثلًا المحتوى).
  4. اسحب المقطع إلى الصفحة وتأكد من أنه يُعرض بشكل صحيح.
  5. انقر على المكوّن المُسقط لفتح لوحة المحرر وتحقق من ظهور أي خيارات مخصصة.
  6. احفظ الصفحة وأعد تحميلها في الوضع العادي (غير التعديل) للتأكد من عرض المقطع بدون نصوص المحرر.

استكشاف الأخطاء — المشكلات الشائعة

مرجع استكشاف أخطاء المقاطع
الأعراضالسبب المحتملالحل
المقطع غير مرئي في لوحة المحرر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` معيارية.

تحتاج إلى مكوّنات موقع مخصصة لموقعك في أودو؟

يبني مطورونا المعتمدون من أودو مقاطع مخصصة وقوالب موقع وتكاملات متجر إلكتروني كاملة مُصمَّمة وفق متطلبات الأعمال السعودية.

واتساب

الأسئلة الشائعة

ما الفرق بين المقطع والودجة في موقع أودو؟
المقطع (مكوّن البناء) هو قسم HTML مستقل يسحبه محرر الموقع من لوحة المحرر إلى صفحة — لا يتطلب كتابة كود بعد الإنشاء. الودجة هي مكوّن واجهة مستخدم Python/JavaScript يُستخدم في نماذج وعروض الواجهة الخلفية لأودو. المقاطع مخصصة للواجهة الأمامية فقط وتُصمَّم لمحرري المحتوى غير التقنيين.
هل يمكنني إضافة مقطع مخصص دون إنشاء وحدة أودو جديدة؟
ليس بشكل موثوق. تتطلب المقاطع عروض XML وأصول JavaScript/CSS محتملة، والتي يجب تعريفها في `__manifest__.py` للوحدة لتبقى بعد التحديثات. إضافتها مباشرة عبر القائمة التقنية للواجهة الخلفية لأودو (`ir.ui.view`) ممكنة للاختبار لكن سيُستبدل ما أُدخل عند تحديثات الوحدة. ضع المقاطع الإنتاجية دائمًا داخل وحدة مناسبة.
كيف أجعل المقطع متاحًا على صفحات محددة فقط؟
استخدم سمة `groups` على عنصر التسجيل `` للتقييد حسب مجموعة المستخدمين، أو استخدم شرط `t-if` يُقيّم السياق. لتصفية نوع الصفحة (مثلًا فقط على منشورات المدونة)، أضف سمة `data-snippet-type` وتعامل معها في طريقة `isShown()` لخيار المقطع لإخفاء المكوّن من اللوحة عندما لا يتطابق نوع الصفحة.
تم حفظ مقطعي على صفحة لكنه اختفى بعد تحديث الوحدة. لماذا؟
إذا تم تعديل XML القالب أو إزالته خلال تحديث، قد يُحيّد أودو نسخ المقاطع المحفوظة التي تستند إلى القالب القديم. تحكم دائمًا في إصدار قوالب المقطع وتجنب إعادة تسمية أو حذف معرّفات القوالب في الإنتاج. إذا كنت تحتاج إلى إعادة هيكلة مقطع، أنشئ معرّف قالب جديدًا واحتفظ بالقديم كاسم مستعار حتى تنتهي من نقل جميع نسخ الصفحات.
هل يمكنني استخدام أودو Studio لإنشاء مقطع؟
لا يدعم أودو Studio حاليًا إنشاء مقاطع الموقع. صُمِّم Studio لعروض الواجهة الخلفية (النماذج والقوائم وكانبان) والحقول وتخصيص التقارير. تتطلب مقاطع الموقع المخصصة تطوير وحدة كما هو موضح في هذا الدليل.
كيف أجعل نص المقطع قابلًا للتحرير بواسطة محرري الموقع؟
أضف الفئة `o_editable` إلى أي عنصر يجب أن يكون محتواه النصي قابلًا للتحرير مباشرة في محرر الموقع. بالنسبة للعناصر المضمّنة (العناوين والفقرات والروابط)، هذا كافٍ. للمحتوى الهيكلي مثل الصور أو الأزرار، استخدم سمات محرر أودو المناسبة (`data-original-src` و`data-bs-target`) التي يتعرف عليها المحرر للحصول على عناصر تحكم أكثر ثراءً.
iWesabe Editorial Team

iWesabe Editorial Team

رؤى عملية حول Odoo ERP وامتثال ZATCA والعمليات الرقمية للشركات السعودية — بقلم فرق الاستشارات والمالية والهندسة في iWesabe.

عن iWesabe

مقالات ذات صلة