Eszközök¶
Az eszközök kezelése az Odoo-ban nem olyan egyszerű, mint néhány más alkalmazásban. Az egyik ok az, hogy különböző helyzetekben van szükség néhány, de nem minden eszközre. Például a web kliens, az értékesítési pont alkalmazás, a weboldal vagy akár a mobilalkalmazás igényei eltérőek. Továbbá, néhány eszköz nagy lehet, de ritkán szükséges: ebben az esetben előfordulhat, hogy lustán (igény szerint) szeretnénk betölteni őket.
Eszköztípusok¶
Három különböző eszköztípus létezik: kód (js fájlok), stílus (css vagy scss fájlok) és sablonok (xml fájlok).
- Kód
Az Odoo támogatja a három különböző típusú javascript fájlt. Ezeket a fájlokat ezután feldolgozzák (a natív JS modulokat odoo modulokká alakítják), majd minifikálják (ha nem
debug=assetsmódban vannak), és összefűzik. Az eredményt fájlmellékletként mentik el. Ezeket a fájlmellékleteket általában egy<script>tag segítségével töltik be az oldal<head>részébe (mint statikus fájl).- Stílus
A stílusok megadhatók akár
css, akár scss formátumban. Hasonlóan a javascript fájlokhoz, ezek a fájlok is feldolgozásra kerülnek (scssfájlokcss-re konvertálódnak), majd minifikálódnak (ismét, ha nemdebug=assetsmódban), és összefűződnek. Az eredmény fájlmellékletként kerül mentésre. Ezeket általában a<head>részben egy<link>tag segítségével töltik be (mint statikus fájl).- Sablon
A sablonok (statikus
xmlfájlok) más módon kerülnek kezelésre: egyszerűen a fájlrendszerből olvassák be őket, amikor szükség van rájuk, és összefűzik őket.Amikor a böngésző betölti az odoo-t, a
/web/webclient/qweb/vezérlőt hívja meg a sablonok lekéréséhez.
Hasznos tudni, hogy a legtöbb esetben a böngésző csak az első alkalommal hajt végre kérést, amikor betölt egy oldalt. Ennek oka, hogy ezek az eszközök mindegyike egy ellenőrző összeggel van társítva, amely be van ágyazva az oldal forrásába. Az ellenőrző összeg hozzáadódik az url-hez, ami azt jelenti, hogy biztonságosan beállítható a gyorsítótár fejlécek hosszú időtartamra.
Csomagok¶
Az Odoo eszközök csomagokba vannak csoportosítva. Minden csomag (specifikus típusú fájlok útvonalainak listája: xml, js, css vagy scss) fel van sorolva a modul manifest-ben. A fájlok glob szintaxissal deklarálhatók, ami azt jelenti, hogy több eszközfájlt is deklarálhat egyetlen sorban.
A csomagok minden modul __manifest__.py fájljában vannak definiálva, egy dedikált assets kulccsal, amely egy szótárt tartalmaz. A szótár a csomagneveket (kulcsok) a bennük található fájlok listájához (értékek) rendeli. Így néz ki:
'assets': {
'web.assets_backend': [
'web/static/src/xml/**/*',
],
'web.assets_common': [
'web/static/lib/bootstrap/**/*',
'web/static/src/js/boot.js',
'web/static/src/js/webclient.js',
'web/static/src/xml/webclient.xml',
],
'web.assets_unit_tests': [
'web/static/src/js/webclient.test.js',
],
},
Íme néhány fontos csomag listája, amelyet a legtöbb odoo fejlesztőnek ismernie kell:
web.assets_common: ez a csomag tartalmazza a legtöbb olyan eszközt, amely közös a web kliens, a weboldal és a pénztár számára. Ez az odoo keretrendszer alacsonyabb szintű építőelemeit hivatott tartalmazni. Vegye figyelembe, hogy tartalmazza aboot.jsfájlt, amely meghatározza az odoo modulrendszert.web.assets_backend: ez a csomag a web klienshez specifikus kódot tartalmazza (különösen a web kliens/akció menedzser/nézetek/statikus XML sablonok)web.assets_frontend: ez a csomag a nyilvános weboldalhoz specifikus elemeket tartalmazza: e-kereskedelem, portál, fórum, blog, …web.assets_unit_tests: all javascript unit testing code (tests, helpers, mocks)
Műveletek¶
Általában az eszközök kezelése egyszerű: csak néhány új fájlt kell hozzáadnia egy gyakran használt csomaghoz, mint például az assets_common vagy az assets_backend. De vannak más műveletek is, amelyek specifikusabb esetekre vonatkoznak.
Vegye figyelembe, hogy minden olyan utasítás, amely egy bizonyos eszközfájlt céloz meg (azaz before, after, replace és remove), megköveteli, hogy a fájl előzetesen deklarálva legyen, akár a hierarchiában magasabb szintű manifesztumokban, akár alacsonyabb sorrendű ir.asset rekordokban.
hozzáfűz¶
Ez a művelet egy vagy több fájlt ad hozzá. Mivel ez a leggyakoribb művelet, egyszerűen a fájl nevének használatával is elvégezhető:
'web.assets_common': [
'my_addon/static/src/js/**/*',
],
Alapértelmezés szerint, ha egy egyszerű karakterláncot ad hozzá egy csomaghoz, a glob mintának megfelelő fájlok a csomag végére kerülnek. Nyilvánvalóan a minta közvetlenül egyetlen fájlútvonal is lehet.
előfűz¶
Adjon hozzá egy vagy több fájlt a csomag elejére.
Hasznos, ha egy bizonyos fájlt a többi elé kell helyezni egy csomagban (például css fájlok esetén). A prepend művelet a következő szintaxissal hívható meg: ('prepend', <path>).
'web.assets_common': [
('prepend', 'my_addon/static/src/css/bootstrap_overridden.scss'),
],
előtt¶
Adjon hozzá egy vagy több fájlt egy adott fájl elé.
Egy fájl csomag elejére történő előkészítése nem biztos, hogy elég pontos. A before utasítás használható a megadott fájl(ok) közvetlenül a célfájl elé történő hozzáadására. Ez úgy van deklarálva, hogy a normál útvonalat egy 3-elemes tuple ('before', <target>, <path>) helyettesíti.
'web.assets_common': [
('before', 'web/static/src/css/bootstrap_overridden.scss', 'my_addon/static/src/css/bootstrap_overridden.scss'),
],
után¶
Adjon hozzá egy vagy több fájlt egy adott fájl után.
Ugyanaz, mint a before, az egyező fájl(ok) közvetlenül a célfájl után kerülnek hozzáadásra. Ez úgy van deklarálva, hogy a normál útvonalat egy 3-elemes tuple ('after', <target>, <path>) helyettesíti.
'web.assets_common': [
('after', 'web/static/src/css/list_view.scss', 'my_addon/static/src/css/list_view.scss'),
],
beilleszt¶
Használjon beágyazott csomagokat.
Az include direktíva egy módja annak, hogy egy csomagot más csomagokban használjunk, ezzel minimalizálva a manifest méretét. Az Odoo-ban alcsomagokat használunk (konvenció szerint aláhúzással előtagolva), hogy csoportosítsuk a több más csomagban használt fájlokat. Ezután megadhatja az alcsomagot egy ('include', <bundle>) párként, így:
'web.assets_common': [
('include', 'web._primary_variables'),
],
eltávolít¶
Egy vagy több fájl eltávolítása.
Bizonyos esetekben előfordulhat, hogy egy vagy több fájlt el szeretne távolítani egy csomagból. Ezt a remove direktíva használatával teheti meg, egy ('remove', <target>) pár megadásával:
'web.assets_common': [
('remove', 'web/static/src/js/boot.js'),
],
cserél¶
Egy eszközfájl cseréje egy vagy több fájlra.
Tegyük fel, hogy egy eszközt nemcsak el kell távolítani, hanem az új verzióját is be szeretné illeszteni pontosan ugyanarra a helyre. Ezt a replace direktívával teheti meg, egy 3 elemű ('replace', <target>, <path>) tuple használatával:
'web.assets_common': [
('replace', 'web/static/src/js/boot.js', 'my_addon/static/src/js/boot.js'),
],
Betöltési sorrend¶
Az eszközök betöltési sorrendje néha kritikus és determinisztikusnak kell lennie, főként a stíluslapok prioritásai és a beállító szkriptek miatt. Az Odoo-ban az eszközök feldolgozása a következőképpen történik:
When an asset bundle is called (e.g.
t-call-assets="web.assets_common"), an empty list of assets is generatedAz
ir.assettípusú rekordok, amelyek megfelelnek a csomagnak, lekérdezésre és sorszám szerint rendezésre kerülnek. Ezután minden rekord, amelynek sorszáma szigorúan kisebb, mint 16, feldolgozásra kerül és alkalmazásra kerül az aktuális eszközlistára.Az összes modul, amely eszközöket deklarál az adott csomaghoz a manifestjében, alkalmazza eszközműveleteit erre a listára. Ez a modulfüggőségek sorrendjének megfelelően történik (pl. a
webeszközök awebsiteelőtt kerülnek feldolgozásra). Ha egy utasítás megpróbál egy már a listában szereplő fájlt hozzáadni, akkor semmi sem történik azzal a fájllal. Más szóval, csak a fájl első előfordulása marad meg a listában.A fennmaradó
ir.assetrekordok (azok, amelyeknek a sorrendje nagyobb vagy egyenlő 16-tal) szintén feldolgozásra és alkalmazásra kerülnek.
A manifestben deklarált eszközöket szükséges lehet egy adott sorrendben betölteni, például a jquery.js fájlt minden más jquery szkript előtt kell betölteni, amikor a lib mappát töltjük be. Az egyik megoldás az lehet, hogy létrehozunk egy ir.asset rekordot alacsonyabb sorrenddel vagy egy «prepend» utasítással, de van egy másik, egyszerűbb mód is erre.
Mivel az eszközök listájában minden fájlútvonal egyedisége garantált, megemlíthet bármilyen konkrét fájlt egy olyan glob előtt, amely tartalmazza azt. Így az a fájl meg fog jelenni a listában az összes többi, a glob által tartalmazott fájl előtt.
'web.assets_common': [
'my_addon/static/lib/jquery/jquery.js',
'my_addon/static/lib/jquery/**/*',
],
Megjegyzés
Egy b modul, amely eltávolítja/helyettesíti az a modulban deklarált eszközöket, függőséget kell, hogy képezzen vele. Az eszközökön való műveletvégzés, amelyek még nem lettek deklarálva, hibát eredményez.
Lusta betöltés¶
Néha hasznos lehet fájlokat és/vagy eszközkötegeket dinamikusan betölteni, például csak akkor betölteni egy könyvtárat, amikor szükség van rá. Ehhez az Odoo keretrendszer néhány segítő függvényt biztosít, amelyek a @web/core/assets fájlban találhatók.
await loadAssets({
jsLibs: ["/web/static/lib/stacktracejs/stacktrace.js"],
});
- loadAssets(assets)¶
- Argumentum
assets (
Object()) – különböző eszközök leírása, amelyeket be kell tölteni
- Visszatérési érték
Ígéret<void>
Load the assets described by the
assetsparameter. It is an object that may contain the following keys:Kulcs
Típus
Leírás
jsLibsstring[]a javascript fájlok URL-jeinek listája
cssLibsstring[]a css fájlok URL-jeinek listája
- useAssets(assets)¶
- Argumentum
assets (
Object()) – különböző eszközök leírása, amelyeket be kell tölteni
Ez a hook hasznos, amikor a komponenseknek eszközöket kell betölteniük az
onWillStartmetódusukban. Belsőleg aloadAssetshívást használja.
Az eszköz modell (ir.asset)¶
A legtöbb esetben a manifestben deklarált eszközök nagyrészt elegendőek lesznek. Azonban a nagyobb rugalmasság érdekében a keretrendszer támogatja az adatbázisban deklarált dinamikus eszközöket is.
Ez úgy történik, hogy ir.asset rekordokat hozunk létre. Ezeket úgy dolgozzák fel, mintha egy modul manifestjében találták volna őket, és ugyanolyan kifejező erővel bírnak, mint a manifest megfelelőik.
nameAz eszközrekord neve (azonosítási célból).
csomagA csomag, amelyben az eszköz alkalmazásra kerül.
directive(alapértelmezett=append)Ez a mező meghatározza, hogyan lesz értelmezve a
path(és szükség esetén atarget). Itt található az elérhető utasítások listája a szükséges argumentumaikkal együtt:hozzáfűz:
pathelőfűz:
pathelőtt:
target,pathután:
target,pathtartalmaz:
path(értelmezve mint egy csomagnév)eltávolít:
path(értelmezve mint egy eltávolítandó cél eszköz)cserél:
target,path
útvonalEgy karakterlánc, amely az alábbiak egyikét határozza meg:
egy relatív útvonal egy eszközfájlhoz az addons fájlrendszerben;
egy glob minta az eszközfájlok halmazára az addons fájlrendszerben;
egy URL egy csatolmányhoz vagy külső eszközfájlhoz;
egy csomag neve, amikor az
includedirektívát használjuk.
célCélfájl, amely meghatározza a pozíciót a csomagban. Csak a
replace,beforeésafterdirektívákkal használható.active(alapértelmezett=True)A rekord aktív-e
sequence(alapértelmezett=16)Az eszközrekordok betöltési sorrendje (növekvő). A 16-nál kisebb sorrend azt jelenti, hogy az eszköz a manifestben deklaráltak előtt kerül feldolgozásra.
Lásd még
Note that the ir.asset use case is mainly for website-related
applications, as it allows for conditional assets (for example, when a style
option is enabled).
In such cases, the <asset id="..."> syntax should be preferred over the
<record id="..." model="ir.asset"> syntax when defining the record in
XML.
See asset, especially about the active value.