Pular para o conteúdo

Sistema de Módulo XOOPS

O Sistema de Módulo XOOPS fornece um framework completo para desenvolver, instalar, gerenciar e estender a funcionalidade do módulo. Os módulos são pacotes auto-contidos que estendem o XOOPS com recursos e capacidades adicionais.

graph TD
A[Pacote de Módulo] -->|contém| B[xoops_version.php]
A -->|contém| C[Interface de Administrador]
A -->|contém| D[Interface de Usuário]
A -->|contém| E[Arquivos de Classe]
A -->|contém| F[Schema SQL]
B -->|define| G[Metadados de Módulo]
B -->|define| H[Páginas de Administrador]
B -->|define| I[Páginas de Usuário]
B -->|define| J[Blocos]
B -->|define| K[Hooks]
L[Gerenciador de Módulo] -->|lê| B
L -->|controla| M[Instalação]
L -->|controla| N[Ativação]
L -->|controla| O[Atualização]
L -->|controla| P[Desinstalação]

Estrutura de diretório padrão de módulo XOOPS:

mymodule/
├── xoops_version.php # Manifesto de módulo e configuração
├── admin.php # Página principal do administrador
├── index.php # Página principal do usuário
├── admin/ # Diretório de páginas de administrador
│ ├── main.php
│ ├── manage.php
│ └── settings.php
├── class/ # Classes do módulo
│ ├── Handler/
│ │ ├── ItemHandler.php
│ │ └── CategoryHandler.php
│ └── Objects/
│ ├── Item.php
│ └── Category.php
├── sql/ # Schemas de banco de dados
│ ├── mysql.sql
│ └── postgres.sql
├── include/ # Arquivos de inclusão
│ ├── common.inc.php
│ └── functions.php
├── templates/ # Templates de módulo
│ ├── admin/
│ │ └── main.tpl
│ └── user/
│ ├── index.tpl
│ └── item.tpl
├── blocks/ # Blocos de módulo
│ └── blocks.php
├── tests/ # Testes unitários
├── language/ # Arquivos de idioma
│ ├── english/
│ │ └── main.php
│ └── spanish/
│ └── main.php
└── docs/ # Documentação

A classe XoopsModule representa um módulo XOOPS instalado.

namespace Xoops\Core\Module;
class XoopsModule extends XoopsObject
{
protected int $moduleid = 0;
protected string $name = '';
protected string $dirname = '';
protected string $version = '';
protected string $description = '';
protected array $config = [];
protected array $blocks = [];
protected array $adminPages = [];
protected array $userPages = [];
}
PropriedadeTipoDescrição
$moduleidintID de módulo único
$namestringNome de exibição do módulo
$dirnamestringNome do diretório do módulo
$versionstringVersão atual do módulo
$descriptionstringDescrição do módulo
$configarrayConfiguração do módulo
$blocksarrayBlocos do módulo
$adminPagesarrayPáginas do painel de administrador
$userPagesarrayPáginas voltadas para o usuário
public function __construct()

Cria uma nova instância de módulo e inicializa variáveis.

Obtém o nome de exibição do módulo.

public function getName(): string

Retorna: string - Nome de exibição do módulo

Exemplo:

$module = new XoopsModule();
$module->setVar('name', 'Publisher');
echo $module->getName(); // "Publisher"

Obtém o nome do diretório do módulo.

public function getDirname(): string

Retorna: string - Nome do diretório do módulo

Exemplo:

echo $module->getDirname(); // "publisher"

Obtém a versão atual do módulo.

public function getVersion(): string

Retorna: string - String de versão

Exemplo:

echo $module->getVersion(); // "2.1.0"

Obtém a descrição do módulo.

public function getDescription(): string

Retorna: string - Descrição do módulo

Exemplo:

$desc = $module->getDescription();

Recupera a configuração do módulo.

public function getConfig(string $key = null): mixed

Parâmetros:

ParâmetroTipoDescrição
$keystringChave de configuração (null para todas)

Retorna: mixed - Valor de configuração ou array

Exemplo:

$config = $module->getConfig();
$itemsPerPage = $module->getConfig('items_per_page');

Define a configuração do módulo.

public function setConfig(string $key, mixed $value): void

Parâmetros:

ParâmetroTipoDescrição
$keystringChave de configuração
$valuemixedValor de configuração

Exemplo:

$module->setConfig('items_per_page', 20);
$module->setConfig('enable_cache', true);

Obtém o caminho do sistema de arquivos completo para o módulo.

public function getPath(): string

Retorna: string - Caminho de diretório de módulo absoluto

Exemplo:

$path = $module->getPath(); // "/var/www/xoops/modules/publisher"
$classPath = $module->getPath() . '/class';

Obtém a URL para o módulo.

public function getUrl(): string

Retorna: string - URL do módulo

Exemplo:

$url = $module->getUrl(); // "http://example.com/modules/publisher"

A função de instalação do módulo definida em xoops_version.php:

function xoops_module_install_modulename($module)
{
// $module é uma instância de XoopsModule
// Criar tabelas de banco de dados
// Inicializar configuração padrão
// Criar pastas padrão
// Definir permissões de arquivo
return true; // Sucesso
}

Parâmetros:

ParâmetroTipoDescrição
$moduleXoopsModuleO módulo sendo instalado

Retorna: bool - Verdadeiro em sucesso, falso em falha

Exemplo:

function xoops_module_install_publisher($module)
{
// Obter caminho do módulo
$modulePath = $module->getPath();
// Criar diretório de uploads
$uploadsPath = XOOPS_ROOT_PATH . '/uploads/publisher';
if (!is_dir($uploadsPath)) {
mkdir($uploadsPath, 0755, true);
}
// Obter conexão de banco de dados
global $xoopsDB;
// Executar script de instalação SQL
$sqlFile = $modulePath . '/sql/mysql.sql';
if (file_exists($sqlFile)) {
$sqlQueries = file_get_contents($sqlFile);
// Executar consultas (simplificado)
$xoopsDB->queryFromFile($sqlFile);
}
// Definir configuração padrão
$module->setConfig('items_per_page', 10);
$module->setConfig('enable_comments', true);
return true;
}

A função de desinstalação do módulo:

function xoops_module_uninstall_modulename($module)
{
// Descartar tabelas de banco de dados
// Remover arquivos carregados
// Limpar configuração
return true;
}

Exemplo:

function xoops_module_uninstall_publisher($module)
{
global $xoopsDB;
// Descartar tabelas
$tables = ['publisher_items', 'publisher_categories', 'publisher_comments'];
foreach ($tables as $table) {
$xoopsDB->query('DROP TABLE IF EXISTS ' . $xoopsDB->prefix($table));
}
// Remover pasta de upload
$uploadsPath = XOOPS_ROOT_PATH . '/uploads/publisher';
if (is_dir($uploadsPath)) {
// Exclusão recursiva de diretório
$this->recursiveRemoveDir($uploadsPath);
}
return true;
}

Os hooks do módulo permitem que os módulos se integrem com outros módulos e o sistema.

Em xoops_version.php:

$modversion['hooks'] = [
'system.page.footer' => [
'function' => 'publisher_page_footer'
],
'user.profile.view' => [
'function' => 'publisher_user_articles'
],
];
// Em um arquivo de módulo (ex: include/hooks.php)
function publisher_page_footer()
{
// Retornar HTML para rodapé
return '<div class="publisher-footer">Publisher Footer Content</div>';
}
function publisher_user_articles($user_id)
{
global $xoopsDB;
// Obter artigos do usuário
$result = $xoopsDB->query(
'SELECT * FROM ' . $xoopsDB->prefix('publisher_articles') .
' WHERE author_id = ? ORDER BY published DESC LIMIT 5',
[$user_id]
);
$articles = [];
while ($row = $xoopsDB->fetchAssoc($result)) {
$articles[] = $row;
}
return $articles;
}
HookParâmetrosDescrição
system.page.headerNenhumSaída de cabeçalho de página
system.page.footerNenhumSaída de rodapé de página
user.login.successObjeto $userApós login do usuário
user.logoutObjeto $userApós logout do usuário
user.profile.view$user_idVisualizando perfil do usuário
module.installObjeto $moduleInstalação do módulo
module.uninstallObjeto $moduleDesinstalação do módulo

O serviço ModuleManager manipula operações de módulo.

Recupera um módulo pelo nome.

public function getModule(string $dirname): ?XoopsModule

Parâmetros:

ParâmetroTipoDescrição
$dirnamestringNome do diretório do módulo

Retorna: ?XoopsModule - Instância do módulo ou null

Exemplo:

$moduleManager = $kernel->getService('module');
$publisher = $moduleManager->getModule('publisher');
if ($publisher) {
echo $publisher->getName();
}

Obtém todos os módulos instalados.

public function getAllModules(bool $activeOnly = true): array

Parâmetros:

ParâmetroTipoDescrição
$activeOnlyboolRetornar apenas módulos ativos

Retorna: array - Array de objetos XoopsModule

Exemplo:

$activeModules = $moduleManager->getAllModules(true);
foreach ($activeModules as $module) {
echo $module->getName() . " - " . $module->getVersion() . "\n";
}

Verifica se um módulo está ativo.

public function isModuleActive(string $dirname): bool

Exemplo:

if ($moduleManager->isModuleActive('publisher')) {
// Módulo Publisher está ativo
}

Ativa um módulo.

public function activateModule(string $dirname): bool

Exemplo:

if ($moduleManager->activateModule('publisher')) {
echo "Publisher ativado";
}

Desativa um módulo.

public function deactivateModule(string $dirname): bool

Exemplo:

if ($moduleManager->deactivateModule('publisher')) {
echo "Publisher desativado";
}

Exemplo completo de manifesto de módulo:

<?php
/**
* Manifesto de módulo para Publisher
*/
$modversion = [
'name' => 'Publisher',
'version' => '2.1.0',
'description' => 'Módulo profissional de publicação de conteúdo',
'author' => 'Comunidade XOOPS',
'credits' => 'Baseado no trabalho original de...',
'license' => 'GPL v2',
'official' => 1,
'image' => 'images/logo.png',
'dirname' => 'publisher',
'onInstall' => 'xoops_module_install_publisher',
'onUpdate' => 'xoops_module_update_publisher',
'onUninstall' => 'xoops_module_uninstall_publisher',
// Páginas de administrador
'hasAdmin' => 1,
'adminindex' => 'admin/main.php',
'adminmenu' => [
[
'title' => 'Dashboard',
'link' => 'admin/main.php',
'icon' => 'dashboard.png'
],
[
'title' => 'Manage Items',
'link' => 'admin/items.php',
'icon' => 'items.png'
],
[
'title' => 'Settings',
'link' => 'admin/settings.php',
'icon' => 'settings.png'
]
],
// Páginas de usuário
'hasMain' => 1,
'main_file' => 'index.php',
// Blocos
'blocks' => [
[
'file' => 'blocks/recent.php',
'name' => 'Recent Articles',
'description' => 'Display recent published articles',
'show_func' => 'publisher_recent_show',
'edit_func' => 'publisher_recent_edit',
'options' => '5|0|0',
'template' => 'publisher_block_recent.tpl'
],
[
'file' => 'blocks/featured.php',
'name' => 'Featured Articles',
'description' => 'Display featured articles',
'show_func' => 'publisher_featured_show',
'edit_func' => 'publisher_featured_edit'
]
],
// Hooks de módulo
'hooks' => [
'system.page.footer' => [
'function' => 'publisher_page_footer'
],
'user.profile.view' => [
'function' => 'publisher_user_articles'
]
],
// Itens de configuração
'config' => [
[
'name' => 'items_per_page',
'title' => '_MI_PUBLISHER_ITEMS_PER_PAGE',
'description' => '_MI_PUBLISHER_ITEMS_PER_PAGE_DESC',
'formtype' => 'text',
'valuetype' => 'int',
'default' => '10'
],
[
'name' => 'enable_comments',
'title' => '_MI_PUBLISHER_ENABLE_COMMENTS',
'description' => '_MI_PUBLISHER_ENABLE_COMMENTS_DESC',
'formtype' => 'yesno',
'valuetype' => 'int',
'default' => '1'
]
]
];
function xoops_module_install_publisher($module)
{
// Lógica de instalação
return true;
}
function xoops_module_update_publisher($module)
{
// Lógica de atualização
return true;
}
function xoops_module_uninstall_publisher($module)
{
// Lógica de desinstalação
return true;
}
  1. Namespace Suas Classes - Use namespaces específicos de módulo para evitar conflitos

  2. Use Handlers - Sempre use classes de handler para operações de banco de dados

  3. Internacionalize Conteúdo - Use constantes de idioma para todas as strings voltadas para o usuário

  4. Crie Scripts de Instalação - Forneça schemas SQL para tabelas de banco de dados

  5. Documente Hooks - Documente claramente quais hooks seu módulo fornece

  6. Version Seu Módulo - Incremente números de versão com lançamentos

  7. Teste Instalação - Teste completamente processos de install/uninstall

  8. Manipule Permissões - Verifique permissões de usuário antes de permitir ações

<?php
/**
* Página Principal do Módulo de Artigos Personalizados
*/
include __DIR__ . '/include/common.inc.php';
// Obter instância de módulo
$module = xoops_getModuleByDirname('mymodule');
// Verificar se módulo está ativo
if (!$module) {
die('Módulo não encontrado');
}
// Obter configuração do módulo
$itemsPerPage = $module->getConfig('items_per_page');
// Obter handler de item
$itemHandler = xoops_getModuleHandler('item', 'mymodule');
// Buscar itens com paginação
$criteria = new CriteriaCompo();
$criteria->add(new Criteria('status', 1));
$items = $itemHandler->getObjects($criteria, $itemsPerPage);
// Preparar template
$xoopsTpl->assign('items', $items);
$xoopsTpl->assign('module_name', $module->getName());
$xoopsTpl->display($module->getPath() . '/templates/user/index.tpl');
  • ../Kernel/Kernel-Classes - Inicialização do kernel e serviços principais
  • ../Template/Template-System - Templates do módulo e integração de tema
  • ../Database/QueryBuilder - Construção de consultas de banco de dados
  • ../Core/XoopsObject - Classe base de objetos

Veja também: Guia de Desenvolvimento de Módulo XOOPS