摘要:一般情況下都是在中繼承后在其末尾添加相關(guān)資源路徑除了資源需要引入外,我們編寫(xiě)的頁(yè)面模板也許要引入,打開(kāi)并在底部添加我們的自定義頁(yè)面文件大功告成,一個(gè)最簡(jiǎn)單的自定義頁(yè)面已經(jīng)完成了,安裝模塊然后運(yùn)行看看效果吧。
前些天群里的小伙伴問(wèn)了些關(guān)于在 Odoo 管理后臺(tái)自定義頁(yè)面和 Widget 的問(wèn)題,那我就來(lái)寫(xiě)一篇簡(jiǎn)短的內(nèi)容,教大家如何創(chuàng)建自定義頁(yè)面并引用第三方庫(kù)。如果大家有看我之前寫(xiě)的基礎(chǔ)教程的話,應(yīng)該知道我們從一開(kāi)始就是用的是 Odoo11 吧,從今天開(kāi)始,我們的教程全都將基于 Odoo12 進(jìn)行編寫(xiě),所以在開(kāi)始前,請(qǐng)確保你現(xiàn)在使用的是 Odoo12,或者跟隨官方的安裝指南安裝好環(huán)境再開(kāi)始今天的內(nèi)容。
創(chuàng)建模塊話不多說(shuō),先用 scaffold 命令創(chuàng)建一個(gè)新的模塊 custom_page,結(jié)構(gòu)如下:
myaddons └── custom_page ├── __init__.py ├── __manifest__.py ├── controllers ├── demo ├── models ├── security ├── static └── views
我將會(huì)通過(guò)使用 wired-elements 這個(gè) Web Components 組件庫(kù)創(chuàng)建一個(gè)簡(jiǎn)單的自定義頁(yè)面,從而演示如何引入并使用第三方庫(kù)。所以我們先準(zhǔn)備好相關(guān)庫(kù),先下載好這個(gè)庫(kù),然后將它放到 static 目錄下:
static └── lib └── wired-elements └── wired-elements.bundled.min.js
以上的目錄層級(jí)結(jié)構(gòu)是約定俗成的,第三方 JS 庫(kù)推薦都放在 static/lib 下。
創(chuàng)建頁(yè)面接下來(lái)是創(chuàng)建自定義頁(yè)面,同樣的在 static 下創(chuàng)建:
static └── src └── xml └── base.xml
自定義的頁(yè)面、JS 和 CSS 等資源文件,都按約定放置在 static/src 下,下面是自定義頁(yè)面 base.xml 文件的內(nèi)容:
Cancel Submit
頁(yè)面中使用到了 wired-elements 的組件,具體使用方式請(qǐng)參考官方文檔。上面的定義中,我們看到有一個(gè)屬性 t-name,這個(gè)是頁(yè)面的名稱(chēng),可在 JS 中調(diào)用,這里暫不展開(kāi)說(shuō)明。
定義動(dòng)作自定義頁(yè)面實(shí)際上是一個(gè) client action,也就是客戶端動(dòng)作,通過(guò)對(duì) AbstractAction 這個(gè)抽象類(lèi)進(jìn)行擴(kuò)展,從而指定自定義頁(yè)面的模板和頁(yè)面的事件等,下面的代碼定義了一個(gè)最簡(jiǎn)單的客戶端動(dòng)作,它包含了一個(gè)點(diǎn)擊事件:
odoo.define("custom_page.demo", function (require) { "use strict"; var AbstractAction = require("web.AbstractAction"); var core = require("web.core"); var CustomPageDemo = AbstractAction.extend({ template: "DemoPage", events: { "click .demo-submit": "_onSubmitClick" }, _onSubmitClick: function (e) { e.stopPropagation(); alert("Submit clicked!"); } }); core.action_registry.add("custom_page.demo", CustomPageDemo); return CustomPageDemo; });
上面這段代碼的核心部分在 AbstractAction.extend(...) 中,其中 template 指定了自定義頁(yè)面的模板名稱(chēng),也就是我們前面所說(shuō)的 t-name 這個(gè)屬性,而 events 則定義了頁(yè)面的一些事件,如該例中,定義的是當(dāng)點(diǎn)擊(click)帶有類(lèi) .demo-submit 的元素時(shí)執(zhí)行 _onSubmitClick 這個(gè)方法。
需要注意的是,我們需要通過(guò) core.action_registry.add() 這個(gè)方法對(duì)動(dòng)作進(jìn)行注冊(cè),第一個(gè)參數(shù)表示注冊(cè)的動(dòng)作名(tag),第二個(gè)參數(shù)是要注冊(cè)的動(dòng)作對(duì)象。
創(chuàng)建菜單既然自定義的頁(yè)面是一個(gè)動(dòng)作,那么我們就需要?jiǎng)?chuàng)建菜單和它進(jìn)行關(guān)聯(lián),在 views/views.xml 定義菜單:
加載資源Custom Page custom_page.demo
和普通頁(yè)面一樣,頁(yè)面中所引用的 JS 或者 CSS 等資源文件,都需要在頁(yè)面上引入才能使用,在 Odoo 中也不例外,不過(guò)有一點(diǎn)不同的是,Odoo 中有專(zhuān)門(mén)的集中引入資源文件的地方,這樣做是為了將資源進(jìn)行打包壓縮,以減少請(qǐng)求的包體大小。
一般情況下都是在 views/templates.xml 中繼承 web.ssets_backend 后在其末尾添加相關(guān)資源路徑:
除了 JS 資源需要引入外,我們編寫(xiě)的頁(yè)面模板也許要引入,打開(kāi) __manifest__.py 并在底部添加我們的自定義頁(yè)面文件:
"qweb": ["static/src/xml/base.xml"]
OK! 大功告成,一個(gè)最簡(jiǎn)單的自定義頁(yè)面已經(jīng)完成了,安裝模塊然后運(yùn)行看看效果吧。
開(kāi)發(fā)者模式很不幸的是,打開(kāi)之后好像只有幾個(gè)小點(diǎn)在頁(yè)面,然后并沒(méi)有什么東西了。先不慌,我們先打開(kāi)設(shè)置頁(yè)面,然后在頁(yè)面最右側(cè)那一列的底部,可以看到兩個(gè)鏈接,分別是『激活開(kāi)發(fā)者模式』和『激活開(kāi)發(fā)者模式 (帶 assets)』,我們點(diǎn)一下第二個(gè)帶 assets 的鏈接,然后再次訪問(wèn)我們的自定義頁(yè)面,結(jié)果如何?
那兩個(gè)鏈接顧名思義,就是進(jìn)入開(kāi)發(fā)者模式,其中帶 assets 的開(kāi)發(fā)者模式會(huì)跳過(guò)執(zhí)行資源打包的動(dòng)作,在打開(kāi)這個(gè)模式前,我們看到頁(yè)面上的組件擠成一團(tuán)了,是因?yàn)橘Y源打包后導(dǎo)致 wired-elements 的部分屬性無(wú)法找到。
注:以上操作只是為了演示說(shuō)明相關(guān)功能,在生產(chǎn)環(huán)境中,強(qiáng)烈不建議任何非開(kāi)發(fā)或運(yùn)維人員進(jìn)入開(kāi)發(fā)模式進(jìn)行操作。
源碼都在倉(cāng)庫(kù) Odoo-Tutorial-Demo 中,請(qǐng)先自己動(dòng)手實(shí)操,遇到問(wèn)題再下載源碼安裝查看,如果有其他難題可以提出來(lái),我會(huì)抽空解答的~
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/45031.html
摘要:雖然這是個(gè)很簡(jiǎn)單的應(yīng)用,但是希望大家可以動(dòng)手一起操作,從最簡(jiǎn)單的開(kāi)始上手學(xué)習(xí)如何使用這個(gè)框架。則是在和之間,負(fù)責(zé)響應(yīng)用戶操作,從中獲取數(shù)據(jù)進(jìn)行處理并返回到中。 showImg(https://segmentfault.com/img/bV66tE?w=728&h=410); 在第一篇教程發(fā)布之后差不多一個(gè)月的今天,終于完成了第二篇內(nèi)容,這個(gè)發(fā)布周期拖得實(shí)在是有點(diǎn)太長(zhǎng)了,我都覺(jué)得不好意思...
摘要:在前面教程中,我們使用了兩種類(lèi)型的視圖和今天我們將學(xué)習(xí)使用另一種類(lèi)型的視圖搜索視圖。大家可以試試看同時(shí)應(yīng)用多個(gè)分組,或者將分組和過(guò)濾器組合使用,仔細(xì)觀察和思考產(chǎn)生的結(jié)果。還是老規(guī)矩,教程中的代碼會(huì)更新在倉(cāng)庫(kù)中。 showImg(https://segmentfault.com/img/bVbgO85?w=1950&h=1300); 在前面教程中,我們使用了兩種類(lèi)型的視圖——TreeVi...
摘要:大家好鴨,我又來(lái)更新啦還記得我們?cè)诘诙坛讨刑岬竭^(guò)的動(dòng)作嗎,今天我們就來(lái)專(zhuān)門(mén)講講在中的,學(xué)習(xí)不同類(lèi)型的動(dòng)作對(duì)應(yīng)的應(yīng)用場(chǎng)景,并且在我們的應(yīng)用中使用上其中一些類(lèi)型的動(dòng)作。報(bào)表動(dòng)作這類(lèi)型的動(dòng)作用于觸發(fā)報(bào)表打印,例如打印發(fā)票等。 showImg(https://segmentfault.com/img/bVbhdTE?w=1471&h=845); 大家好鴨,我又來(lái)更新啦!還記得我們?cè)诘诙?..
摘要:模塊安裝之后不需要任何配置,這個(gè)模塊對(duì)中的彈窗做了一些優(yōu)化,為了看到效果我們需要找一個(gè)彈窗出來(lái)。在打開(kāi)開(kāi)發(fā)者模式后點(diǎn)擊菜單就有一個(gè)彈窗出現(xiàn)把注意力放在上圖彈窗右上角的高亮處,在安裝該模塊前,高亮位置是沒(méi)有這樣的擴(kuò)展圖標(biāo)的。 好久不見(jiàn),我又回來(lái)了,帶著新的內(nèi)容板塊再次和大家見(jiàn)面啦~這是你沒(méi)有見(jiàn)過(guò)的全新板塊(自動(dòng)播放喳喳輝發(fā)音) 在新的內(nèi)容板塊里,我將會(huì)為大家推薦一些實(shí)用的 Odoo 模塊...
摘要:今天這個(gè)系列教程即將迎來(lái)它的最后一篇內(nèi)容了,我們將要來(lái)學(xué)習(xí)中權(quán)限相關(guān)的內(nèi)容。在的權(quán)限管理體系中,同樣也有用戶組這一概念的存在,和其他框架如可以說(shuō)大同小異。通常和權(quán)限相關(guān)的內(nèi)容,我們都會(huì)在模塊的目錄下進(jìn)行定義,記錄集規(guī)則的定義自然也不例外。 在今年的情人節(jié)(2018.02.14)那天,我寫(xiě)了一篇博客說(shuō)即將要開(kāi)一個(gè)坑,也就是大家在看的這個(gè)系列的教程。今天這個(gè)系列教程即將迎來(lái)它的最后一篇內(nèi)容...
閱讀 1931·2021-09-29 09:35
閱讀 2791·2021-09-22 15:25
閱讀 2043·2021-08-23 09:43
閱讀 2114·2019-08-30 15:54
閱讀 3407·2019-08-30 15:53
閱讀 2455·2019-08-30 13:50
閱讀 2468·2019-08-30 11:24
閱讀 2337·2019-08-29 15:37