Chuyển đến nội dung
Tài liệu

Hướng dẫn cho nhà phát triển

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_positionThời điểm
before_module_initTrước khi chuẩn bị chạy mô-đun
before_module_procNgay trước khi chạy action
after_module_procNgay sau khi chạy action
before_display_contentNgay 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> trong conf/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.html

Phầ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> trong conf/info.xml trở 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->skin rồ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àmPhươ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ốnWidget
Tính năng có dữ liệu, màn hình, cài đặt riêngMô-đun