Em chào các anh ạ!
Em đang bắt đầu nghiên cứu về OpenERP nên còn nhiều điều chưa rõ, em rất mong nhận được ý kiến của các anh.
Em đang đọc tài liệu về kiến trúc của OpenERP và gặp phải những vấn đề sau:
1: Mô hình kiến trúc trong OpenERP
Ngay phần đầu tiên của tài liệu thì em thấy OpenERP mô tả về mô hình MVC và có đoạn:
MVC Model in OpenERP
In OpenERP, we can apply this model-view-controller semantic with
model : The PostgreSQL tables.
view : views are defined in XML files in OpenERP.
controller : The objects of OpenERP.
nhưng xuống phần tiếp theo thì em thấy họ lại viết OpenERP is a multitenant, three-tier architecture. The application tier itself is written
as a core, multiple additional modules can be installed to create a particular configuration of OpenERP.
=> Em không rõ là OpenERP được viết theo kiến trúc nào :(
=> Theo vốn kiến thức hạn hẹp của em thì em nghĩ model trong MVC thường bao gồm cả phần xử lý thao tác kết nối với database chứ ạ, sao ở đây model
lại chỉ là PostgreSQL table
2: Mối quan hệ giữa ORM và OSV
Em xin trích nguyên văn một đoạn em tìm hiểu trên diễn đàn erp thế này ạ:
"OpenERP được phát triển dựa trên framework OpenObject, một framework hướng mô đun, có khả năng mở rộng, và là một nền tảng trực quan được
viết bằng ngôn ngữ Python để giúp phát triển các ứng dụng một cách nhanh chóng.OpenObject có một bộ công cụ đầy đủ và hướng mô đun để xây
dựng các ứng dụng nhanh chóng: hỗ trợ Object-Relationship Mapping (ORM), mô hình Model-View-Controller (MVC), một hệ thống xuất báo cáo,
đa ngôn ngữ, và nhiều thứ khác nữa".
=> Em có tìm hiểu thêm về OpenObject nhưng không thu được nhiều, vẫn lơ mơ ạ hic hic
"Object Service – ORM
Là thành phần chính của OpenObject, Object Service(OSV) đưa ra một tầng ánh xạ hoàn thiện giữa đối tượng trong framework và bảng dữ liệu quan hệ dưới
PostgreSQL, giúp các nhà phát triển khỏi phải viết các câu lệnh SQL dài dòng.
Các đối tượng được khai báo giống như các lớp trong Python, được kế thừa từ lớp osv.osv; các đối tượng này là một phần của các model trong
OpenObject; tồn tại nhờ tầng ORM"
=> Em đã cài đặt đầy đủ công cụ để có thể viết module và có kiểm tra cấu trúc của dữ liệu nhưng em vẫn không hiểu mối liên quan giữa 2 lớp này
orm kế thừa từ osv hay thế nào.
Trên đây là những vấn đề mà em gặp phải mà chưa biết làm thế nào để giải quyết. Em mới tìm hiểu về OpenERP và có rất nhiều điều em chưa rõ, em rất mong
nhận được ý kiến, hướng dẫn của các anh. Mọi ý kiến của các anh đều rất quan trọng với em. Em xin chân thành cảm ơn các anh.
26 Trả lời
Trên quan điểm lập trình nói chung, các bạn nên phân biệt 3-tier và MVC.
Kiến trúc 3 - tầng là một kiểu kiến trúc bao gồm: tầng Data, Logic và Presentation. Trong khi đó, MVC là một bản mẫu. Ví dụ trong một module của OpenERP bạn cũng có thê sử dụng mẫu MVC để thiết kế module.
http://en\.wikipedia\.org/wiki/Multitier_architecture\#Three\-tier_architecture
Em cảm ơn anh đã trả lời.
Anh cho em hỏi thêm một chút thế này ạ. Trong module Purchase như hình đính kèm thì các file thể hiện MVC như thế nào. ví dụ phần view là các file .xml, phần controller là các file .py, còn phần model thì tương ứng như thế nào ạ. Em đọc trong tài liệu thấy ghi là phần model là postgreSQL tables nhưng không hiểu lắm ạ. Em cảm ơn anh nhiều!
Anh Leo ơi, anh cho em hỏi là anh bảo bug từ client mà ở đây là web client nhưng khi mình đưa vào eclipse thì chỉ là addons của server thôi mà anh, vậy mình bug thế nào ạ. Em vào theo đường dẫn: C:\Program Files\OpenERP 6.0\Web\addons thì thấy khá nhiều folder như hình bên dưới, em vào các folder thì đều thấy có 1 cái gọi là controller, anh cho em hỏi những file mako và những file như hình bên dưới có nghĩa là gì vậy anh, em cảm ơn anh
Anh Leo ơi, anh cho em hỏi là anh bảo bug từ client mà ở đây là web client nhưng khi mình đưa vào eclipse thì chỉ là addons của server thôi mà anh, vậy mình bug thế nào ạ. Em vào theo đường dẫn: C:\Program Files\OpenERP 6.0\Web\addons thì thấy khá nhiều folder như hình bên dưới, em vào các folder thì đều thấy có 1 cái gọi là controller, anh cho em hỏi những file mako và những file như hình bên dưới có nghĩa là gì vậy anh, em cảm ơn anhVới cách tiếp cận này em sẽ rất khó để nắm bắt được OpenERP, theo anh em nên đi theo hướng sau:
1. Tìm hiểu qua về ngôn ngữ python.
2. Nghiên cứu kiến trúc, mô hình của OpenERP.
3. Thử viết một module.
Không có ít nhất những kiến thức cơ bản trên mà mò thằng OpenERP này là điều cực kỳ khó.
Nhưng khi chạy file openerp_server trong addons đó thì nó sẽ chạy module purchase mà anh, em có cài đặt riêng đâu ạ.__openerp__.py trong một module bất kỳ có nhiệm vụ xác định các file xml sẽ được phân tích trong quá trình khởi chạy server và cũng để xác định sự phụ thuộc của các module tạo ra. Ngoài ra, nó bao gồm một số nội dụng dùng để miêu tả về module: bản quyền, tác giả,…. Do đó trong quá trình em chạy ứng dụng nó sẽ không chạy file này. File này chỉ dùng cho lúc cài đặt & upgrade.
Đây ạ,
H:ERPServer\bin\addons\purchase\__openerp__.py
Nó là cái addons của em ạ. Còn cái file server trong ổ C em tắt rồi ạ,em để cái này và chạy file openerp_server của nó ạ, trong file config em đổi đường dẫn rồi ạ.
Em dùng eclipse, em đang debug cái purchase order để xem cái xml nó hoạt động thế nào, osv nhân biết nó ra sao anh ạ. Vì như hôm qua anh giải thích thì cái xml nó được osv nhận biết nhưng em chưa hiểu lắm nên muốn xem control nào điều hướng nó để osv nhận biết và osv trả lại thế nào. Hic, em hiểu chậm nên muốn tìm hiểu kỹ thôi anh ạ. Mà anh ơi, lúc mình debug thì nó có nhảy vào file xml không ạ.
Hic hic, em ngồi debug thì gặp vấn đề thế này ạ. Khi em đặt break point tại file openerp.py thì khi chạy nó k dừng lại tại break point đó, còn khi em đặt tại một vị trí khác, giả sử như hàm unlink trong file sale.py thì nó dừng tại đó, hic, em muốn xem từ đầu khi nó sử dụng view, rồi osv, orm thế nào nên em muốn đặt break point từ đầu để xem mà không được. Các anh hướng dẫn em một chút được không ạ. Sau khi nghe anh Leo nói thì em cũng hiểu dần rồi ạ nhưng vẫn chưa thật sự rõ nên muốn debug để xem mà chả được, hicEm có thể cho anh biết đường dẫn file openerp.py mà em đặt brake point?
Hic hic, em ngồi debug thì gặp vấn đề thế này ạ. Khi em đặt break point tại file openerp.py thì khi chạy nó k dừng lại tại break point đó, còn khi em đặt tại một vị trí khác, giả sử như hàm unlink trong file sale.py thì nó dừng tại đó, hic, em muốn xem từ đầu khi nó sử dụng view, rồi osv, orm thế nào nên em muốn đặt break point từ đầu để xem mà không được. Các anh hướng dẫn em một chút được không ạ. Sau khi nghe anh Leo nói thì em cũng hiểu dần rồi ạ nhưng vẫn chưa thật sự rõ nên muốn debug để xem mà chả được, hic
1. Lớp nào sẽ dùng để nhận biết cấu trúc của file xml và khi người dùng nhập liệu rồi làm các thứ thì khi import dữ liệu nó sẽ thông qua lớp nào, phương thức nào ?Em thấy trong file orm có một phương thức là import_data()Thằng server sẽ làm việc này, cụ thể là osv
2. Em thấy mỗi menu hay action khi khai báo đều phải có id của nó, vậy cái view này nó lưu trữ ở đâu ?Nó được lưu trong bảng ir_ui_view (model ir.ui.view)
3. Em thấy trong file xml phải khai báo <field name="res_model">res.partner.address</field> tức là object mình muốn sử dụng để tạo View, vậy luồng hoạt động tiếp của nó sẽ là thế nào(osv sẽ lấy dữ liệu ở csdl lên view hay thế nào khác ?).Lúc này client sẽ gửi View lên WebService trên server thông qua cổng giao tiếp RPC. WebService gọi module base để xử lý. Module base thông qua ORM để tuơng tác với database (search, read, write, unlink,…) rồi gửi về cho client theo đường vừa rồi.
Em cám ơn anh, em cũng hiểu dần rồi ạ. Anh cho phép em hỏi thêm một số thứ nữa với ạ. Trong file xml sẽ sử dụng các thẻ để hiện thị dữ liệu ra ngoài,menu, trê, form..Em muốn hỏi thế này ạTheo mình bạn nên sử dụng bug của IDE rồi chạy từng bước.
1. Lớp nào sẽ dùng để nhận biết cấu trúc của file xml và khi người dùng nhập liệu rồi làm các thứ thì khi import dữ liệu nó sẽ thông qua lớp nào, phương thức nào ?Em thấy trong file orm có một phương thức là import_data()
2. Em thấy mỗi menu hay action khi khai báo đều phải có id của nó, vậy cái view này nó lưu trữ ở đâu ?
3. Em thấy trong file xml phải khai báo <field name="res_model">res.partner.address</field> tức là object mình muốn sử dụng để tạo View, vậy luồng hoạt động tiếp của nó sẽ là thế nào(osv sẽ lấy dữ liệu ở csdl lên view hay thế nào khác ?).
Trên đây là những điều em chưa rõ, em rất mong nhận được ý kiến của các anh. Em cảm ơn các anh rất nhiều vì đã nhiệt tình giúp đỡ em mặc dù em toàn hỏi những câu ngớ ngẩn :)
Em cám ơn anh, em cũng hiểu dần rồi ạ. Anh cho phép em hỏi thêm một số thứ nữa với ạ. Trong file xml sẽ sử dụng các thẻ để hiện thị dữ liệu ra ngoài,menu, trê, form..Em muốn hỏi thế này ạ
1. Lớp nào sẽ dùng để nhận biết cấu trúc của file xml và khi người dùng nhập liệu rồi làm các thứ thì khi import dữ liệu nó sẽ thông qua lớp nào, phương thức nào ?Em thấy trong file orm có một phương thức là import_data()
2. Em thấy mỗi menu hay action khi khai báo đều phải có id của nó, vậy cái view này nó lưu trữ ở đâu ?
3. Em thấy trong file xml phải khai báo <field name="res_model">res.partner.address</field> tức là object mình muốn sử dụng để tạo View, vậy luồng hoạt động tiếp của nó sẽ là thế nào(osv sẽ lấy dữ liệu ở csdl lên view hay thế nào khác ?).
Trên đây là những điều em chưa rõ, em rất mong nhận được ý kiến của các anh. Em cảm ơn các anh rất nhiều vì đã nhiệt tình giúp đỡ em mặc dù em toàn hỏi những câu ngớ ngẩn :)
Vậy mình có thể hiểu là model chính là osv.osv, osv.fields…, còn controller là các class trong file purchase.py (sử dụng osv làm tham số), còn view là các file .xml đúng không ạ. Em cảm ơn các anh!Chính xác thì như bác David nói, model ở đây là để truy cập và xử lý data, nhưng nó sẽ không làm việc trực tiếp mà thông qua thằng osv bằng cách truyền (osv.osv) vào các class trong file python.
file purchase.py của em ở đây có thể hiểu nó là controller. Trong quá trình controller em cần đến database (model) thì nó sẽ gọi thằng osv ra để xử lý cho em. Việc này có thể hiểu là nó chạy ngâm, vì thằng osv nó tự động xử cho em rồi. Ví dụ ở đây, trong purchase.py em có hàm là tinhtien(osv.osv). Nhiệm vụ của nó là nhờ thằng osv (model) vào database lấy dữ liệu ra co nó để nó tính toán, + - * /,... sau đó hiển thị ra ngoài (update view). Vậy có thể hiểu nó là controller, còn chức năng của model là thằng osv tự động xử lý.
Chủ đề này có vẻ sôi động nhỉ, tớ tham gia với :D
M ở trong MVC với trường hợp của các ứng dụng lớn như OpenERP thì nó không làm việc trực tiếp với Database (mặc dù nó vẫn chịu trách nhiệm Data Access), mà nó làm việc với Tier khác.
Tức là nguyên cả cái cụm MVC đóng vai trò làm Presentation Layer trong mô hình đa lớp của OpenERP. Lúc này, cái M trong MVC vẫn đảm nhiệm việc "nhào nặn" dữ liệu nhưng nó không làm việc trực tiếp
Em cảm ơn anh đã trả lời.Đúng như Dũng đã nói, trong trường hợp này có thể hiểu osv là "model". Tất cả các class trong module của OpenERP đều phải truyền osv.osv. Thằng này nó sẽ làm nhiệm vụ "model" như em hiểu.
Anh cho em hỏi thêm một chút thế này ạ. Trong module Purchase như hình đính kèm thì các file thể hiện MVC như thế nào. ví dụ phần view là các file .xml, phần controller là các file .py, còn phần model thì tương ứng như thế nào ạ. Em đọc trong tài liệu thấy ghi là phần model là postgreSQL tables nhưng không hiểu lắm ạ. Em cảm ơn anh nhiều!
Tuy nhiên, chúng ta nên hiểu OpenERP gồm 3 tầng: Server - Module - Client. Nguyên tắc của 3 tầng là client (presentation), không truy cập trực tiếp vào Server (Data) mà sẽ thông qua tầng Logic (Module). Đấy là cách hiểu nôm na về kiến trúc tổng thể của OpenERP trên quan điểm của cá nhân mình.
Chào cả nhà, trước khi thảo luận về Kiến trúc của OpenERP mình xin mạo muội trả lời câu hỏi của bạn Vuơng Tùy Chi như sau:
1. Trước tiên OpenERP là một kiến trúc 3 tầng (Three-tier architecture). Trong một ứng dụng lớn thì MVC chỉ là tầng Presentation. Nó chỉ quan tâm tới presentation và sử dụng một tầng ở giữa để cắm các model đã có dữ liệu từ tầng Data. Đó là sự khác biệt giữa kiến trúc 3 tầng và MVC.
2. Mối liên hệ giữ ORM và OSV:
- ORM là một kỹ thuật lập trình nói chung, dùng để chuyển đổi dữ liệu giữa các hệ thống không tuơng thích trong OOP. Cụ thể ở đây, bạn có một hệ thống là Python và một hệ thống PostgreSQL, 2 hệ thống này rõ ràng không tuơng thích với nhau, vậy để chuyển đổi dữ liệu giữa chúng, bạn cần sử dụng kỹ thuật ORM - nó chỉ là một kỹ thuật lập trình.
- OSV trong OpenERP là một tầng dùng để lưu trữ và xử lý dữ liệu. Bao gồm OSV (osv.osv) và OSV Memory (osv_memory). osv.osv lưu trữ và xử lý dữ liệu trong PostgreSQL, còn osv.memory lưu trữ và xử lý dữ liệu trên bộ nhớ, nó sẽ bị mất khi restart server. Để lưu trữ và xử lý dữ liệu thì OSV sử dụng kỹ thuật ORM.
Em cảm ơn anh.
Theo như anh nói thì MVC ở đây chỉ là tầng Presentation của OpenERP thôi đúng không ạ. Vậy tầng ở giữa để cắm các model đã có dữ liệu ở đây là gì ạ?
Kiến trúc MVC mà anh nói là bao gồm
model : The PostgreSQL tables.
view : views are defined in XML files in OpenERP.
controller : The objects of OpenERP
mà theo anh nói thì ở đây chỉ là tầng Presentation của OpenERP, vậy những tầng khác của OpenERP là gì ạ.
Em cảm ơn anh.