Crear complementos y widgets
Los complementos (addons) y los widgets son formas de extensión más ligeras que los módulos.
- Complemento: interviene en el procesamiento de cada solicitud para agregar comportamiento (contador, enlaces automáticos, insignias de apodo, etc.)
- Widget: fragmento de contenido que se inserta en cualquier parte de un layout o página (ventana de inicio de sesión, publicaciones recientes, etc.)
Crear un complemento
addons/myaddon/
├── conf/info.xml ← 이름·설명·설정 항목
└── myaddon.addon.php ← 본체myaddon.addon.php se llama en varios momentos del procesamiento de la solicitud. Para saber en qué momento estás, usa la variable $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);
}Momentos de llamada principales:
| $called_position | Momento |
|---|---|
before_module_init | Antes de preparar la ejecución del módulo |
before_module_proc | Justo antes de ejecutar la acción |
after_module_proc | Justo después de ejecutar la acción |
before_display_content | Justo antes de enviar el HTML final (se puede modificar $output) |
Puntos de atención:
- Los complementos se ejecutan en casi todas las solicitudes. Haz el trabajo pesado (consultas a la base de datos, etc.) solo después de acotar al máximo las condiciones, y guarda el resultado en caché.
- Por lo general es más seguro omitir el panel de administración (
Context::get('module') === 'admin') y las respuestas que no son HTML (JSON, etc.). - Si declaras
<extra_vars>enconf/info.xml, puedes recibir valores desde los ajustes del complemento en la administración, y en el cuerpo los lees con$addon_info->{variable}.
Los complementos se activan y desactivan en la lista de complementos del panel de administración. Puedes definirlos por separado para PC y móvil.
Crear un widget
widgets/mywidget/
├── conf/info.xml ← 이름·설명·설정 항목(extra_vars)
├── mywidget.class.php ← 본체
└── skins/default/ ← 위젯 스킨
├── skin.xml
└── widget.htmlEl cuerpo hereda de WidgetHandler, y el nombre del archivo y de la clase deben ser iguales al nombre del 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');
}
}- Los ajustes declarados con
<extra_vars>enconf/info.xmlse convierten en los campos que se piden en la pantalla de inserción del widget. - Los skins funcionan igual que los skins de módulo. Compila y devuelve la plantilla de la carpeta del skin elegido en
$args->skin. - No hagas echo del resultado: usa return. Los widgets se unen como cadenas durante el armado de la página.
Dónde se usan los widgets
- Se insertan desde la pantalla de colocación de widgets del layout o la página
- Directamente en plantillas v2:
@widget('mywidget', $args) - Con la función de insertar widget en el cuerpo del editor
Qué conviene crear
| Lo que quieres hacer | Medio |
|---|---|
| Que funcione automáticamente en todas las páginas (mostrar, reemplazar, registrar) | Complemento |
| Una caja de contenido que el administrador coloca donde quiera | Widget |
| Una función con sus propios datos, pantallas y ajustes | Módulo |