用戶 本地化 消息和日誌門面html
用戶門面用於管理當前用戶和訪問,登錄,受權及登出的信息。用戶信息包括區域設置,時區以及幣種/ec.user.nowTimestamp設置日期。
消息門面用於追蹤用戶的消息以及錯誤信息。錯誤消息列表ec.message.errors一樣用於肯定在一個服務調用或其餘動做中是否存在錯誤。
日誌門面用於記錄日誌。org.slf4j.Logger.
擴展和附加組件
組件目錄結構
data – 包含實體 XML數據文件, 其帶有 根元素 entity-facade-xml,按照和 命令行指定的類型匹 配的 type 屬性進行加載 (使用 -loadloadload 的可執行 WAR文件)若是沒有指定 類型 ,能夠爲任何類型
entity– 這個目錄下存放 的是全部 將會被加載 的實體定義和 實體 ECA XML文件 ;實體 ECA文 件必須放在這個目錄中並有件必須放在這個目錄中並有 ".eecas.xml"的雙重擴展名
lib – 當 web 應用被部署的時候, 這個目錄下的 JAR 文件將會被添加到 classpath中
screen – 約定 這個目錄下的 界面會 被明確的引用( 一般過 "component://*" URL)
script – 約定 這個目錄下的 腳本 會被明確的引用( 一般過 "component://*" URL);Groovy,XML動做以及其餘腳本都應位於這個目錄下
service – 服務 將會按照服務 定義 XML文件中定義的路徑進行加載, 同時不但位於組件 同時不但位於組件 同時不但位於組件 同時不但位於組件的服務 目錄 之下仍是 位於 "classpath://service/"之下的路徑都會被找到; 服務 ECA文件必須放在這個目錄中並 有".secas.xml"的雙重擴展名 ;郵件 ECA文件必須放在這個目錄中並有 ".emecas.xml"的擴展名
組件安裝
加載組件
1.將組件目錄放在runtime/component目錄裏
2.在Moqui XML配置文件中添加一個component-list.component元素
裝載界面
每一個Moqui框架中的web應用(包括webroot)都必須有一個根界面,其指定在moqui-conf.webapp-list.webapp.root-screen-location屬性中/默認根界面被調用時,將會加載位於runtime/compoment/webroot/screen/webroot.xml中的webroot應用。
對於源自於你組件中位於webroot界面下,界面路徑所制定的可用界面來講,你須要令你組件中的每一個頂層界面成爲webroot界面祖先的子界面。有兩種方式去實現。
1.添加一個screen.subscreens.subscreen-item元素到父界面
查看裝載了example和工具應用界面的apps界面(runtime/component/webroot/screen/WebRoot/apps.xml)
2.添加一條SubscreenItem實體的記錄,在screenLocation字段中指定自界面,裝載點subscreenName字段中等同於subscreens-item.name屬性,同時在userGroup字段中若是其值爲ALL_USERS則表示適用於全部的用戶,若是爲一個實際的userGroupId則表示僅適用於這個用戶組。
Moqui XML配置文件的設置
建立本身的組件
Moqui依照約定/配置優於編碼的原則進行組件開發
建立目錄
建立 runtime/component/tutorial/screen/tutorial.xml
以自界面的方式掛載
將該頁面掛載到根界面下
定義根界面的webroot組件runtime/component/webroot/screen/webroot.xml
方式一在apps界面作修改,加入:
<subscreens-item name="Toturial" location="component://tutorial/screen/tutorial.xml"
menu-title="Toturial" menu-index="1"/>
方式二:
<entity-facade-xml>
<SubscreensItem screenLocation="component://webroot/screen/webroot/app.xml"
subscreenName="tutorial" userGroupId="ALL_USERS"
subscreenLocation="component://tutorial/screen/tutorial.xml"
menuTitle="Dutorial" menuIndex="2" menuInclude="Y"
/>
</entity-facade-xml>
子界面嵌入:
<screen require-authentication="false">
<widgets>
<label type="hi" text="hello world"/>
<render-mode>
<text type="html" location="component://tutorial/screen/hello.html">
</text>
</render-mode>
</widgets>
</screen>
其中的render-mode是什麼?在render-mode下,你能夠爲不一樣的渲染模式定義各類子元素,甚至是各類文本模式,如,html xml xsl-fo csv等。
第二步 實體
實體是一個基本的扁平列表的數據結構,而且一般爲數據庫中的一張表。一條實體值等價於數據庫表的一行記錄。Moqui框架沒有使用對象關係映射方式,因此咱們要作的就是定義一個實體,而後經過實體門面模式去寫代碼操做使用實體。
建立實體:
咱們建立一個包含tutorialId和description兩個字段的實體XML文件,並命名爲Tutorial位於runtime/component/tutorial/entity/TutorialEntities.xml
<entities>
<entity entity-name="Tutorial" package-name="tutorial">
<field name="tutorialId" type="id" is-pk="true"/>
<field name="description" type="text-long"/>
</entity>
</entities>
添加數據:
實體門面模式具備從XML文件中讀取或寫入數據的功能,這些XML文件中的節點元素須要和實體名對應,一樣的屬性名和字段名各需對應。
runtime/component/tutorial/data/TutorialData.xml
<entity-facade-xml type="seed">
<Tutorial tutorialId="TestOne" description="Test one description"/>
<Tutorial tutorialId="TestTwo" description="Test two description"/>
</entity-facade-xml>
自動查詢表單:
runtime/component/tutorial/screen/tutorial/FindTutorial.xml
<screen require-authentication="anonymous-view">
<transition name="findTutorial">
<default-response url="."/>
</transition>
<action>
<entity-find entity-name="Tutorial" list="tutorialList">
<search-form-inputs/>
</entity-find>
</action>
<widgets>
<form-list name="ListTutorials" list="tutorialList"
transition="findTutorial"
>
<auto-fields-entity entity-name="Tutorial" field-type="find-display"/>
</form-list>
</widgets>
</screen>
關鍵部分:
轉換transition
轉換/跳轉指的是界面之間的連接。相似於一個順序圖易於,咱們把每一個界面當成一個個節點,那麼界面中定義的轉換/跳轉就是「線」通常,從一個節點指向另一個節點界面,而且同時有些跳轉還包含動做或者服務。
單個轉換能夠按照條件或者不一樣的錯誤結果返回各類響應頁面,一切都取決於你的界面設計需求。
個別轉換會指向當前頁面。(頁面刷新)
查詢實體動做 actions.entity-find
界面渲染時只有一個界面動做:查詢實體(entity-find)
一般使用entity-find元素(或者調用java api使用EntityFind對象)時,你須要指定過濾條件,排序字段或者其餘查詢相關的信息去運行。
在上個例子中,咱們使用了XML表單內的標準參數去進行實體查詢,因此我麼可使用search-form-inputs子元素去自動生成處理字段。
若是想知道參數會長啥樣只要查看瀏覽器中的html代碼便可。這些都是基於XML表單定義自動生成的。
widgets.form-list
該例子中定義的是個真實的表單,指定的是多條記錄/行數據的「列表」表單(相對於「單個」表單)
這裏的name屬性能夠爲任意值,可是須要XML界面內惟一
這裏的list屬性參照的是動做actions塊中的entity-find返回的結果,transaction屬性參照的是界面定義最上面的transaction元素。
ji既然目標是建立一個基於實體定義的表單,咱們便給auto-fields-entity元素賦值爲咱們的Tutorial實體,設置field-type屬性的值爲find-display選項,表示會建立查詢字段在頭部而且在表格中生存並顯示每條記錄。
指定字段:
若是不想要默認的方式去生成description字段,要在form-list元素內添加一個field元素,而且跟在fields-entity元素以後
<form-list name="ListTutorials" list="tutorialList"
transition="findTutorial">
<auto-fields-entity entity-name="Tutorial" field-type="find-display"/>
<field name="description">
<header-field show-order-by="true">
<text-find find-options="true"/>
</header-field>
<default-field>
<display/>
</default-field>
</field>
</form-list>