Ir al contenido
Docs

Guía para desarrolladores

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_positionMomento
before_module_initAntes de preparar la ejecución del módulo
before_module_procJusto antes de ejecutar la acción
after_module_procJusto después de ejecutar la acción
before_display_contentJusto 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> en conf/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.html

El 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> en conf/info.xml se 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 hacerMedio
Que funcione automáticamente en todas las páginas (mostrar, reemplazar, registrar)Complemento
Una caja de contenido que el administrador coloca donde quieraWidget
Una función con sus propios datos, pantallas y ajustesMódulo