Các bước triển khai

Một phần của tài liệu Luận văn: Tìm hiểu và triển khai hệ thống quản trị nhân sự dựa trên nền tảng OFBiz ppt (Trang 42 - 59)

4.2.1. Việt hóa Humanres

Như đã thấy ở trên, ngôn ngữ mặc định cho người dùng OFBiz là Tiếng anh, điều đó một phần gây khó khăn cho những nhà quản trị nhân sự. Bước tiếp theo chúng ta sẽ nghiên cứu việc Việt hóa hệ quản trị nhân sự Humanres trong OFBiz.

Vì OFBiz là hệ mã nguồn mở nên hỗ trợ rất nhiều ngôn ngữ, tiêu biểu trong đó là tiếng Anh, Pháp, Italy, Nga, Trung quốc .. Mỗi ngôn ngữ sẽ có một mã riêng tương ứng như hình vẽ dưới đây. Mã cho Tiếng Việt là [vi].

42

Để có thể Việt hóa hệ quản trị Humanres của OFBiz ta cần phải hiểu vị trí đặt các file ngôn ngữ trong OFBiz. Trong trường hợp này, ngôn ngữ được khai báo trong các file XML UILabels đặt trong thư mục config của framework và các ứng dụng. Với các file UILabels đặt trong {ofbiz}/humanres/config sẽ quy định ngôn ngữ cho riêng hệ quản trị Humanres và các file XML UILabels đặt trong {ofbiz}/…/config quy định ngôn ngữ chung của toàn hệ quản trị OFBiz.

Như cấu trúc bên dưới đây chúng ta có thể thấy một ví dụ về việc khai báo các trường và ngôn ngữ được dùng cho trường đó.

- <property key=””></property> : Dùng để khai báo trường trong OFBiz

43

Để Việt hóa chúng ta thêm giá trị <value xml:lang=”vi”></value> vào khai báo của mỗi trường. Làm tương tự với từng thành phần trong file xml HumanUILables ta sẽ Việt hóa được HR trong OFBiz.

Sau khi hoàn thành, chúng ta chạy lại OFBiz để hệ thống load lại dữ liệu được cập nhật. Tiếp theo tìm đến phần lựa chọn ngôn ngữ và đổi sang sử dụng Tiếng Việt, chúng ta có thể có được giao diện sử dụng như hình vẽ :

4.2.2. Thêm module mới

<property key="FormFieldTitle_applyingPartyId">

<value xml:lang="de">Anwendungsteilnehmer ID</value> <value xml:lang="en">Applying Party Id</value>

<value xml:lang="fr">Réf. d'acteur en demande</value> <value xml:lang="it">Soggetto Applicato</value> <value xml:lang="th">รหัสกลุ่มผู้ใช้</value>

<value xml:lang="zh">应聘申请人</value>

<value xml:lang="vi">ID phòng tuyển dụng</value>// Việt hóa

</property>

<property key="FormFieldTitle_bankName"> <value xml:lang="en">Bank Name</value>

<value xml:lang="fr">Nom de la banque</value> <value xml:lang="it">Nome Banca</value> <value xml:lang="th">ชื่อธนาคาร</value> <value xml:lang="zh">银行名称</value>

44

Hiện tại ứng dụng HR trong OFBiz có đầy đủ chức năng cần thiết để quản trị nhân sự trong một công ty nên không cần thiết phải thêm bất kì module mới nào. Dưới đây em sẽ trình bày cách thức viết một module mẫu trong OFBiz.

4.2.2.1. Xác định mô hình dữ liệu

Bước đầu tiên là xác định mô hình dữ liệu. Chúng ta muốn theo dõi từng cá nhân, sở thích của họ và tra cứu tất cả các sở thích của từng cá nhân ( hoặc tất cả mọi người có cùng 1 sở thích ). Do đó, mô hình dữ liệu ứng dụng với mỗi cá nhân, sở thích và liên kết giữa mỗi cá nhân và sở thích.

Với một cơ sở dữ liệu quan hệ, chúng ta sẽ định nghĩa hai bảng, một cho người và một cho một sở thích và liên kết chúng với nhau qua một bảng thứ ba. Bảng thứ ba sẽ cho phép bạn kết hợp bấy nhiêu sở thích mà bạn mong muốn với một người và ngược lại. Bạn sẽ định nghĩa khóa ngoài(foreign key) để ràng buộc bảng thứ ba chỉ dung để chỉ người và sở thích đang có.

OFBiz cũng hoạt động tương tự. Chúng ta sẽ xác định hai thực thể, trong đó chúng ta sẽ gọi là HelloPersonHelloHobby, và xây dựng một liên kết

HelloPersonHobby, sau đó thiết lập mối quan hệ giữa chúng. Mối quan hệ này được sử dụng như một ràng buộc khóa ngoài nhưng cũng cho phép chúng ta đi từ một thực thể đến một thực thể khác mà không phải tự mình nhớ từng khóa của chúng là gì (hoặc thay đổi code khi khóa thay đổi).

<entity entity-name="HelloPerson" package-name="org.ofbiz.hello3"

title="Entity for storing data about persons"> <field name="helloPersonId" type="id-ne"></field> <field name="firstName" type="id"></field>

<field name="lastName" type="id"></field> <field name="comments" type="comment"> </field> <prim-key field="helloPersonId"/>

</entity>

<entity entity-name="HelloHobby"

package-name="org.ofbiz.hello3" title="Hobbies avaiable">

<field name="helloHobbyId" type="id-ne"></field> <field name="description" type="description"></field> <prim-key field="helloHobbyId"/>

</entity>

<entity entity-name="HelloPersonHobby"

package-name="org.ofbiz.hello3" title="Entity and atribute Entity">

<field name="helloPersonId" type="id-ne"></field> <field name="helloHobbyId" type="id-ne"></field> <prim-key field="helloPersonId"/>

<prim-key field="helloHobbyId"/>

<relation type="one" fk-name="HPRSN_PRSN" rel-entity- name="HelloPerson">

<key-map field-name="helloPersonId"/> </relation>

<relation type="one" fk-name="HPRSN_HBBY" rel-entity- name="HelloHobby">

<key-map field-name="helloHobbyId"/> </relation>

45

Chú ý : Ở đây, chúng ta đang tạo ra một ứng dụng với mô hình dữ liệu hoàn toàn khép kín để minh họa. Nếu chúng ta xây dựng một ứng dụng thực tế, việc thực hành tốt nhất nếu chúng ta dùng lại được nhiều thực thể trong OFBiz nhất có thể, nên thay vì tạo ra HelloPerson riêng, chúng ta sẽ sử dụng các thực thể Party/ Person / PartGroup tồn tại của OFBiz.

Để xác định mô hình dữ liệu, tạo ra một thư mục bên trong Aplication ( trong trường hợp này là hello3 ) và tạo ra một file entitymodel.xml và entitygroup.xmld trong thư mục entitydef.

HelloPersonHelloHobby là 2 khóa chính, và HelloPersonHobby có 2 khóa chính, trong đó nó sử dụng liên kết HelloPersonHelloHobby. Nó được xem là sự áp dụng tốt để cung cấp một tên khóa ngoài cho các quan hệ, để giúp việc gỡ lỗi dễ dàng hơn và tránh trùng tên giữa các khóa ngoài do bạn tạo ra trong OFBiz.

Điều đó cũng rất quan trọng ( nhưng rất dễ quên ) để xác định các thực thể đó trong một file khác, entitygroup.xml, trong thư mục, do đó OFBiz sẽ biết được đâu là khóa đại diện và như vậy cơ sở dữ liệu sẽ được sử dụng.

Nếu không, các thực thể sẽ vẫn tồn tại trong OFBiz nhưng khi chúng ta thực sự cố gắng sử dụng chúng , chúng ta sẽ nhận được lỗi như sau :

org.ofbiz.entity.GenericEntityException: Helper name not found for entity HelloPerson

Cuối cùng, chúng ta phải thêm dòng dưới đây vào ofbiz-component.xml để OFBiz có thể biết sử dụng thực thể này như một phần ứng dụng của mình, phía trước <webapp>

Bây giờ chúng ta sẽ khởi động OFBiz, chúng ta sẽ thấy những thông báo trong consolo.log (Linux) hoặc giao diện điều khiển (Windows) , thông báo với bạn rằng thực thể của bạn đã được nạp :

<entity-resource type="model" reader-name="main" loader="main" location="entitydef/entitymodel.xml"/>

<entity-resource type="group" reader-name="main" loader="main" location="entitydef/entitygroup.xml"/>

5336 (main) [ UtilXml.java:242:DEBUG] XML Read 0.0070s: /home/sichen/eclipse/workspace/ofbiz/hot-

deploy/hello3/entitydef/entitymodel.xml

5693 (main) [ UtilXml.java:242:DEBUG] XML Read 0.0050s: /home/sichen/eclipse/workspace/ofbiz/hot-

46

Khi đó bạn vào webtools, bạn có thể thấy những thực thể :

Click vào “All” bên phải HelloPerson bạn sẽ thấy tất cả những trường của mình :

47

Chú ý rằng bên cạnh mỗi trường là kiểu Java và kiểu SQL cho từng trường. Loại SQL được quy định trong framework/entity/filedtype/ thư mục và thay đổi tùy theo cơ sở dữ liệu bạn đang sử dụng (đang dùng trên là Derby). Nếu có bất kỳ già trị nào cho thực thể này, nó sẽ được hiển thị bên dưới các trường.

4.2.2.2. Tạo dữ liệu gốc

Tiếp theo chúng ta sẽ tạo ra một số dữ liệu gốc cho sở thích của chúng ta. Trong hầu hết các ứng dụng của OFBiz, chúng ta sẽ tạo ra thư mục data trong ứng dụng và tạo file XML cho dữ liệu gốc. Chúng ta đặt tên file đó là HobbiesData.xml:

File này được gọi là file phương tiện thực thể (entity engine)dạng file XML, là một định dạng tiêu chuẩn của OFBiz dùng cho việc nhập và xuất dữ liệu. Nó thực sự rất đơn giản. Sử dụng tên của thực thể ( “HelloHobby” trong trường hợp của chúng ta ) cho thẻ tên, và sử dụng tên các trường hoặc thuộc tính như bên trong các thẻ (Xem giá trị cuối cùng cho “WINE”. Các giá trị cho các trường của chúng ta có thẻ là giá trị của các thuộc tính hoặc bên trong các thẻ nội bộ(inner tags), cũng như nơi chúng có thể ở bên trong CDATA, trong trường hợp bạn có giá trị rất dài. Ngoài ra các khóa cho từng trường không cần phải là chữ hoa hoặc cách nhau bởi dấu _ , nhưng đó là quy tắc tiêu chuẩn của ứng dụng OFBiz).

Bây giờ, chúng ta đã sẵn sàng để nạp dữ liệu gốc. Chuyển tới màn hình chính của ứng dụng Webtools, và chúng ta sẽ thấy liên kết “XML Import”. Nhấn

<?xml version="1.0" encoding="UTF-8"?> <entity-engine-xml>

<HelloHobby helloHobbyId="READING" description="Reading"/> <HelloHobby helloHobbyId="MOVIES" description="Movies"/> <HelloHobby helloHobbyId="THEATER" description="The theater"/> <HelloHobby helloHobbyId="OPERA" description="The Opera"/> <HelloHobby helloHobbyId="SKIING" description="Skiing"/> <HelloHobby helloHobbyId="SURFING" description="Surfing"/>

<HelloHobby helloHobbyId="WINDSURFING" description="Windsurfing"/> <HelloHobby helloHobbyId="BASKETBALL" description="Basketball"/> <HelloHobby helloHobbyId="FOOLBALL" description="Football"/> <HelloHobby helloHobbyId="FOOTBALL_US" description="Soccer"/> <HelloHobby helloHobbyId="COOKING" description="Cooking"/> <HelloHobby helloHobbyId="WINE">

<description >Wine </description> </HelloHobby>

48

vào nút “XML Import” và trên màn hình kế tiếp sẽ yêu cầu điền tên của tập tin của chúng ta, liên quan đến thư mục OFBiz. Tôi thường không bấm vào bất kỳ hộp kiểm tra tùy chọn nào và chỉ cần nhập “Import”. Nếu chúng ta thành công, sẽ có một màn hình tương tự trở lại và hiển thị ở dưới báo cho bạn biết có bao nhiêu giá trị được thêm vào :

Nếu quá trình import dữ liệu bị hỏng, chúng ta nên đọc các thông báo lỗi từ console.log cẩn thận. Thường là do những lý do sau đây :

1. Sử dụng giá trị quá dài cho primary key. Các ID trong OFBiz thường là biến kiểu String trong Java, nhưng đối với SQL nó là kiểu 20-char VARCHAR.

2. Thiếu một khóa chính cần thiết.

49

Nếu chúng ta đọc cẩn thận file .log, chúng ta có thể xác định được giá trị OFBiz nào đã được tạo ra và phản ứng về dữ liệu lỗi từ hệ thống là gì. Nó cũng có thể đưa cho chúng ta một cái tên khóa ngoài hơi khó hiểu để tìm ra sự vi phạm điều kiện của khóa ngoài.

Chúng ta cũng có thể nhận thấy một đường dẫn thông báo “XML Export” trên trang Webtools. Các liên kết này có thể tạo ra các thực thể XML file.

Tiếp theo, chúng ta xem phần “Entity Maintenance”. Từ trang “Main”, click vào “All” bên cạnh HelloHobby, chúng ta sẽ thấy những sở thích đã được chèn vào :

Ngoài các trường và giá trị của chúng ta, OFBiz cũng tự động tạo timestamps khi các giá trị đó được tạo ra và cập nhât, đồng bộ hóa dữ liệu trên nhiều trường hợp của OFBiz. Cuối cùng, OFBiz có thể tự động cài đặt các dữ liệu

50

gốc trong quá trình cài đặt, nếu chúng ta thêm dòng sau vào file ofbiz- component.xml :

<entity-resource type="data" reader-name="seed" loader="main" location="data/HobbiesData.xml"/>

OFBiz thực sự cho phép xác định liệu dữ liệu của bạn có phải là “gốc” hay không, có nghĩa là chúng được yêu cầu để ứng dụng của bạn chạy một cách chắc chắn , và “demo” , có nghĩa là chúng mới chỉ để dùng cho mô phỏng giới thiệu trước.

4.2.2.3. Tạo Business Logic

Bây giờ chúng ta đã có mô hình dữ liệu xác định, chúng ta sẽ học cách viết một ứng dụng đơn giản với một delegator để truy cập trực tiếp vào các thực thể. Tuy nhiên, mẫu chuẩn cho các ứng dụng OFBiz, dùng để tạo ra một lớp riêng cho tầng business logic và để tạo, cập nhật và gỡ bỏ các thực thể. Delegator thường được dùng để tra cứu các giá trị một cách trực tiếp, mặc dù sự tìm kiếm phức tạp hơn được code như một service.

Tạo dịch vụ là một quá trình gồm hai bước. Trước tiên, nhìn chung bạn xác định các dịch vụ chung trong một file XML, cái mà thông báo với máy dịch vụ (OFBiz service engine) rằng tham số nào dịch vụ của bạn cần lấy và có thể lấy chúng ở ( clsss và phương pháp hoặc vị trí của script). Sau đó, bạn thi hành dịch vụ trong java, OFBiz minilang hoặc các ngông ngữ scripting khác.

Định nghĩa của Service thông thường ở bên trong thư mục servicedef trong ứng dụng của chúng ta và bao gồm một hoặc nhiều file services.xml. Đây là file services.xml của ví dụ:

<?xml version="1.0" encoding="UTF-8"?>

<description> Hello 3 Services </description> <service name ="createHelloPerson" engine="java"

location="org.ofbiz.hello3.Hello3Services" invoke="createHelloPerson">

<description> Create a HelloPerson </description>

<auto-attributes mode="IN" entity-name="HelloPerson" include="nompk" optional="true"/>

<attribute name="helloPersonId" mode="OUT" type="String" optional="false"/>

</service>

<service name="createHelloPersonHobby" engine="simple" location="org/ofbiz/hello3/Hello3Services.xml" invoke="createHelloPersonHobby">

<description> Create a HelloPersonHobby which links a person and a hobby </description>

<auto-attributes mode="IN" entity-name="HelloPersonHobby" include="pk" optional="false"/>

</service> </service>

51

Chú ý làm thế nào file services.xml chiếu đến thực thể, làm việc trực tiếp với thẻ <auto-atrributes> thay vì xác định chúng hoàn toàn. Điều này giúp chúng ta tiết kiệm thời gian và ứng dụng dễ dàng duy trì hơn.

Chúng ta cũng cần tham khảo các tài nguyên service trong ofbiz- component.xml. Ngoài ra, chúng ta phải tạo <classpath> để chỉ rõ đường dẫn nơi để tải của ứng dụng. Đây là file ofbiz-component trong ví dụ, sau khi thêm classpaths, định nghĩa các thực thể, định nghĩa các dịch vụ và dữ liệu gốc .

Bây giờ ta sẽ tạo các dịch vụ services. Một java service bên trong thư mục src/ trong ứng dụng của bạn và được ghi với kiểu mẫu sau: Một lớp public với phương thức public static lấy 2 tham số, một DispatchContext để lấy các đối tượng giống như delegator, dispatcher , vị trí và bảo mật, và một Map gọi một phạm vi : tham số dự liệu input của bạn và trả lại một bản kết quả:

Java services cũng cần được biên dịch, với kiến thức của classpaths thích hợp cho những ứng dụng của OFBiz khác. Điều này liên quan đến việc xử dụng và xây ant dựng file build.xml, cái mà bạn có thể copy từ một ứng dụng khác. Nó là một tập tin tiểu chuẩn trong tất cả các ứng dụng của OFBiz.

Việc xây dựng quy trình cơ bản là lấy tất cả các file trong thư mục src, biên dịch chúng và đặt chúng vào thư mục build/lib.

Minilang đơn giản hơn nhiều bằng cách so sánh. Các minilang service đơn giản ở bên trong thư mục script và là một file xml với các hướng dẫn. Bởi vì chúng được thiết kế đặc biệt cho các nhiệm vụ ứng dụng phổ biến của OFBiz, chẳng hạn như tra cứu dữ liệu, lưu trữ dữ liệu, kiểm tra sự cho phép, và làm việc với các thực thể tồn tại và các services, nó có thể tạo ra các nhiệm vụ rất dễ dàng :

Cuối cùng, để kiểm tra nó, chúng ta khởi động lai OFBiz để load lại tất cả các định nghĩa mới trong ofbiz-component.xml và services.xml. Sau đó mở cửa

<?xml version="1.0" encoding="UTF-8" ?>

<simple-method method-name="createHelloPersonHobby" short-description="Create a Hobby-Person relationship" login-required="false">

<make-value entity-name="HelloPersonHobby" value-name="newEntity"/> <set-nonpk-fields map-name="parameters" value-name="newEntity"/> <set-pk-fields map-name="parameters" value-name="newEntity"/> <create-value value-name="newEntity"/>

52

sổ beanshell và thử nghiệm các service ( Lưu ý : trước hết bạn cần tải file bshcontainer.bsh và đặt nó trong thư mục ofbiz ).

Ở đây, beanshell được gọi là service dispatchet để chạy các service, và chúng đã chạy thành công, do đó, các giá trị đúng được tạo ra.

Chúng ta đã tạo xong data model và service cho ứng dụng. Bước tiếp theo chúng ta sẽ đưa chúng vào web application.

4.2.2.4. Tạo Web Application

Application web sẽ hiện thị danh sách những khách đã truy cập trang web và cho phép chúng ta thêm tên của mình vào danh sách này. Chúng ta cũng có thể click vào một người bất kì và thêm sở thích cho người đó từ một danh sách đã có sẵn. Chúng ta sẽ xây dựng các ứng dụng với OFBiz screen-widgets và form- widgets, từ đó chỉ ra làm thế nào những công cụ này có thể xây dựng các web application trực tiếp từ các trường của thực thể mô hình dữ liệu data model và business logic services, mà không có mã HTML lặp đi lặp lại hoặc code Java.

Trước tiên, chúng ta sẽ tạo ra hai màn hình mới trong screen-widget cho trang cá nhân và sở thích. Trong mỗi trang, có hai form, một trong những form hiển thị danh sách cá nhân hoặc hiển thị sở thích, cái còn lại để thêm thực thể khác.

Lưu ý ở đây rằng chúng ta không sử dung mẫu Freemaker (.ftl) nhưng thay vào đó gọi một form trực tiếp. Ngoài ra, thay vì sử dụng một script .bsh để tìm dữ liệu từ các thực thể, chúng ta đang sử dụng chỉ thị như <entity-and> và <entity- one> trong <action> một phần của screen. Cả hai công cụ được thiết kế để đơn

Một phần của tài liệu Luận văn: Tìm hiểu và triển khai hệ thống quản trị nhân sự dựa trên nền tảng OFBiz ppt (Trang 42 - 59)