Bắt đầu lập trình Joomla Component
Sau một thời gian tìm hiểu về lập trình component cho Joomla, tôi rút ra một điều: lập trình phát triển extension cho Joomla quả là một công việc khủng khiếp. Lý do chính là tài liệu về nó quá thiếu.
Trước hết là tài liệu tra cứu về Joomla API
Hầu như không có! Đúng ra là có một bộ tài liệu được sinh tự động từ mã nguồn của nó. Với mỗi class, hầu như chỉ có thông tin về danh sách các phương thức; còn thông tin về mỗi phương thức thì không có gì hơn những gì có thể tự hiểu qua tên gọi và danh mục tham số của nó.Sau là tài liệu hướng dẫn
Thực sự là rất ít và thiếu tính hệ thống. Những gì tôi tìm được là:- Có một bộ video tiếng Việt khá công phu (gần 200 video) hướng dẫn lập trình Joomla được chia sẻ trên Youtube ở đây: https://www.youtube.com/playlist?list=PLv6GftO355AtSD1_ATlapJMqvIQ6eh-lV
- Có một cuốn sách tiếng Anh "Learning Joomla!3 Extension Development" (3-rd edition). Và đây là một tài liệu hướng dẫn dạng "cầm tay chỉ việc" (hands-on).
- Bộ các tut (kèm video) bằng tiếng Anh: https://docs.joomla.org/J3.x:Developing_an_MVC_Component
Điều tôi có thể hiểu được là:
- cấu trúc file, thư mục của một component, kể cả phần Site hay phần Administration
- quy tắc đặt tên file, tên class cho các controller, view, model...
- Ý nghĩa của việc gọi phương thức $this->get('Item'), hay $this->get('Form') trong một view là gì. Tài liệu hướng dẫn chỉ nói là gọi nó, không hề giải thích. Sau này tôi tìm hiểu thêm mới hiểu được rằng hai lời gọi kia sẽ dẫn đến việc gọi phương thức getItem() và getForm() trong model tương ứng.
- Khi tạo toolbar với JToolbarHelper, ý nghĩa của các action dưới mỗi nút là gì, tại sao khi người dùng nhấn nút thì lại dẫn đến việc submit một form. Liên quan đến toolbar, sau một quá trình miệt mài tìm hiểu, mày mò, tôi mới vỡ ra mấy điểm: khi tạo toolbar thì trên trang phải có một form với [id="adminForm"], trong form đó phải có một trường ẩn tên là "task": [<input type="hidden" name="task" value="">], để khi người dùng nhấn một nút nào đó thì có một đoạn script được thực thi, nó sửa 'value' của 'task' theo task của nó, rồi thực hiện submit form.
- Tham số 'task' được sử dụng như thế nào trong Entry Point của component. Sau rất nhiều thời gian mày mò, tôi mới hiểu ra rằng giá trị 'task' được truyền đến component luôn có dạng 'controller.method'. Lời gọi JControllerLegacy::getInstance() sẽ kiểm tra giá trị của tham số 'task'; nếu tồn tại thì nó sẽ căn cứ vào phần 'controller' để khởi tạo controller tương ứng, đồng thời sửa giá trị của 'task' bằng cách bỏ đi phần 'controller' và chỉ còn phần 'method'; còn nếu không tồn tại 'task' thì lời gọi đó dẫn tới việc khởi tạo controller mặc định.
- Khi nào thì một view được gọi?
- Khi nào thì một model được gọi?
- Đoạn mã nào đã khiến dữ liệu người dùng được cập nhật vào bảng trong CSDL (đối với ví dụ trong cuốn tiếng Anh)?
- ...
Kinh nghiệm
Sau những trải nghiệm của mình, kinh nghiệm rút ra dành cho mọi người muốn bắt đầu học viết component cho Joomla là:
- Bắt đầu với một trong các bài hướng dẫn, để làm sao có được component hoạt động được. Sau bước này, phải hiểu được cấu trúc của một component cùng với quy tắc đặt tên file, class.
- Tìm hiểu, mổ xẻ component bằng cách debug: thêm vào các phương thức dòng [echo __METHOD__.'<br>';] để biết nó có được gọi hay không. Đây là "kỹ thuật" mà tôi học được từ bộ video tiếng Việt. Mục đích của bước này là tìm hiểu trình tự gọi các lớp, các phương thức khi một component hoạt động.
- Đọc bài viết về Joomla MVC ở đây: https://docs.joomla.org/Model-View-Controller, và có lẽ là cả bài viết này nữa: https://docs.joomla.org/Special:MyLanguage/Absolute_Basics_of_How_a_Component_Functions (tôi thấy nó ngay khi viết mấy dòng này và chưa kịp đọc luôn!!!!). Kết quả của bước này là hình dung được cấu trúc, hoạt động của một component.
- Khi cần sử dụng một đối tượng nào đó như Table, Form,... hãy tham khảo bài hướng dẫn trong danh sách bài viết ở đây: https://docs.joomla.org/API_Guides
Tổng hợp các tài liệu của Joomla dành cho developers
- Joomla MVC
- Component Program Flow
- JController and its subclass usage overview
- Absolute Basics of How a Component Functions
- Accessing the database using JDatabase: Joomla 3, Joomla 4
- How to use user state variables
- API Guides (usage of Joomla classes such as JTable, JForm, JDatabase, JUser, Menu...)
- Display error messages and notices
- Developing an MVC Component: Joomla 3, Joomla 4
- Creating a Simple Module: Joomla 3, Joomla 4
- Module Development Portal
- Creating a Plugin for Joomla: Joomla 3, Joomla 4
- Plugin Developer Overview
- Plugin Development Portal
- Create a content plugin: Joomla 3
- Developing a component frontend update function: Joomla 3
- Using multiple models in an MVC component
- Using the JToolBar class in the frontend: Joomla 2.5, Joomla 3
- Supporting plugins in your component
- Adding ACL rules to your component: Joomla 3
- Adding an API to a Joomla Component: Joomla 4
- Joomla Core APIs: Joomla 4
- Dependency Injection: Joomla 4
- Moving Joomla To Prepared Statements: Joomla 4
- Web Assets: Joomla 4
- Secure coding guidelines
- How to add CSRF anti-spoofing to forms
- How to implement actions in your code: Joomla 2.5
- Development Best Practices
- Generating JSON output
- Generating XML output
- Using caching to speed up your code
- Using Joomla Ajax Interface
- How to debug your code
- Git for Coders
- Joomla! Developers Portal
Comments
Post a Comment