本教程是ofbiz 基本應用,它涵蓋了OFBiz應用程序開發過程的基本原理。目標是使開發人員熟悉最佳實踐,編碼慣例,基本控制流程以及開發人員對OFBiz定製所需的全部其餘方面。javascript
本教程將幫助您在OFBiz中構建您的第一個「演示應用程序」。css
· 概述(OFBiz簡介)html
· 設置和運行OFBizjava
· 下載Apache OFBiz框架linux
· 運行Apache OFBizgit
· 建立您的第一個應用程序(Hello World ...)github
· 組件簡介web
· 建立組件數據庫
· 運行你的第一個應用程序apache
· 建立第一個數據庫實體(表)
· 定義實體
· 在實體中加載數據
· 表格和服務
· 建立服務
· 建立添加表單
· 控制器輸入表單
· 建立查找表單
· 使用UI標籤
· 使用其餘引擎的服務
· Java中的服務
· 服務在Groovy
· 活動
· 活動示範
· 服務與事件之間的區別
· 自定義用戶界面
· 使用FreeMarker模板和Groovy腳本
·
· 建立自定義裝飾器
· 下一步是什麼?
1.1 概述(OFBiz簡介)
開放業務(OFBiz)是一套基於通用架構的企業應用程序,採用通用數據,邏輯和流程組件。鬆散耦合的應用程序使得這些組件易於理解,擴展和定製。
OFBiz的工具和架構使得開發和維護企業應用程序變得容易。這使得咱們做爲項目的建立者和維護者有可能快速發佈新功能,並在沒有普遍的努力的狀況下維護現有的功能。當您有特定須要時,還能夠輕鬆定製和擴展示有功能。
單獨的架構使您能夠更輕鬆地根據須要自定義應用程序,但若是系統未做爲開源軟件分發,系統中許多最佳的靈活性點將是無心義的,甚至是不可能的。OFBiz是根據Apache許可證版本2.0受權的,它授予您自定義,擴展,修改,從新包裝,轉售和系統許多其餘潛在用途的權利。
對這些活動沒有限制,由於咱們認爲這些活動對於有效使用此類軟件是必要的。與其餘開源許可證(如GPL)不一樣,您的更改沒必要做爲開放源代碼發佈。對核心項目進行某些改進,修復和補充有明顯的好處,但一些更改將涉及不得向公衆發佈的專有或機密信息。所以,OFBiz使用不須要此功能的Apache許可證版本2.0。有關開源許可的更多信息,請參閱開源計劃(OSI)網站 www.opensource.org。
這個開源模式的另外一個好處是,咱們收到來自使用該軟件的用戶的不斷反饋。咱們收到了OFBiz的用戶和潛在用戶的無數錯誤修復,改進建議和最佳實踐業務建議。該項目中許多最大的功能都受到與發送到與項目相關聯的郵件列表的一些評論或建議的啓發。有幾十個組織使用該軟件,而且可能使用該項目中的一個或另外一個部署了數百個部署的站點,咱們一般天天會收到20-30封電子郵件關於該項目。
爲了確保咱們的功能是及時和有用的,咱們始終從研究咱們正在開發的任何組件的公共標準和常見用法開始。這有助於咱們支持和使用經常使用的詞彙,併爲咱們提供了只能經過標準流程和其餘團隊努力來實現的即時普遍的選項和功能。它也打開了將來的門,與您的組織內部和合做夥伴或其餘組織中圍繞相同標準構建的其餘系統進行靈活通訊。
系統附帶的應用程序和應用程序組件爲您提供了一個普遍而靈活的基礎,能夠與最佳實踐基礎設計一塊兒使用,或根據您本身的特殊需求進行定製。應用程序便於從各方和產品到會計,客戶服務以及內部資源和資產管理的一切管理。
參考:http : //ofbiz.apache.org/apache-ofbiz-project-overview.html
1.2 設置和運行OFBiz
1.2.1 下載Apache OFBiz框架
若是您尚未在您的機器上籤出Apache OFBiz Framework,那麼咱們來作。任何人均可以在OFBiz公共Subversion(SVN)存儲庫中檢出或瀏覽源代碼。若是您沒有Subversion,要安裝它,您能夠去 這裏 獲取說明。
要檢查源代碼,只需使用如下命令(若是您正在使用GUI客戶端,請適當配置):
· 發佈 :$ svnco http://svn.apache.org/repos/asf/ofbiz/branches/release15.12 ofbiz.15.12
有關更多詳細信息,請參閱 Apache OFBiz Source Repository 頁面。
1.2.2 運行Apache OFBiz
· 使用命令行,構建和啓動OFBiz(使用演示數據),使用命令:
$ ./ant load-demo start (For linux/mac it will work, for Windows $OFBIZ_HOME/ant.bat come bundled with OFBiz for Windows) |
以上命令將加載演示數據(樣品數據運行應用程序)自帶的OFBiz在 Derby 數據庫,它配置了OFBiz。
· 將您的瀏覽器指向 http:// localhost:8080 / webtools, 並使用用戶名「admin」和密碼「ofbiz」登錄,並查看一下。
就是這樣,Apache OFBiz如今在你的系統上運行!
1.3 建立您的第一個應用程序(HelloWorld ...)
1.3.1 組件簡介
OFBiz組件是一個文件夾,包含一個名爲「ofbiz-component.xml」的特殊xml文件,它描述了組件要加載和要求的資源。
OFBiz自己是一組組件。
· 框架組件:這些是嚮應用程序組件提供技術層和工具的較低級別組件; 這些組件提供的功能一般是任何其餘開發框架(數據層,業務邏輯層,事務處理,數據源池等)提供的功能。
· 應用程序組件:這些是可擴展/定製(產品,訂單,派對,製造,會計等)的ERP應用程序所需的通用業務組件; 應用程序組件能夠訪問由框架組件提供的服務和工具以及由其餘應用程序組件發佈的服務。
· 專用組件:這些組件與應用程序組件相似,但適用於電子商務,谷歌基礎集成,eBay集成等專用應用程序。
· 熱部署組件:這是一個可用於自定義開發的空組件。自定義組件能夠擴展/覆蓋,全部其餘組件發布的資源。
1.3.2 建立組件
在Hot-deploy目錄中的OFBiz中設置新的自定義組件很是簡單。使用命令行,您只需運行如下命令並回答有關命名您的自定義組件,組件資源,webapp和base權限的問題,以下所示:
$ ./ant create-component Buildfile: /home/ofbiz_dev/Apache_OFBiz/ofbiz-15.12/build.xml create-component: [input] Component name: (e.g. mycomponent) [Mandatory] ofbizdemo [input] Component resource name: (e.g. MyComponent) [Mandatory] OfbizDemo [input] Webapp name: (e.g. mycomponent) [Mandatory] ofbizdemo [input] Base permission: (e.g. MYCOMPONENT) [Mandatory] OFBIZDEMO [echo] The following hot-deploy component will be created: [echo] Name: ofbizdemo [echo] Resource Name: OfbizDemo [echo] Webapp Name: ofbizdemo [echo] Base permission: OFBIZDEMO [echo] Folder: /home/ofbiz_dev/Apache_OFBiz/ofbiz-15.12/hot-deploy/ofbizdemo [echo] [input] Confirm: (Y, [N], y, n) y |
1.3.3 運行你的第一個應用程序
在運行咱們的第一個組件以前,讓咱們說「Hello to the World」
1. 只需從ofbizdemo組件(剛纔建立)中打開$ OFBIZ_HOME /hot-deploy / ofbizdemo / widget / OfbizDemoScreens.xml文件,
<?xmlversion="1.0"encoding="UTF-8"?> <screens xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="<a href="http://ofbiz.apache.org/dtds/widget-screen.xsd" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://ofbiz.apache.org/dtds/widget-screen.xsd"> <screen name="main"> <section> <actions> <set field="headerItem" value="main"/><!-- this highlights the selected menu-item with name "main" --> </actions> <widgets> <decorator-screen name="OfbizDemoCommonDecorator" location="${parameters.mainDecoratorLocation}"> <decorator-section name="body"> <label text="Hello World!! :)"/> </decorator-section> </decorator-screen> </widgets> </section> </screen> </screens> |
咱們只添加了 <label text =「Hello World !! :)」/>
2. 如今,您將須要從新啓動OFBiz($ ./ant load-demo start)。這是必需的,因爲您已經爲組件創建了一些新的組件(默認狀況下,您的組件數據目錄中爲OfbizDemoSecurityGroupDemoData.xml),而且您將從新啓動它,還將加載ofbizdemo組件。
3. 因爲OFBiz從新啓動,直接將您的瀏覽器轉到您的應用程序 http:// localhost:8080 / ofbizdemo
4. 您將被要求登錄。用戶登錄:admin密碼:ofbiz。
5. 當您登錄時,您將看到bizdemo應用程序與您在屏幕中顯示的hello world消息,以下圖所示。
就是這樣,恭喜你的第一個組件是安裝和運行的。
1.3.4 建立第一個數據庫實體(表)
1.3.4.1 定義實體
要在數據庫中建立自定義實體/表,您只須要在 yourbizdemo應用程序的$ OFBIZ_HOME / hot-deploy / ofbizdemo / entitydef /entitymodel.xml文件中提供實體定義 。當您使用ant目標設置組件時,此文件結構已被設置。您只須要進入並提供實體定義,以下所示。在這裏,咱們將爲forbizdemo應用程序添加兩個新實體。
<?xml version="1.0" encoding="UTF-8"?> <entitymodel xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="<a href="http://ofbiz.apache.org/dtds/entitymodel.xsd" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://ofbiz.apache.org/dtds/entitymodel.xsd"> <title>Entity of an Open For Business Project Component</title> <description>None</description> <version>1.0</version> <entity entity-name="OfbizDemoType" package-name="org.ofbiz.ofbizdemo" title="OfbizDemo Type Entity"> <field name="ofbizDemoTypeId" type="id-ne"><description>primary sequenced ID</description></field> <field name="description" type="description"></field> <prim-key field="ofbizDemoTypeId"/> </entity> <entity entity-name="OfbizDemo" package-name="org.ofbiz.ofbizdemo" title="OfbizDemo Entity"> <field name="ofbizDemoId" type="id-ne"><description>primary sequenced ID</description></field> <field name="ofbizDemoTypeId" type="id-ne"></field> <field name="firstName" type="name"></field> <field name="lastName" type="name"></field> <field name="comments" type="comment"></field> <prim-key field="ofbizDemoId"/> <relation type="one" fk-name="ODEM_OD_TYPE_ID" rel-entity-name="OfbizDemoType"> <key-map field-name="ofbizDemoTypeId"/> </relation> </entity> </entitymodel> |
如今看看$OFBIZ_HOME / hot-deploy / ofbizdemo / ofbiz-component.xml文件。您已經擁有資源條目,用於在組件加載時將這些實體從定義加載到數據庫。以下所示:
<entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel.xml"/> |
要檢查簡單地從新啓動OFBiz(Ctrl + C後跟「./ant start」),並將瀏覽器引導到實體數據維護工具,請執行如下操做: https:// localhost:8443 / webtools / control / entitymaint, 並搜索實體OfbizDemoType和OfbizDemo。你會看到它以下圖給出的圖像。
爲實體準備數據
當您設置自定義實體時,如今是準備一些示例數據的時候了。您能夠在$ OFBIZ_HOME / hot-deploy/ ofbizdemo / data / OfbizDemoTypeData.xml 和$ OFBIZ_HOME /hot-deploy / ofbizdemo / data / OfbizDemoDemoData.xml中的數據目錄下的數據XML文件中執行此操做。設置以下所示:
OfbizDemoTypeData.xml
<?xml version="1.0" encoding="UTF-8"?> <entity-engine-xml> <OfbizDemoType ofbizDemoTypeId="INTERNAL" description="Internal Demo - Office"/> <OfbizDemoType ofbizDemoTypeId="EXTERNAL" description="External Demo - On Site"/> </entity-engine-xml> |
OfbizDemoDemoData.xml
<?xml version="1.0" encoding="UTF-8"?> <entity-engine-xml> <OfbizDemo ofbizDemoId="SAMPLE_DEMO_1" ofbizDemoTypeId="INTERNAL" firstName="Sample First 1" lastName="Sample Last 1" comments="This is test comment for first record."/> <OfbizDemo ofbizDemoId="SAMPLE_DEMO_2" ofbizDemoTypeId="INTERNAL" firstName="Sample First 2" lastName="Sample last 2" comments="This is test comment for second record."/> <OfbizDemo ofbizDemoId="SAMPLE_DEMO_3" ofbizDemoTypeId="EXTERNAL" firstName="Sample First 3" lastName="Sample last 3" comments="This is test comment for third record."/> <OfbizDemo ofbizDemoId="SAMPLE_DEMO_4" ofbizDemoTypeId="EXTERNAL" firstName="Sample First 4" lastName="Sample last 4" comments="This is test comment for fourth record."/> </entity-engine-xml> |
如今再來看看 $ OFBIZ_HOME / hot-deploy / ofbizdemo /ofbiz-component.xml 文件。您已經有資源條目用於將這些文件中準備的數據加載爲:
inbiz-component.xml中的條目
<entity-resource type="data" reader-name="seed" loader="main" location="data/OfbizDemoTypeData.xml"/> <entity-resource type="data" reader-name="demo" loader="main" location="data/OfbizDemoDemoData.xml"/> |
1.3.4.2 在實體中加載數據
此時將此樣本數據加載到定義的實體/表中,您能夠在控制檯上運行「ant load-demo」,也能夠直接在webtools中加載實體xml https:// localhost:8443 / webtools / control /EntityImport。
簡單地將你的xml數據放在「完整的XML文檔(根標籤:entity-engine-xml)」中:「文本區域並點擊」導入文本「,以下圖所示
當您點擊導入文本時,它將加載數據,並顯示以下所示的結果
完成數據加載過程後,再次訪問實體數據維護(https:// localhost:8443 / webtools / control / entitymaint)並檢查您的實體,您將在這裏找到剛剛加載的數據。
就是這樣,你已經成功地將數據導入數據庫表,超級容易,對!
1.4 表格和服務
在上一節中,咱們已經看到了如何建立實體(表),如今是建立一個表單的時候了,該表單將容許您在該實體中建立條目。
1.4.1 建立服務
在準備表單以前,讓咱們 在服務定義xml文件($ OFBIZ_HOME /hot-deploy / ofbizdemo / servicedef / services.xml)中爲OfbizDemo實體編寫一個 服務來建立記錄。
的services.xml
<?xml version="1.0" encoding="UTF-8"?> <services xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="<a href="http://ofbiz.apache.org/dtds/services.xsd" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://ofbiz.apache.org/dtds/services.xsd"> <description>OfbizDemo Services</description> <vendor></vendor> <version>1.0</version> <service name="createOfbizDemo" default-entity-name="OfbizDemo" engine="entity-auto" invoke="create" auth="true"> <description>Create an Ofbiz Demo record</description> <auto-attributes include="pk" mode="OUT" optional="false"/> <auto-attributes include="nonpk" mode="IN" optional="false"/> <override name="comments" optional="true"/> </service> </services> |
如今再來看看$OFBIZ_HOME / hot-deploy / ofbizdemo / ofbiz-component.xml文件。您已經有資源條目,用於將此文件中定義的服務加載爲:
<!-- service resources: model(s), eca(s) and group definitions --> <service-resource type="model" loader="main" location="servicedef/services.xml"/> |
對於要加載的服務定義,您將須要從新啓動OFBiz。要測試此服務,您直接轉到webtools - >運行服務選項: https:// localhost:8443 / webtools / control / runService
經過Web工具運行服務:這是由框架提供的智能實用程序來運行您的服務。
在提交上述表格後,您將提交一份表格,以輸入服務的IN參數。
1.4.2 建立添加表單
讓咱們爲這個服務建立咱們的第一個表單,讓咱們編輯位於$ OFBIZ_HOME / hot-deploy / ofbizdemo / widget /OfbizDemoForms.xml的現有文件, 併爲OfbizDemo添加Create Form,以下所示:
OfbizDemoForms.xml
<?xml version="1.0" encoding="UTF-8"?> <forms xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="<a href="http://ofbiz.apache.org/dtds/widget-form.xsd" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://ofbiz.apache.org/dtds/widget-form.xsd"> <form name="AddOfbizDemo" type="single" target="createOfbizDemo"> <!-- We have this utility in OFBiz to render form based on service definition. Service attributes will automatically lookedup and will be shown on form --> <auto-fields-service service-name="createOfbizDemo"/> <field name="ofbizDemoTypeId" title="${uiLabelMap.CommonType}"> <drop-down allow-empty="false" current-description=""> <!---We have made this drop down options dynamic(Values from db) using this --> <entity-options description="${description}" key-field-name="ofbizDemoTypeId" entity-name="OfbizDemoType"> <entity-order-by field-name="description"/> </entity-options> </drop-down> </field> <field name="submitButton" title="${uiLabelMap.CommonAdd}"><submit button-type="button"/></field> </form> </forms> |
在這裏,您能夠注意到咱們已經使用auto-fields-service來根據服務定義IN / OUT屬性自動生成表單。
轉到屏幕xml文件(OfbizDemoScreens.xml)將此表單位置添加到您用於顯示Hello World...文本的屏幕中。以下所示
將表單位置添加到主屏幕
<?xml version="1.0" encoding="UTF-8"?> <screens xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="<a href="http://ofbiz.apache.org/dtds/widget-screen.xsd" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://ofbiz.apache.org/dtds/widget-screen.xsd"> <screen name="main"> <section> <actions> <set field="headerItem" value="main"/> <!-- this highlights the selected menu-item with name "main" --> </actions> <widgets> <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}"> <decorator-section name="body"> <screenlet title="Add Ofbiz Demo"> <include-form name="AddOfbizDemo" location="component://ofbizdemo/widget/OfbizDemoForms.xml"/> </screenlet> </decorator-section> </decorator-screen> </widgets> </section> </screen> </screens> |
1.4.3 控制器輸入表單
在您進入表單並從添加表單開始建立OfbizDemo記錄以前,您將須要在$ OFBIZ_HOME / hot-deploy / ofbizdemo / webapp / ofbizdemo/ WEB-INF / controller.xml 文件中爲目標服務建立一個條目, 該目錄服務將在提交表單時調用。您能夠按照下面所示的請求映射在您的bizdemo應用程序控制器文件中進行操做:
<request-map uri="createOfbizDemo"> <security https="true" auth="true"/> <event type="service" invoke="createOfbizDemo"/> <response name="success" type="view" value="main"/> </request-map> |
一切設置,咱們來看看最近建立的表單 http:// localhost:8080 / ofbizdemo
主鍵(ofbizDemoId)不須要使用表單發送,它將由OFBiz在db記錄中自動排序。
1.4.4
建立查找表單
讓咱們爲實體OfbizDemo建立一個查找表單,以便您搜索所建立的OfbizDemos。
1.在OfbizDemoForms.xml中添加表單(FindOfbizDemo和ListOfbizDemo)
OfbizDemoForms.xml
<form name="FindOfbizDemo" type="single" target="FindOfbizDemo" default-entity-name="OfbizDemo"> <field name="noConditionFind"><hidden value="Y"/> <!-- if this isn't there then with all fields empty no query will be done --></field> <field name="ofbizDemoId" title="${uiLabelMap.OfbizDemoId}"><text-find/></field> <field name="firstName" title="${uiLabelMap.OfbizDemoFirstName}"><text-find/></field> <field name="lastName" title="${uiLabelMap.OfbizDemoLastName}"><text-find/></field> <field name="ofbizDemoTypeId" title="${uiLabelMap.OfbizDemoType}"> <drop-down allow-empty="true" current-description=""> <entity-options description="${description}" key-field-name="ofbizDemoTypeId" entity-name="OfbizDemoType"> <entity-order-by field-name="description"/> </entity-options> </drop-down> </field> <field name="searchButton" title="${uiLabelMap.CommonFind}" widget-style="smallSubmit"><submit button-type="button" image-location="/images/icons/magnifier.png"/></field> </form> <form name="ListOfbizDemo" type="list" list-name="listIt" paginate-target="FindOfbizDemo" default-entity-name="OfbizDemo" separate-columns="true" odd-row-style="alternate-row" header-row-style="header-row-2" default-table-style="basic-table hover-bar"> <actions> <!-- Preparing search results for user query by using OFBiz stock service to perform find operations on a single entity or view entity --> <service service-name="performFind" result-map="result" result-map-list="listIt"> <field-map field-name="inputFields" from-field="ofbizDemoCtx"/> <field-map field-name="entityName" value="OfbizDemo"/> <field-map field-name="orderBy" from-field="parameters.sortField"/> <field-map field-name="viewIndex" from-field="viewIndex"/> <field-map field-name="viewSize" from-field="viewSize"/> </service> </actions> <field name="ofbizDemoId" title="${uiLabelMap.OfbizDemoId}"><display/></field> <field name="ofbizDemoTypeId" title="${uiLabelMap.OfbizDemoType}"><display-entity entity-name="OfbizDemoType"/></field> <field name="firstName" title="${uiLabelMap.OfbizDemoFirstName}" sort-field="true"><display/></field> <field name="lastName" title="${uiLabelMap.OfbizDemoLastName}" sort-field="true"><display/></field> <field name="comments" title="${uiLabelMap.OfbizDemoComment}"><display/></field> </form> |
表單或屏幕的操做標籤用於您的視圖的數據準備邏輯。
咱們已經使用OOTB OFBiz通用服務performFind進行搜索操做,當您必須在一個實體或一個視圖實體上執行搜索時,該操做便於使用。
2.)在下一步中,咱們將在屏幕中包含這些表單,咱們將這些表單添加到 OfbizDemoScreens.xml 文件中。對於這種包括 FindOfbizDemo 在下面定義屏幕 OfbizDemoScreens.xml
<!-- Find and list all ofbizdemos in a tabular format --> <screen name="FindOfbizDemo"> <section> <actions> <set field="headerItem" value="findOfbizDemo"/> <set field="titleProperty" value="PageTitleFindOfbizDemo"/> <set field="ofbizDemoCtx" from-field="parameters"/> </actions> <widgets> <decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}"> <decorator-section name="body"> <section> <condition> <if-has-permission permission="OFBIZDEMO" action="_VIEW"/> </condition> <widgets> <decorator-screen name="FindScreenDecorator" location="component://common/widget/CommonScreens.xml"> <decorator-section name="search-options"> <include-form name="FindOfbizDemo" location="component://ofbizdemo/widget/OfbizDemoForms.xml"/> </decorator-section> <decorator-section name="search-results"> <include-form name="ListOfbizDemo" location="component://ofbizdemo/widget/OfbizDemoForms.xml"/> </decorator-section> </decorator-screen> </widgets> <fail-widgets> <label style="h3">${uiLabelMap.OfbizDemoViewPermissionError}</label> </fail-widgets> </section> </decorator-section> </decorator-screen> </widgets> </section> </screen> |
3.)在controller.xml中添加訪問此新的Find Ofbiz演示頁面的請求映射
<!-- Request Mapping --> <request-map uri="FindOfbizDemo"><security https="true" auth="true"/><response name="success" type="view" value="FindOfbizDemo"/></request-map> <!-- View Mapping --> <view-map name="FindOfbizDemo" type="screen" page="component://ofbizdemo/widget/OfbizDemoScreens.xml#FindOfbizDemo"/> |
如今,咱們來添加一個顯示查找選項的菜單。
在OFBiz中建立菜單很是簡單,全部菜單都定義爲* menus.xml。
當咱們從ant目標建立一個組件時,咱們獲得一個名爲OfbizDemoMenus.xml的文件
在OfbizDemoMenus.xml文件中建立如下條目。
OfbizDemoMenus.xml
<?xml version="1.0" encoding="UTF-8"?> <menus xmlns:xsi="<a href="http://www.w3.org/2001/XMLSchema-instance" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="<a href="http://ofbiz.apache.org/dtds/widget-menu.xsd" "="" style="color: rgb(50, 108, 166); text-decoration-line: none; border-radius: 0px !important; background: none !important; border: 0px !important; bottom: auto !important; float: none !important; height: auto !important; left: auto !important; line-height: 20px !important; margin: 0px !important; outline: 0px !important; overflow: visible !important; padding: 0px !important; position: static !important; right: auto !important; top: auto !important; vertical-align: baseline !important; width: auto !important; box-sizing: content-box !important; min-height: auto !important;">http://ofbiz.apache.org/dtds/widget-menu.xsd"> <menu name="MainAppBar" title="${uiLabelMap.OfbizDemoApplication}" extends="CommonAppBarMenu" extends-resource="component://common/widget/CommonMenus.xml"> <menu-item name="main" title="${uiLabelMap.CommonMain}"><link target="main"/></menu-item> <menu-item name="findOfbizDemo" title="${uiLabelMap.OfbizDemoFind}"><link target="FindOfbizDemo"/></menu-item> </menu> </menus> |
1.4.5 使用UI標籤
Apache OFBiz的國際化真的很容易,咱們定義了各類語言的UI標籤,而且基於用戶的區域設置,顯示了相應的標籤。
如下是UI標籤的示例(在建立組件<component-name>時,默認狀況下會建立UiLabels.xml,在本例中爲 OfbizDemoUiLabels.xml)
OfbizDemoUiLabels.xml
<property key="OfbizDemoFind"> <value xml:lang="en">Find</value> </property> <property key="OfbizDemoFirstName"> <value xml:lang="en">First Name</value> </property> <property key="OfbizDemoId"> <value xml:lang="en">OFBiz Demo Id</value> </property> <property key="OfbizDemoLastName"> <value xml:lang="en">Last Name</value> </property> |
如今只需從新啓動服務器,根據ofbizdemo應用程序(https:// localhost:8443 / ofbizdemo /control / main),您將看到「查找」菜單選項。
1.5 使用其餘引擎的服務
只要您必須構建業務邏輯,您應該更願意編寫服務來利用內置的服務引擎中的功能。
您以前建立的服務「createOfbizDemo」正在使用engine =「entity-auto」,所以您不須要提供其實現,OFBiz負責建立操做。當您須要處理涉及從數據庫和定製邏輯構建的多個實體的服務中的複雜操做時,您須要爲您的服務提供自定義實現。在本節中,咱們將重點介紹這一點。
1.5.1 Java中的服務
您能夠在Java中實現一個服務,以下面給出的步驟所示:
1.)定義您的服務,這裏再次,咱們將在咱們的定製Ofbiz演示應用程序的同一個實體(OfbizDemo)上運行。打開您的服務定義文件$OFBIZ_HOME / hot-deploy / ofbizdemo / servicedef / services.xml並添加新定義:
的services.xml
<service name="createOfbizDemoByJavaService" default-entity-name="OfbizDemo" engine="java" location="com.companyname.ofbizdemo.services.OfbizDemoServices" invoke="createOfbizDemo" auth="true"> <description>Create an Ofbiz Demo record using a service in Java</description> <auto-attributes include="pk" mode="OUT" optional="false"/> <auto-attributes include="nonpk" mode="IN" optional="false"/> <override name="comments" optional="true"/> </service> |
注意咱們有這個時候使用engine =「java」。
2.)在您的ofbizdemo組件src目錄中建立包,例如src - > com - > companyname - >ofbizdemo - > services。必須在Java中實現的服務能夠放在您的應用程序的此目錄中。
3.)在服務目錄和實現方法中,在文件OfbizDemoServices.java中定義新的Java類,這將由您的服務定義調用,以下所示:
OfbizDemoServices.java
package com.companyname.ofbizdemo.services; import java.util.Map; import org.ofbiz.base.util.Debug; import org.ofbiz.entity.Delegator; import org.ofbiz.entity.GenericEntityException; import org.ofbiz.entity.GenericValue; import org.ofbiz.service.DispatchContext; import org.ofbiz.service.ServiceUtil; public class OfbizDemoServices { public static final String module = OfbizDemoServices.class.getName(); public static Map<String, Object> createOfbizDemo(DispatchContext dctx, Map<String, ? extends Object> context) { Map<String, Object> result = ServiceUtil.returnSuccess(); Delegator delegator = dctx.getDelegator(); try { GenericValue ofbizDemo = delegator.makeValue("OfbizDemo"); // Auto generating next sequence of ofbizDemoId primary key ofbizDemo.setNextSeqId(); // Setting up all non primary key field values from context map ofbizDemo.setNonPKFields(context); // Creating record in database for OfbizDemo entity for prepared value ofbizDemo = delegator.create(ofbizDemo); result.put("ofbizDemoId", ofbizDemo.getString("ofbizDemoId")); Debug.log("==========This is my first Java Service implementation in Apache OFBiz. OfbizDemo record created successfully with ofbizDemoId: "+ofbizDemo.getString("ofbizDemoId")); } catch (GenericEntityException e) { Debug.logError(e, module); return ServiceUtil.returnError("Error in creating record in OfbizDemo entity ........" +module); } return result; } } |
4.)中止服務器並使用「./antclean build start」從新啓動,它將編譯您的類,並在whenbiz從新啓動哪一個更新的jar文件時使其可用。
5.)使用webtools ->運行服務選項(https:// localhost:8443 / webtools / control / runService)實現測試服務,或者簡單地更新您的控制器請求調用的服務名稱,以使用此服務,並使用添加表單在你之前準備的應用程序中 經過這樣作,你的Add OfbizDemo表單將調用這個java服務。
<request-map uri="createOfbizDemo"> <security https="true" auth="true"/> <event type="service" invoke="createOfbizDemoByJavaService"/> <response name="success" type="view" value="main"/> </request-map> |
爲了確保這個新的服務實現正在執行,您可使用Debug.log(....)在控制檯日誌中查看已經放在代碼中的這一行。對於登陸OFBiz,您必須始終在Java類中使用Debug類方法。
控制檯日誌
[java] 2014-06-24 12:11:37,282 (http-bio-0.0.0.0-8443-exec-2) [ OfbizDemoServices.java:28 :INFO ] ==========This is my first Java Service implementation in Apache OFBiz. OfbizDemo record created successfully with ofbizDemoId: ...... |
1.5.2 服務在Groovy
爲了利用即時編譯的功能和更少的代碼行,您可使用Groovy DSL實如今OFBiz中構建業務邏輯的服務。
要使用Groovy實現服務,您能夠按照如下步驟:
1.)將新的服務定義添加到services /services.xml文件中:
的services.xml
<service name="createOfbizDemoByGroovyService" default-entity-name="OfbizDemo" engine="groovy" location="component://ofbizdemo/script/com/companyname/ofbizdemo/OfbizDemoServices.groovy" invoke="createOfbizDemo" auth="true"> <description>Create an Ofbiz Demo record using a service in Java</description> <auto-attributes include="pk" mode="OUT" optional="false"/> <auto-attributes include="nonpk" mode="IN" optional="false"/> <override name="comments" optional="true"/> </service> |
2.)在這裏添加新的groovy服務文件 組件://ofbizdemo/script/com/companyname/ofbizdemo/OfbizDemoServices.groovy
3.)將服務實現添加到文件OfbizDemoServices.groovy中
OfbizDemoServices.groovy
import org.ofbiz.entity.GenericEntityException; def createOfbizDemo() { result = [:]; try { ofbizDemo = delegator.makeValue("OfbizDemo"); // Auto generating next sequence of ofbizDemoId primary key ofbizDemo.setNextSeqId(); // Setting up all non primary key field values from context map ofbizDemo.setNonPKFields(context); // Creating record in database for OfbizDemo entity for prepared value ofbizDemo = delegator.create(ofbizDemo); result.ofbizDemoId = ofbizDemo.ofbizDemoId; logInfo("==========This is my first Groovy Service implementation in Apache OFBiz. OfbizDemo record " +"created successfully with ofbizDemoId: "+ofbizDemo.getString("ofbizDemoId")); } catch (GenericEntityException e) { logError(e.getMessage()); return error("Error in creating record in OfbizDemo entity ........"); } return result; } |
4.)中止服務器並從新開始使用./ant start,此次咱們只須要加載新的服務定義,而不須要顯式編譯做爲其在Groovy中的服務實現。
5.)使用webtools ->運行服務選項(https:// localhost:8443 / webtools / control / runService)實現測試服務,或者簡單地更新您的控制器請求調用的服務名稱,以使用此服務,並使用添加表單在您的應用程序,您以前準備測試。經過這樣作,您的AddOfbizDemo表單將稱之爲groovy服務。
controller.xml
<request-map uri="createOfbizDemo"> <security https="true" auth="true"/> <event type="service" invoke="createOfbizDemoByGroovyService"/> <response name="success" type="view" value="main"/> </request-map> |
爲了確保這個新的服務實現正在執行,您可使用Debug.log(....)在控制檯日誌中查看已經放在代碼中的這一行。對於登陸OFBiz,您必須始終在Java類中使用Debug類方法。
[java] 2014-06-24 12:11:37,282 (http-bio-0.0.0.0-8443-exec-2) [ OfbizDemoServices.java:28 :INFO ] ==========This is my first Groovy Service implementation in Apache OFBiz. OfbizDemo record created successfully with ofbizDemoId: ..... |
要得到更多關於使用Groovy DSL在Apache OFBiz中進行服務和事件實現的細節,您能夠在這裏將 OFBiz Wiki中的Jacopo Cappellato建立的文檔引用到 這裏。
1.6 活動
1.6.1 活動示範
Apache OFBiz中的事件只是使用HttpServletRequest和HttpServletResponse對象使用的方法。您不須要像服務同樣提供這些定義。這些從控制器直接調用。當您要將自定義服務器端驗證添加到輸入參數時,事件也頗有用。對於執行數據庫操做,您仍然能夠從事件中調用預構建的服務。
要在OFBiz中寫一個事件,請按照下列步驟操做:
1.)添加一個新的事件目錄到包和一個新的Events類文件,以下所述:
OfbizDemoEvents.java
package com.companyname.ofbizdemo.events; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.ofbiz.base.util.Debug; import org.ofbiz.base.util.UtilMisc; import org.ofbiz.base.util.UtilValidate; import org.ofbiz.entity.Delegator; import org.ofbiz.entity.GenericValue; import org.ofbiz.service.GenericServiceException; import org.ofbiz.service.LocalDispatcher; public class OfbizDemoEvents { public static final String module = OfbizDemoEvents.class.getName(); public static String createOfbizDemoEvent(HttpServletRequest request, HttpServletResponse response) { Delegator delegator = (Delegator) request.getAttribute("delegator"); LocalDispatcher dispatcher = (LocalDispatcher) request.getAttribute("dispatcher"); GenericValue userLogin = (GenericValue) request.getSession().getAttribute("userLogin"); String ofbizDemoTypeId = request.getParameter("ofbizDemoTypeId"); String firstName = request.getParameter("firstName"); String lastName = request.getParameter("lastName"); if (UtilValidate.isEmpty(firstName) || UtilValidate.isEmpty(lastName)) { String errMsg = "First Name and Last Name are required fields on the form and can't be empty."; request.setAttribute("_ERROR_MESSAGE_", errMsg); return "error"; } String comments = request.getParameter("comments"); try { Debug.logInfo("=======Creating OfbizDemo record in event using service createOfbizDemoByGroovyService=========", module); dispatcher.runSync("createOfbizDemoByGroovyService", UtilMisc.toMap("ofbizDemoTypeId", ofbizDemoTypeId, "firstName", firstName, "lastName", lastName, "comments", comments, "userLogin", userLogin)); } catch (GenericServiceException e) { String errMsg = "Unable to create new records in OfbizDemo entity: " + e.toString(); request.setAttribute("_ERROR_MESSAGE_", errMsg); return "error"; } request.setAttribute("_EVENT_MESSAGE_", "OFBiz Demo created succesfully."); return "success"; } } |
2.)將調用此事件的控制器請求添加爲:
controller.xml
<request-map uri="createOfbizDemoEvent"> <security https="true" auth="true"/> <event type="java" path="com.companyname.ofbizdemo.events.OfbizDemoEvents" invoke="createOfbizDemoEvent"/> <response name="success" type="view" value="main"/> <response name="error" type="view" value="main"/> </request-map> |
3.)經過重建它來中止並啓動服務器,由於咱們須要編譯咱們在#1中添加的Java事件類。
4.)如今要測試這個事件,你能夠簡單地把AddOfbizDemo表單的目標變成「createOfbizDemoEvent」,而且它如今就提交你的事件。
1.6.2 服務與事件之間的區別
如下是服務和事件之間的區別,
· 事件用於使用地圖處理器的驗證和轉換,而服務則用於諸如CRUD操做之類的業務邏輯。
· 服務返回地圖。
· 事件返回String。
· 服務加載服務器,任何定義更改(若是在MiniLang中,則不實現)須要從新加載。
· 我們能夠在事件中呼叫服務。可是我們不能在服務中調用事件。
· 一個事件是一般在一個地方用於一個目的的特定的本地零件功能,並從其位置調用。
· 一個服務是一個能夠在網絡上任何位置的功能,大部分時間都在幾個不一樣的地方使用,它被稱爲「名字」。
· 在事件的狀況下,您能夠訪問HttpServletRequest和HttpServletResponse對象,您能夠讀/寫任何您想要的。在服務的狀況下,您只能訪問服務參數。
參考: https ://cwiki.apache.org/confluence/display/OFBIZ/FAQ+-+Tips+-+Tricks+-+Cookbook+-+HowTo#FAQ-Tips-Tricks-Cookbook-HowTo-DifferenceBetweenEventAndService 和 http:// ofbiz。 135035.n4.nabble.com
標準 |
服務 |
活動 |
須要定義 |
是 |
沒有 |
實施可能性 |
實體自動,Java,簡單(XML)和Groovy |
簡單(XML),Java&Groovy |
返回類型 |
地圖 |
串 |
用於寫業務邏輯 |
是 |
沒有 |
工做計劃可能 |
是 |
沒有 |
1.7 自定義用戶界面
1.7.1 使用FreeMarker模板和Groovy腳本
好吧,咱們在OFBiz教程的最後一部分。在這部分中,咱們將專一於爲企業管理應用程序(即後端應用程序)定製ApacheOFBiz的UI層。這裏重要的是根據用戶想要開發應用程序。
所以,要首先自定義應用程序的UI部分,以便輕鬆使用Freemarker模板,而不是內置的窗體小部件。首先,咱們將看到如何使用Freestyle和Groovy腳本與Apache OFBiz,而後咱們將看到如何經過定義本身的裝飾器來放置自定義樣式。最初咱們將使用OFBiz默認裝飾器。
從這裏開始遵循如下步驟:
1.)在位於$ OFBIZ_HOME / hot-deploy / ofbizdemo / webapp/ ofbizdemo / crud / AddOfbizDemo.ftl和ListOfbizDemo.ftl的位置添加兩個Freemarker文件,以下所示:
AddOfbizDemo.ftl
<div class="screenlet-body"> <form id="createOfbizDemoEvent" method="post" action="<@ofbizUrl>createOfbizDemoEvent</@ofbizUrl>"> <input type="hidden" name="addOfbizDemoFromFtl" value="Y"/> <fieldset> <div> <span class="label">${uiLabelMap.OfbizDemoType}</span> <select name="ofbizDemoTypeId" class='required'> <#list ofbizDemoTypes as demoType> <option value='${demoType.ofbizDemoTypeId}'>${demoType.description}</option> </#list> </select>* </div> <div> <span class="label">${uiLabelMap.OfbizDemoFirstName}</span> <input type="text" name="firstName" id="firstName" class='required' maxlength="20" />* </div> <div> <span class="label">${uiLabelMap.OfbizDemoLastName}</span> <input type="text" name="lastName" id="lastName" class='required' maxlength="20" />* </div> <div> <span class="label">${uiLabelMap.OfbizDemoComment}</span> <input type="text" name="comments" id="comments" class='inputBox' size="60" maxlength="255" /> </div> </fieldset> <input type="submit" value="${uiLabelMap.CommonAdd}" /> </form> </div> |
ListOfbizDemo.ftl
<div class="screenlet-body"> <#if ofbizDemoList?has_content> <table cellspacing=0 cellpadding=2 border=0 class="basic-table"> <thead><tr> <th>${uiLabelMap.OfbizDemoId}</th> <th>${uiLabelMap.OfbizDemoType}</th> <th>${uiLabelMap.OfbizDemoFirstName}</th> <th>${uiLabelMap.OfbizDemoLastName}</th> <th>${uiLabelMap.OfbizDemoComment}</th> </tr></thead> <tbody> <#list ofbizDemoList as ofbizDemo> <tr> <td>${ofbizDemo.ofbizDemoId}</td> <td>${ofbizDemo.getRelatedOne("OfbizDemoType").get("description", locale)}</td> <td>${ofbizDemo.firstName?default("NA")}</td> <td>${ofbizDemo.lastName?default("NA")}</td> <td>${ofbizDemo.comments!}</td> </tr> </#list> </tbody> </table> </#if> </div> |
2.)在位置$ OFBIZ_HOME / hot-deploy / ofbizdemo / webapp/ ofbizdemo / WEB-INF / actions / crud / ListOfbizDemo.groovy添加新的Groovy文件,以獲取數據獲取邏輯,並添加代碼以列出OfbizDemo記錄:
ofbizDemoTypes = delegator.findList("OfbizDemoType", null, null, null, null, false); context.ofbizDemoTypes = ofbizDemoTypes; ofbizDemoList = delegator.findList("OfbizDemo", null, null, null, null, false); context.ofbizDemoList = ofbizDemoList; |
3.)將Ofbiz默認裝飾器添加新的屏幕文件到OfbizDemoScreens.xml,新增的freemarker和groovy文件爲:
OfbizDemoScreens.xml
4.)爲OfbizDemo菜單添加新的控制器請求和新項目:
controller.xml
OfbizDemoMenus.xml
<menu-item name="addOfbizDemoFtl" title="${uiLabelMap.OfbizDemoAddFtl}"><link target="AddOfbizDemoFtl"/></menu-item> |
5.)添加應用程序使用的新UI標籤。
6.)運行您的thebiz演示應用程序,並轉到剛剛添加的新選項卡。你應該有:
1.7.2
1.7.3 建立自定義裝飾器
將本身的用戶界面放在Freemarker中可讓您自由地進行實驗,進行CSS調整,並使用戶想要的應用程序。在本節中,咱們將看到咱們如何作到這一點。
咱們將經過爲您的應用程序視圖定義自定義裝飾器來作到這一點。OFBiz中的裝飾器只不過是一個屏幕,您能夠經過將其包含在其餘應用屏幕中來定義和重用它。您已經使用OFBiz附帶的默認裝飾器(main-decorator - >ApplicationDecorator)來執行此操做。到目前爲止,只要觀察你準備好的屏幕,你會發現,你正在使用這個主要裝飾器,請參考OfbizDemoScreens.xml中的下面的一行。
OfbizDemoScreens.xml
<decorator-screen name="main-decorator" location="${parameters.mainDecoratorLocation}"> |
mainDecoratorLocation在參數映射中可用,由於它在webapp的web.xml中定義
web.xml中
<context-param> <description>The location of the main-decorator screen to use for this webapp; referred to as a context variable in screen def XML files.</description> <param-name>mainDecoratorLocation</param-name> <param-value>component://ofbizdemo/widget/CommonScreens.xml</param-value> </context-param> |
如今是使用自定義樣式定義本身的裝飾器的時候了。
在下面的示例中,咱們將使用Bootstrap來設計咱們在本教程最後部分開發的示例Freemarker屏幕。按照下面的步驟創建本身的裝飾器。
1.)下載Bootstrap v3.3.7目錄,能夠從這裏下載 並解壓縮。
2.)在$ OFBIZ_HOME / hot-deploy / ofbizdemo / webapp/ ofbizdemo /位置建立兩個新目錄,即「css」和「js」
3.)將bootstrap-3.3.7 / dist / css /bootstrap.min.css複製到$OFBIZ_HOME / hot-deploy / ofbizdemo / webapp / ofbizdemo / css
4.將bootstrap-3.3.7 / dist / js / bootstrap.min.js複製到$ OFBIZ_HOME / hot-deploy/ ofbizdemo / webapp / ofbizdemo / js。
5.)打開$ OFBIZ_HOME / hot-deploy / ofbizdemo / webapp/ ofbizdemo / WEB-INF / web.xml,並在最後的allowedPath中爲css和js目錄建立條目,以下所示:
web.xml中
<init-param> <param-name>allowedPaths</param-name> <param-value>/error:/control:/select:/index.html:/index.jsp:/default.html:/default.jsp:/images:/includes/maincss.css:/css:/js</param-value> </init-param> |
6.)在位於$ OFBIZ_HOME / hot-deploy / ofbizdemo / webapp/ ofbizdemo /的位置添加名爲「includes」的新目錄,並在剛剛添加的名爲PreBody.ftl和PostBody.ftl的新目錄中建立兩個新文件。咱們將在裝飾器屏幕中使用(包括)這兩個文件來構建完整的HTML頁面。
PreBody.ftl
<html> <head> <title>${layoutSettings.companyName}</title> <meta name="viewport" content="width=device-width, user-scalable=no"/> <#if webSiteFaviconContent?has_content> <link rel="shortcut icon" href=""> </#if> <#list styleSheets as styleSheet> <link rel="stylesheet" href="${StringUtil.wrapString(styleSheet)}" type="text/css"/> </#list> <#list javaScripts as javaScript> <script type="text/javascript" src="${StringUtil.wrapString(javaScript)}"/></script> </#list> </head> <body data-offset="125"> <h4 align="center"> ==================Page PreBody Starts From Decorator Screen========================= </h4> <div class="container menus" id="container"> <div class="row"> <div class="col-sm-12"> <ul id="page-title" class="breadcrumb"> <li> <a href="<@ofbizUrl>main</@ofbizUrl>">Main</a> </li> <li class="active"><span class="flipper-title">${StringUtil.wrapString(uiLabelMap[titleProperty])}</span></li> <li class="pull-right"> <a href="<@ofbizUrl>logout</@ofbizUrl>" title="${uiLabelMap.CommonLogout}">logout</i></a> </li> </ul> </div> </div> <div class="row"> <div class="col-lg-12 header-col"> <div id="main-content"> <h4 align="center"> ==================Page PreBody Ends From Decorator Screen=========================</h4> <h4 align="center"> ==================Page Body starts From Screen=========================</h4> |
PostBody.ftl
<#-- Close the tags opened in the PreBody section --> </div> </div> </div> </div> <h4 align="center"> ==================Page PostBody and Page body in general ends here from Decorator Screen=========================</h4> </body> </html> |
7.)打開組件的共享屏幕文件$ OFBIZ_HOME / hot-deploy / ofbizdemo / widget/ CommonScreens.xml,這是咱們將定義咱們的自定義裝飾器的文件。
8.)更新屏幕名爲「OfbizDemoCommonDecorator」(將做爲您的應用程序的自定義裝飾器),以下所示:
CommonScreens.xml
<screen name="OfbizDemoCommonDecorator"> <section> <actions> <property-map resource="OfbizDemoUiLabels" map-name="uiLabelMap" global="true"/> <property-map resource="CommonUiLabels" map-name="uiLabelMap" global="true"/> <!-- Including custom CSS Styles that you want to use in your application view. [] in field can be used to set the order of loading CSS files to load if there are multiple --> <set field="styleSheets[]" value="/ofbizdemo/css/bootstrap.min.css"/> <!-- Including custom JS that you want to use in your application view. [] in field can be used to set the order of loading of JS files to load if there are multiple --> <set field="javaScripts[+0]" value="/ofbizdemo/js/bootstrap.min.js" global="true"/> <set field="layoutSettings.companyName" from-field="uiLabelMap.OfbizDemoCompanyName" global="true"/> </actions> <widgets> <section> <condition> <if-has-permission permission="OFBIZDEMO" action="_VIEW"/> </condition> <widgets> <platform-specific><html><html-template location="component://ofbizdemo/webapp/ofbizdemo/includes/PreBody.ftl"/></html></platform-specific> <decorator-section-include name="pre-body"/> <decorator-section-include name="body"/> <platform-specific><html><html-template location="component://ofbizdemo/webapp/ofbizdemo/includes/PostBody.ftl"/></html></platform-specific> </widgets> <fail-widgets> <label style="h3">${uiLabelMap.OfbizDemoViewPermissionError}</label> </fail-widgets> </section> </widgets> </section> </screen> |
9.)在上一部分建立的Freemarker屏幕中使用此裝飾器:
OfbizDemoScreens.xml
10.)更新您的FTL文件以遵循HTML網絡標準,並將CSS應用於:
AddOfbizDemo.ftl
<form method="post" action="<@ofbizUrl>createOfbizDemoEventFtl</@ofbizUrl>" name="createOfbizDemoEvent" class="form-horizontal"> <div class="control-group"> <label class="control-label" for="ofbizDemoTypeId">${uiLabelMap.OfbizDemoType}</label> <div class="controls"> <select id="ofbizDemoTypeId" name="ofbizDemoTypeId"> <#list ofbizDemoTypes as demoType> <option value='${demoType.ofbizDemoTypeId}'>${demoType.description}</option> </#list> </select> </div> </div> <div class="control-group"> <label class="control-label" for="firstName">${uiLabelMap.OfbizDemoFirstName}</label> <div class="controls"> <input type="text" id="firstName" name="firstName" required> </div> </div> <div class="control-group"> <label class="control-label" for="lastName">${uiLabelMap.OfbizDemoLastName}</label> <div class="controls"> <input type="text" id="lastName" name="lastName" required> </div> </div> <div class="control-group"> <label class="control-label" for="comments">${uiLabelMap.OfbizDemoComment}</label> <div class="controls"> <input type="text" id="comments" name="comments"> </div> </div> <div class="control-group"> <div class="controls"> <button type="submit" class="btn">${uiLabelMap.CommonAdd}</button> </div> </div> </form> |
ListOfbizDemo.ftl
<table class="table table-bordered table-striped table-hover"> <thead> <tr> <th>${uiLabelMap.OfbizDemoId}</th> <th>${uiLabelMap.OfbizDemoType}</th> <th>${uiLabelMap.OfbizDemoFirstName}</th> <th>${uiLabelMap.OfbizDemoLastName}</th> <th>${uiLabelMap.OfbizDemoComment}</th> </tr> </thead> <tbody> <#list ofbizDemoList as ofbizDemo> <tr> <td>${ofbizDemo.ofbizDemoId}</td> <td>${ofbizDemo.getRelatedOne("OfbizDemoType").get("description", locale)}</td> <td>${ofbizDemo.firstName?default("NA")}</td> <td>${ofbizDemo.lastName?default("NA")}</td> <td>${ofbizDemo.comments!}</td> </tr> </#list> </tbody> </table> |
10.如今從新啓動OFBiz,由於您已經在web.xml中對allowedPath進行了條目。當它從新加載命令 https:// localhost:8443 / ofbizdemo / control / AddOfbizDemoFtl時, 您應該看到使用自定義樣式的頁面,而不是使用默認的OFBiz主題。它應該是:
在這裏,您能夠按須要玩它。嘗試更改標題或新增標題,添加頁腳,進行驗證等。所以,您可使用Freemarker模板,CSS和JS自定義OFBiz的UI層。
您可能須要添加本身的CSS或JS文件,您能夠按照與Bootstrap文件相同的方式來包含它們。