Se você administra sites em Joomla e utiliza o plugin TrackActions (comumente parte do SecurityCheck Pro) para monitorar atividades, pode ter se deparado com um erro fatal ao tentar fazer upload de arquivos ou salvar determinados conteúdos.
Este erro interrompe o fluxo de trabalho e gera logs frustrantes. Neste artigo, detalhamos a causa raiz e fornecemos o código exato para corrigir o problema definitivamente, garantindo compatibilidade com o Joomla 5 e as versões alpha do Joomla 6.
O Problema
O erro ocorre principalmente quando componentes do Joomla (como o com_media, o gerenciador de mídia) passam objetos simples (stdClass) para os eventos do sistema, enquanto o plugin espera objetos do tipo Registry que possuem o método especial get().
Mensagem de Erro:
Call to undefined method stdClass::get()
Arquivo Afetado:plugins/system/trackactions/src/Extension/Trackactions.php
Cenário Comum:
O erro é frequentemente disparado ao fazer upload de imagens pelo Gerenciador de Mídia, onde o contexto é com_media.file.
A Solução Técnica
A correção envolve adicionar uma verificação simples no código PHP do plugin. Precisamos checar se o objeto recebido possui o método get() nativamente antes de tentar usá-lo. Caso contrário, devemos acessar a propriedade diretamente como um objeto padrão.
Abaixo estão as correções para os três métodos afetados no arquivo Trackactions.php.
1. Método onContentAfterSave
Localize a função onContentAfterSave (aproximadamente na linha 269) e substitua o bloco de lógica inicial.
Como está (Com Bug):
if ($parameters)
{
// O erro acontece na linha abaixo se $article não tiver o método get()
$title_holder = $article->get($parameters->title_holder);
// ... restante do código
}
Como deve ficar (Corrigido):
if ($parameters)
{
// --- INÍCIO DA CORREÇÃO ---
// Verifica se o objeto tem o método get() ou usa acesso direto
if (method_exists($article, 'get')) {
// É um objeto Registry, usa get()
$title_holder = $article->get($parameters->title_holder);
} elseif (isset($article->{$parameters->title_holder})) {
// É um stdClass simples, acessa direto
$title_holder = $article->{$parameters->title_holder};
}
// --- FIM DA CORREÇÃO ---
$type_title = $parameters->type_title;
// ... o código original continua aqui
2. Método onContentAfterDelete
Faça a mesma alteração lógica na função onContentAfterDelete (aproximadamente na linha 309). Substitua o trecho original pelo código abaixo:
Código Corrigido:
if ($parameters)
{
// --- INÍCIO DA CORREÇÃO ---
// Verifica se o objeto tem o método get() ou usa acesso direto
if (method_exists($article, 'get')) {
$title_holder = $article->get($parameters->title_holder);
} elseif (isset($article->{$parameters->title_holder})) {
$title_holder = $article->{$parameters->title_holder};
}
// --- FIM DA CORREÇÃO ---
$type_title = $parameters->type_title;
$message = array(
'title' => $title_holder,
'event' => 'onContentAfterDelete',
'type' => $type_title,
);
$this->addLogsToDb($message, $strContext);
}
3. Método onExtensionAfterSave
Por fim, aplique a correção na função onExtensionAfterSave (aproximadamente na linha 514). Note que neste método a variável geralmente é chamada de $table em vez de $article.
Código Corrigido:
if ($parameters)
{
// --- INÍCIO DA CORREÇÃO ---
// Verifica se o objeto tem o método get() ou usa acesso direto
// Nota: Aqui usamos $table em vez de $article
if (method_exists($table, 'get')) {
$title_holder = $table->get($parameters->title_holder);
} elseif (isset($table->{$parameters->title_holder})) {
$title_holder = $table->{$parameters->title_holder};
}
// --- FIM DA CORREÇÃO ---
$type_title = $parameters->type_title;
// ... o código original continua aqui
Por que aplicar esta correção?
- Compatibilidade Universal: O plugin passa a aceitar tanto objetos complexos do Joomla (Registry) quanto objetos padrão do PHP (stdClass), evitando quebras em componentes de terceiros ou nativos como o Gerenciador de Mídia.
- Segurança e Estabilidade: Evita "Fatal Errors" do PHP que podem deixar uma tela branca da morte (WSOD) para o administrador do site durante tarefas rotineiras.
- Performance: A função utilizada (
method_exists) é nativa do PHP e extremamente rápida, não causando impacto perceptível no carregamento.
Esta solução foi testada e validada em ambientes rodando Joomla 5 e Joomla 6.0.1 Alpha, corrigindo falhas críticas no upload de arquivos.