Xây dựng add-on và widget
Add-on và widget là những phương tiện mở rộng nhẹ hơn mô-đun.
- Add-on: xen vào quá trình xử lý của mọi yêu cầu để bổ sung hành vi (bộ đếm, tự động tạo liên kết, huy hiệu biệt danh, v.v.)
- Widget: mảnh nội dung cắm vào bất cứ đâu trong layout, trang (ô đăng nhập, bài viết mới nhất, v.v.)
Xây dựng add-on
addons/myaddon/
├── conf/info.xml ← 이름·설명·설정 항목
└── myaddon.addon.php ← 본체myaddon.addon.php được gọi ở nhiều thời điểm trong quá trình xử lý yêu cầu. Hiện đang ở thời điểm nào được xác định bằng biến $called_position.
<?php
if (!defined('__XE__'))
{
exit();
}
// 화면 HTML이 완성되기 직전에 한 번 실행
if ($called_position === 'before_display_content'
&& Context::getResponseMethod() === 'HTML'
&& Context::get('module') !== 'admin'
&& !isCrawler())
{
// $output 변수에 완성된 HTML이 들어 있고, 수정하면 그대로 반영됩니다
$output = str_replace('%FOO%', '바꿀 내용', $output);
}Các thời điểm gọi chính:
| $called_position | Thời điểm |
|---|---|
before_module_init | Trước khi chuẩn bị chạy mô-đun |
before_module_proc | Ngay trước khi chạy action |
after_module_proc | Ngay sau khi chạy action |
before_display_content | Ngay trước khi xuất HTML cuối cùng (có thể sửa $output) |
Những điểm cần lưu ý:
- Add-on chạy ở hầu hết mọi yêu cầu. Các tác vụ nặng (truy vấn DB, v.v.) hãy làm sau khi đã thu hẹp điều kiện tối đa, và lưu đệm kết quả.
- Màn hình quản trị (
Context::get('module') === 'admin') và phản hồi không phải HTML (JSON, v.v.) thường nên bỏ qua cho an toàn. - Nếu khai báo
<extra_vars>trongconf/info.xml, bạn có thể nhận giá trị từ cài đặt add-on trong trang quản trị, và đọc trong phần thân bằng$addon_info->{variable_name}.
Add-on được bật tắt ở danh sách add-on trên màn hình quản trị. Có thể chỉ định riêng cho PC/di động.
Xây dựng widget
widgets/mywidget/
├── conf/info.xml ← 이름·설명·설정 항목(extra_vars)
├── mywidget.class.php ← 본체
└── skins/default/ ← 위젯 스킨
├── skin.xml
└── widget.htmlPhần thân kế thừa WidgetHandler, và tên tệp, tên lớp phải giống tên widget.
<?php
class mywidget extends WidgetHandler
{
/**
* info.xml의 extra_vars 값이 $args로 들어옵니다.
* 결과 HTML을 출력하지 말고 반환해야 합니다.
*/
function proc($args)
{
$list = $this->getMyList((int)($args->count ?? 5));
Context::set('list', $list);
Context::set('colorset', $args->colorset);
$tpl_path = sprintf('%sskins/%s', $this->widget_path, $args->skin);
$oTemplate = TemplateHandler::getInstance();
return $oTemplate->compile($tpl_path, 'widget');
}
}- Các cài đặt khai báo bằng
<extra_vars>trongconf/info.xmltrở thành các mục nhập trên màn hình chèn widget. - Skin làm giống skin mô-đun. Biên dịch template trong thư mục skin được chọn bằng
$args->skinrồi trả về. - Kết quả thì đừng echo mà hãy return. Widget được ghép thành chuỗi trong quá trình lắp ráp trang.
Nơi dùng widget
- Chèn trên màn hình bố trí widget của layout, trang
- Trực tiếp trong template v2:
@widget('mywidget', $args) - Tính năng chèn widget trong nội dung trình soạn thảo
Nên làm theo cách nào
| Điều muốn làm | Phương tiện |
|---|---|
| Tự động hoạt động trên mọi trang (hiển thị, thay thế, ghi lại) | Add-on |
| Hộp nội dung quản trị viên cắm vào vị trí mong muốn | Widget |
| Tính năng có dữ liệu, màn hình, cài đặt riêng | Mô-đun |