在Cubi快速入門章節中提供了一個關於建立新模塊的簡單的範例,本章節將帶領應用開發人員更加深刻普遍的瞭解Cubi內部是如何工做的。理解Cubi內部的工做原理將有助與您在應用程序開發中充分展示出Cubi的強大力量。本章節將討論下列主題:javascript
Cubi爲開發人員更有效的管理Cubi應用程序提供了一組命令行工具,這些腳本能夠在以下目錄中找到/cubi/bin/tools/php
這個腳本用於將一個模塊裝載入Cubi系統,當您準備好新的模塊時(mod.xml 或其它文件被修改時),您須要從新經過本工具將它裝載到應用程序中。css
# php load_module.php module_name [-i]html
'-i' 參數標識安裝模塊時是否強行裝載SQL語句用來刷新已安裝的數據。java
Cubi Metadata Generator 幫助開發人員快速的建立出一個新的模塊web
# php gen_meta.php dbname tablesql
例如:您有一個數據表叫作」abc」,首先您在Cubi的數據庫中建立表abc,而後進入cubi/bin/tools/這個文件夾執行命令數據庫
# php gen_meta.php Default abcexpress
當腳本被執行後,下列文件將自動被生成。apache
/modules/abc/mod.xml
/modules/abc/do/AbcDO.xml
/modules/abc/form/AbcListForm.xml
/modules/abc/form/AbcDetailForm.xml
/modules/abc/form/AbcEditForm.xml
/modules/abc/form/AbcNewForm.xml
/modules/abc/form/AbcCopyForm.xml
/modules/abc/view/AbcListView.xml
此工具將幫助UI開發人員基於Cubi默認主題快速生成一個新的樣式主題
# php gen_theme.php new_theme_name
當腳本執行完成後,蝦類文件將被自動生成
cubi/theme/new_theme/...
此工具幫助用戶將模塊升級爲更高版本
爲了升級一個模塊,您須要複製新版本的模塊文件夾到以下目錄中
cubi/upgrade/module/mod_name/.
在mod.xml文件中,確認版本號設置正確,必須高於當前正在使用的版本號。
建立或修改 cubi/upgrade/module/mod_name/upgrade.xml. 在 <UpgradeSql> 標籤中爲目標版本添加適當的SQL語句,例如
<?xml version="1.0" standalone="no"?>
<Upgrade>
<Version Name="0.1">
</Version>
<Version Name="0.1.1">
<UpgradeSql><![CDATA[
ALTER TABLE `help` ADD `add1` varchar(255) default NULL AFTER `content`;
ALTER TABLE `help` ADD `add2` int(10) default NULL AFTER `add1`;
]]></UpgradeSql>
</Version>
<Version Name="0.1.2">
<UpgradeSql><![CDATA[
ALTER TABLE `help` ADD `add3` varchar(255) default NULL AFTER `add2`;
ALTER TABLE `help` ADD `add4` int(10) default NULL AFTER `add3`;
]]></UpgradeSql>
</Version>
</Upgrade>
# php upgrade.php module_name
# php upgrade.php help
Start upgrading help module ...
--------------------------------------------------------
Upgrade 'help' module from version 0.1 to 0.1.2. Please backup data first.
Press enter to continue ...
Backup source files to C:\xampp\htdocs\ob24\cubi/backup/modules/help/0.1 ...
Copy source files from C:\xampp\htdocs\ob24\cubi/upgrade/modules/help to C:\xampp\htdocs\ob24\cubi\modules/help...
Execute upgrade sql files ...
Upgrade from version 0.1 to 0.1.1 ...
Execute ALTER TABLE `help` ADD `add1` varchar(255) default NULL AFTER `content`
Execute ALTER TABLE `help` ADD `add2` int(10) default NULL AFTER `add1`
Upgrade from version 0.1 to 0.1.2 ...
Execute ALTER TABLE `help` ADD `add3` varchar(255) default NULL AFTER `add2`
Execute ALTER TABLE `help` ADD `add4` int(10) default NULL AFTER `add3`
Reload module ...
[2011-01-11T00:15:53-08:00] Install Module.
[2011-01-11T00:15:53-08:00] Install Module ACL.
[2011-01-11T00:15:53-08:00] Install Module Menu.
[2011-01-11T00:15:53-08:00] help is loaded.
Give admin to access all actions of module 'help'
--------------------------------------------------------
End loading help module
Cubi 在應用程序中提供了一系列約束用戶對資源的訪問控制。
Cubi使用身份驗證服務(modules/service/authService.php)來根據用戶提供的用戶名和密碼校驗用戶身份。
當前身份額驗證服務按Cubi的用戶表來完整用戶身份驗證,一樣的邏輯還能夠被修改以使用用戶的特殊環境,例如用戶能夠在這個服務中經過LDAP服務器用來驗證身份。
訪問服務能夠被用來對簡單頁面進行訪問控制,訪問控制服務有一個配置文件(accessService.xml)該文件定義了從用戶資料服務中獲取的核心角色的視圖訪問權限,請看以下範例:
<?xml version="1.0" standalone="no"?>
<PluginService Name="accessService" Class="accessService">
<access-constraint>
<view-collection>
<view name="shared.CalendarView">
<role name="admin"/>
<role name="member"/>
</view>
<view name="demo*"> <!-- regular expression in the view name -->
<role name="admin"/>
<role name="member"/>
</view>
</view-collection>
</access-constraint>
</PluginService>
XML配置文件很是簡單,所以也許客戶還須要在accessService.xml.文件中增長本身的邏輯
Cubi基於角色訪問控制的原始目的在於定義一個用戶角色對應用程序資源具備什麼樣的操做權限,當定義一個RBAC模型時候,下列管理將會很是有用。
每個模塊在模塊的根目錄中都有一個mod.xml文件,在mod.xml文件中,有一個ACL章節用來定義多組資源,每組資源能夠有一個或多個操做行爲,例如:
<ACL>
<Resource Name="User">
<Action Name="Administer_Users" Description="Administration of users"/>
在每個Openbiz項目中,開發人員能夠設置訪問屬性給幾個資源行爲,例如:
<EasyView Name="UserListView"... Access="User.Administer_User">
容許擁有Administer_User資源行爲權限的用戶才能訪問system.view.UserListView視圖。
在角色管理視圖中,用戶能夠選擇「Allow」或「Deny」給全部可用的資源行爲。例如:咱們給角色「member」設置「Deny」權限到「User.Administer_User」。那麼當一個具備「member」角色的用戶嘗試訪問RoleListView視圖時,用戶將只能看到一個訪問拒絕的頁面。
訪問屬性能夠設置給視圖,表單,表單元素,數據對象和菜單條目
角色是用來控制一個資源上的操做行爲是否能夠被用戶所調用,當有許多應用程序但願不一樣的用戶看到不通的數據範圍的時候,例如:銷售數據應該不只對銷售人員可見,同時對於財務或市場人員也應該具備可見性,這樣的功能系統稱爲「數據可視性」。
Cubi使用「用戶組」來控制數據可視性,爲了在某些數據上增長數據可視性控制,您須要在相對應的數據對象上增長「group_id」字段,而後自定義的訪問邏輯能夠在數據對象的AccessRule中進行設置。
例如:
<BizDataObj Name="SalesDO" AccessRule="{tx}@vis:group(group_id){/tx}" …>
<BizDataObj Name="MailDO" AccessRule="{tx}@vis:group(owner_id){/tx}" …>
@vis是數據可視性服務的別名。
全部系統服務別名均可以在app_init.php的$g_ServiceAlias數組變量中定義,當服務別名被定義後,Openbiz的簡單表達式引擎就能夠調用在表達式中定義的相應的服務和方法。
有時候,咱們但願增長一個更加細緻的數據可視性控制,例如精確到每個用戶能夠訪問哪些數據記錄,在這種狀況下,咱們推薦使用一個交叉表(中間表)經過多對多映射(M-M)的方式來鏈接用戶與數據記錄的關係。好比,若是你想讓多個用戶訪問某些重要的報表,你能夠建立一個交叉表叫「report_user」。該表存儲了report_id和user_id。這個表將被用來限制哪一個用戶能夠訪問哪些報表。
這些多對多關係中和相應的用戶界面在許多Cubi模塊中都有所實現(例如:用戶與角色,用戶與分組的關係),參考現有的Cubi實現方法將會對您的開發頗有幫助。
在發佈Cubi以前,Openbiz開發人員一般是按本身習慣的方式來對元數據進行命名,例如一個用戶列表表單可能會被命名爲以下名字:
在Cubi中,元數據文件的命名遵循"NameType"語法,例如用戶列表表單,Cubi將使用以下名字:
Cubi建議每個模塊包含以下子文件夾:
元數據文件命名範例,以Cubsi/modules/system目錄爲例:
對於數據對象元數據
/do/UserDO.xml
/do/RoleDO.xml
對於表單對象元數據
/form/UserListForm.xml
/form/UserEditForm.xml
/form/UserNewForm.xml
對於視圖對象元數據
/view/UserListView.xml
/view/UserEditView.xml
/view/UserNewView.xml
一個模塊還能夠包含子模塊文件夾,每個子模塊也應當遵循一樣的模塊目錄結構。
(一般子模塊的視圖對象和模板文件,是存放在父模塊的文件夾中的)
Openbiz與Cubi 推薦的代碼編寫標準參考以下http://pear.php.net/manual/en/standards.php.
Cubi應用程序默認都使用簡潔URL模式來訪問視圖,配合一些在Web服務器上的配置設置,最終URL甚至能夠變得更加簡短。
在早期Openbiz的Baseapp,一個典型的訪問視圖的URL相似以下:
http://host/baseapp/bin/controller.php?view=a.b.viewname.
咱們稱之爲原始Openbiz URL
Cubi將經過index.php與cubi安裝目錄下的.htaccess文件配合的方式爲系統映射更加簡潔的URL格式。
簡潔URL |
原始URL |
/cubi/index.php/module/xaa 對應: /cubi/index.php/system/userList |
/cubi/bin/controller.php?view=module.view.XView 對應: /cubi/bin/controller.php?view=system.view.UserListView |
/cubi/index.php/module/xaa_ybb 對應: /cubi/index.php/system/user_list |
/cubi/bin/controller.php?view=module.view.XaaYbbView 對應: /cubi/bin/controller.php?view=system.view.UserListView |
/cubi/index.php/module/xaa/number 對應: /cubi/index.php/system/user_detail/5 |
/cubi/bin/controller.php?view=module.view.XaaView&fld:Id=number 對應: /cubi/bin/controller.php?view=system.view.UserDetailView&fld:Id=5 |
/cubi/index.php/module/xaa/word_number 對應: /cubi/index.php/system/user_detail/Id_5 |
/cubi/bin/controller.php?view=module.view.XaaView&fld:word=number 對應: /cubi/bin/controller.php?view=system.view.UserDetailView&fld:Id=5 |
/cubi/index.php/module/xaa/a=x&b=y 對應: /cubi/index.php/user/reset_password/token=4c0417d23dad6&abc=xyz |
/cubi/bin/controller.php?view=module.view.XaaView&a=x 對應: /cubi/bin/controller.php?view=user.view.ResetPasswordView&token=4c0417d23dad&abc=xyz |
若是index.php被設置爲服務器的默認頁面文件,在URL中您可使用「?」來代替「index.php」,例如/cubi/?/system/userList
若是你的Cubi運行於Apache網頁服務器下,而且服務器支持經過.htaccess文件的方式配置url_rewrite模塊的轉發規則。Cubi將能夠實現高級的簡潔URL格式
在你的apache conf 文件中,增長相似以下配置:
Alias /cubi "D:\Apache2\htdocs\cubidev\cubi"
<Directory "D:\Apache2\htdocs\cubidev\cubi">
AllowOverride All
</Directory>
打開 /cubi02/cubi/bin/app_init.php文件,進行以下修改
/* APP_URL is /a/b in case of http://host/a/b/index.php?... */
define('APP_URL',"/cubi");
/* APP_INDEX is /a/b/index.php in case of http://host/a/b/index.php?... */
$indexScript = ""; // or "", or "/?"
define('APP_INDEX',APP_URL.$indexScript);
進行完上述設置後,您能夠在URL去掉」index.php」字符,例如
http://host/cubi/system/user_list 就徹底能夠代替http://host/cubi/index.php/system/user_list.實現更加精簡的URL。
在「Cubi快速入門」章節中咱們介紹了若是經過」gen_mod」工具建立一個模塊,本章節將涵蓋更多關於編寫Cubi模塊的知識。
您能夠遵循下列步驟來手工建立一個模塊。
<Module Name="abc" Description="abc is a new module" Version="0.1" Author="your name" OpenbizVersion="2.4">
</Module>
<Module Name="abc" Description="abc is a new module" Version="0.1" Author="your name" OpenbizVersion="2.4">
<ACL>
<Resource Name="Abc">
<Action Name="Administer_Abc" Description="Can Abc data"/>
</Resource>
</ACL>
<Menu>
<MenuItem Name="Abc" Title="Manage Abc" URL="{@home:url}/abc/abc_list" Parent="System" Order="60"/>
</Menu>
<Dependency>
<Module Name="system"/>
</Dependency>
</Module>
這一部份內容咱們在Cubi快速入門章節中已經詳細講述了。
一個典型的模塊一般有對數據庫的改變,(例如:增長一些相應的數據表),與數據庫相關的操做語句須要被複制到/cubi/modules/mod_name/mod.install.sql文件中,此文件能夠包含」create table」語句用來建立模塊所需的數據表和」insert into」語句來實現數據的初始化。
Cubi發佈版本中包含了一個默認的主題樣式,建立一個自定義的主題樣式是一件很是簡單的事情,請遵循以下步驟:
主題樣式還能夠經過命令行工具或主題管理界面來自動建立,這兩部份內容分別在Cubi命令行工具和Cubi核心模塊章節中分別進行介紹。
當新的模塊被建立好之後,他就能夠在主題樣式管理界面中被設置爲默認主題或者成爲在個人帳戶的自定義使用偏好設置中供用戶進行選擇的自定義主題。
Cubi客戶端與服務器的通信默認是按AJAX的方式進行的,它相應的實現類文件是/cubi/js/openbiz.js。
openbiz.js 包含了以下兩類定義:
若是你但願在客戶端瀏覽器上實現一些特殊邏輯,你能夠編寫你自定義的類來繼承於Openbiz.Form或Openbiz.TableForm類,而後在表單對象的元數據中指定jsClass="YourFormName"屬性
範例: 建立一個MyInputForm 類用來實現你自定義的輸入表單,在/cubi/js目錄中建立一個」MyInputForm.js」文件。
/**
* MyInputForm class
*/
MyInputForm = Class.create(Openbiz.Form,
{
initialize: function($super, name, subForms)
{
$super(name, subForms);
// your own init code here
},
myfun: function(...)
{
// your code here
}
});
爲了幫助開發人員更加直觀的編輯元數據,Cubi經過tool模塊提供了內建的元數據編輯器。
若是cubi/bin/app_init.php中,常量'APPBUILDER'被設置爲1,那麼CIME將會在應用程序的頁面中啓用,在CIME模式下,每個視圖或表單的右上角將會出現一個小圖標,點擊該圖標就能夠啓動一個新的窗口來激活CIME元數據編輯器。
若是須要編輯一個節點的屬性,點擊左側樹節點可在右側區域內展現該節點的可編輯屬性。
如須要添加一個節點,在父節點上單擊鼠標右鍵,選擇「Create」菜單,而後輸入一個新的子節點的名字便可完成建立。
如須要刪除一個節點,在想要刪除的節點上單擊鼠標右鍵,並選擇「Delete」菜單,而後在彈出的確認菜單中點擊「OK」按鈕,便可完成節點的刪除。
如須要移動一個節點,經過鼠標拖拽的方式將一個節點移動到其餘的父節點下便可。
在元數據編輯器的第一頁,若是表單對象定義了DataObject 屬性,您將會在左側最下面看到一個編輯數據對象元數據的鏈接。
編輯表單屬性
編輯表單元素屬性
若是是經過表單對象上的鏈接跳轉到數據對象編輯視圖,點擊數據對象編輯器上的「Back to」鏈接還能夠返回剛纔的表單對象編輯器界面。
編輯數據對象屬性
編輯數據對象字段屬性
視圖對象編輯器的首屏。
編輯視圖對象屬性
編輯表單引用屬性
Cubi爲開發人員製做語言包提供了一組專用工具。下列步驟將描述如何爲Cubi應用程序添加一個新的語言包。
語言包生成工具相對應的腳本文件是/cubi/bin/tools/gen_lang.php.
usage: php gen_lang.php [module] [locale] [translate]
範例:生成簡體中文語言包
# php gen_lang.php user zh_CN -t
其中「user」是模塊的名字,」zh_CN」是中文的語言代碼,「-t」參數是用於啓用基於」Google Translator」的自動翻譯功能
語言包生成工具將完成以下工做:
語言包管理模塊能夠幫助用戶完成以下工做:
Cubi的build 工具是用來實現輕鬆構建基於Cubi的應用程序而設計的,Cubi Builder其實是一個基於Phing (http://phing.info/trac/)之上的包裹性的腳本,Phing是一個相似Ant的項目打包工系統。
在進行打包以前,須要在cubi/build目錄中準備好下列文件:
打包程序的命令:
# cd cubi/build
# build app_name [target]
範例: 打包乾淨的Cubi應用程序
# build cubi tar
在運行玩打包命令以後,一個」gz」後綴的文件將會被生成到/cubi/build/dist/app_name/目錄中,具體文件名是根據在打包屬性文件中的設置來命名的,屬性文件還定義了以下內容
生成出的文件名應該是app_name-version-release.gz。例如:build.version是0.3而且build.release是1,那麼生成出的文件名就是app_name-0.3-1.gz.
關於build.xml的文件語法,請參考以下網址:
http://phing.info/trac/
http://ant.apache.org/manual/index.html
Cubi 容許開發人員選擇下來集中邏輯來存儲用戶會話數據
若是須要指定會話處理器,你能夠修改app_init.php的會話管理部分app.inc
/* define session save handler */
// save session in DATABASE
//define("SESSION_HANDLER", MODULE_PATH."/system/lib/SessionDBHandler");
// save session in MEMCACHE
//define("SESSION_HANDLER", MODULE_PATH."/system/lib/SessionMCHandler");
// for default FILE type session handler
define("SESSION_PATH", APP_HOME.DIRECTORY_SEPARATOR."session");
若是在app_init.php文件中沒有指定常量SESSION_HANDLER,默認狀況下,Cubi會將用戶會話數據保存在安裝目錄的sessions子目錄中,該目錄是默認在app_init.php文件中經過SESSION_PATH常量指定的,這裏建議經過一個計劃任務來按期清理該會話文件夾,以致於它不會變得過分臃腫。
使用文件系統類保存會話是一件很是容易的事情,不過弊端是不可以實現跨服務器的共向用戶會話,若是有這樣的須要您也許能夠考慮這樣來部署。
若是在app_init.php中的 SESSION_HANDLER 常量設置爲SessionDBHandler, Cubi 將會保存會話數據在」Session」數據庫中的session表中。
」Session」數據庫的鏈接方式能夠在系統根目錄的Config.xml文件中進行的定義,默認狀況下,session表就位於Cubi的安裝數據庫中,Cubi的會話表被配置爲」MEMORY」類型的數據表結構,這樣作是爲了最大化提高它的讀寫性能。
若是在app_init.php中的 SESSION_HANDLER 常量設置爲 SessionMCHandler, Cubi 將會存儲用戶會話數據在MemCache服務器中。
memcache 是一個快速的集中的會話共享解決方案,在Unix/Linux環境中,MemCache很是容易安裝部署,對於Windows服務器來講請參考以下文檔瞭解如何進行安裝部署。
http://www.leonardaustin.com/technical/how-to-install-memcached-on-xampp-on-windows-7 for
如您所見,經過在app_init.php中設置SESSION_HANDLER常量,您能夠制定裝載您本身的會話邏輯。
好比
// use custom logic to save session data
//define("SESSION_HANDLER", MODULE_PATH."/abc/MySessionHandler");