Mensagens recentes

#1

Sim, o ficheiro que enviaste (Subs-Db-mysql.php) é exatamente o motor que processa todas as comunicações entre o SMF e a tua base de dados MySQL.

O erro "Wrong value type sent to the database. IPv4 or IPv6 expected.(ip)" que estás a receber é gerado especificamente dentro da função smf_db_replacement__callback, no bloco que lida com o tipo de dado inet.

Aqui está a análise técnica do porquê de o erro continuar no teu servidor:

A função isValidIP($replacement) está a falhar. Como usas Cloudflare, o IP pode estar a chegar vazio ou num formato que o PHP 8 não valida como um IP real (como uma string "unknown"). Quando isso acontece, o SMF interrompe a execução com o erro crítico em vez de tentar usar um valor padrão.

3. Como corrigir este ficheiro agora
Para resolver isso de forma definitiva e "forçar" o fórum a funcionar mesmo quando a detecção de IP falha, deves alterar o bloco case 'inet' e o case 'array_inet'.

Substitui as linhas 310 a 316 pelo seguinte código:

case 'inet':
if ($replacement == 'null' || $replacement == '')
return 'null';

// Se o IP não for válido, forçamos um IP padrão para não quebrar a query
if (!isValidIP($replacement))
$replacement = '127.0.0.1';

return sprintf('unhex(\'%1$s\')', bin2hex(inet_pton($replacement)));

case 'array_inet':
if (is_array($replacement))
{
if (empty($replacement))
smf_db_error_backtrace('Database error, given array of IPv4 or IPv6 values is empty. (' . $matches[2] . ')', '', E_USER_ERROR, __FILE__, __LINE__);

foreach ($replacement as $key => $value)
{
if ($value == 'null' || $value == '')
$replacement[$key] = 'null';
elseif (!isValidIP($value))
$replacement[$key] = sprintf('unhex(\'%1$s\')', bin2hex(inet_pton('127.0.0.1')));
else
$replacement[$key] = sprintf('unhex(\'%1$s\')', bin2hex(inet_pton($value)));
}

return implode(', ', $replacement);
}
else
smf_db_error_backtrace('Wrong value type sent to the database. Array of IPv4 or IPv6 expected. (' . $matches[2] . ')', '', E_USER_ERROR, __FILE__, __LINE__);
break;

Outro detalhe importante: SQL Mode
Reparei que na linha 95 do teu ficheiro, o SMF força o STRICT_TRANS_TABLES:

mysqli_query($connection, 'SET SESSION sql_mode = \'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT\'');
Sugestão: Se a alteração no case 'inet' não bastar, podes remover o ,STRICT_TRANS_TABLES dessa linha 95 para tornar a conexão mais tolerante a erros de dados.

Aplica a alteração no bloco case 'inet' primeiro. Isso vai impedir o smf_db_error_backtrace de ser disparado e o fórum voltará a abrir imediatamente.
#2
Perfil / Área de Perfil SMF 2.1.7
Última mensagem por candidosa2 - 22 de Abril de 2026, 20:20


Uma área de perfil totalmente nova, incluindo o modo humor. Aproveite!

ENCONTRE EM Display.template.php:

// Show information about the poster of this message.
 echo '
 <div class="poster">';

 // Are there any custom fields above the member name?
 if (!empty($message['custom_fields']['above_member']))
 {
 echo '
 <div class="custom_fields_above_member">
 <ul class="nolist">';

 foreach ($message['custom_fields']['above_member'] as $custom)
 echo '
 <li class="custom ', $custom['col_name'], '">', $custom['value'], '</li>';

 echo '
 </ul>
 </div>';
 }

 echo '
 <h4>';

 // Show online and offline buttons?
 if (!empty($modSettings['onlineEnable']) && !$message['member']['is_guest'])
 echo '
 ', $context['can_send_pm'] ? '<a href="' . $message['member']['online']['href'] . '" title="' . $message['member']['online']['label'] . '">' : '', '<span class="' . ($message['member']['online']['is_online'] == 1 ? 'on' : 'off') . '" title="' . $message['member']['online']['text'] . '"></span>', $context['can_send_pm'] ? '</a>' : '';

 // Custom fields BEFORE the username?
 if (!empty($message['custom_fields']['before_member']))
 foreach ($message['custom_fields']['before_member'] as $custom)
 echo '
 <span class="custom ', $custom['col_name'], '">', $custom['value'], '</span>';

 // Show a link to the member's profile.
 echo '
 ', $message['member']['link'];

 // Custom fields AFTER the username?
 if (!empty($message['custom_fields']['after_member']))
 foreach ($message['custom_fields']['after_member'] as $custom)
 echo '
 <span class="custom ', $custom['col_name'], '">', $custom['value'], '</span>';

 // Begin display of user info
 echo '
 </h4>
 <ul class="user_info">';

 // Show the user's avatar.
 if (!empty($modSettings['show_user_images']) && empty($options['show_no_avatars']) && !empty($message['member']['avatar']['image']))
 echo '
 <li class="avatar">
 <a href="', $message['member']['href'], '">', $message['member']['avatar']['image'], '</a>
 </li>';

 // Are there any custom fields below the avatar?
 if (!empty($message['custom_fields']['below_avatar']))
 foreach ($message['custom_fields']['below_avatar'] as $custom)
 echo '
 <li class="custom ', $custom['col_name'], '">', $custom['value'], '</li>';

 // Show the post group icons, but not for guests.
 if (!$message['member']['is_guest'])
 echo '
 <li class="icons">', $message['member']['group_icons'], '</li>';

 // Show the member's primary group (like 'Administrator') if they have one.
 if (!empty($message['member']['group']))
 echo '
 <li class="membergroup">', $message['member']['group'], '</li>';

 // Show the member's custom title, if they have one.
 if (!empty($message['member']['title']))
 echo '
 <li class="title">', $message['member']['title'], '</li>';

 // Don't show these things for guests.
 if (!$message['member']['is_guest'])
 {
 // Show the post group if and only if they have no other group or the option is on, and they are in a post group.
 if ((empty($modSettings['hide_post_group']) || empty($message['member']['group'])) && !empty($message['member']['post_group']))
 echo '
 <li class="postgroup">', $message['member']['post_group'], '</li>';

 // Show how many posts they have made.
 if (!isset($context['disabled_fields']['posts']))
 echo '
 <li class="postcount">', $txt['member_postcount'], ': ', $message['member']['posts'], '</li>';

 // Show their personal text?
 if (!empty($modSettings['show_blurb']) && !empty($message['member']['blurb']))
 echo '
 <li class="blurb">', $message['member']['blurb'], '</li>';

 // Any custom fields to show as icons?
 if (!empty($message['custom_fields']['icons']))
 {
 echo '
 <li class="im_icons">
 <ol>';

 foreach ($message['custom_fields']['icons'] as $custom)
 echo '
 <li class="custom ', $custom['col_name'], '">', $custom['value'], '</li>';

 echo '
 </ol>
 </li>';
 }

 // Show the website and email address buttons.
 if ($message['member']['show_profile_buttons'])
 {
 echo '
 <li class="profile">
 <ol class="profile_icons">';

 // Don't show an icon if they haven't specified a website.
 if (!empty($message['member']['website']['url']) && !isset($context['disabled_fields']['website']))
 echo '
 <li><a href="', $message['member']['website']['url'], '" title="' . $message['member']['website']['title'] . '" target="_blank" rel="noopener">', ($settings['use_image_buttons'] ? '<span class="main_icons www centericon" title="' . $message['member']['website']['title'] . '"></span>' : $txt['www']), '</a></li>';

 // Since we know this person isn't a guest, you *can* message them.
 if ($context['can_send_pm'])
 echo '
 <li><a href="', $scripturl, '?action=pm;sa=send;u=', $message['member']['id'], '" title="', $message['member']['online']['is_online'] ? $txt['pm_online'] : $txt['pm_offline'], '">', $settings['use_image_buttons'] ? '<span class="main_icons im_' . ($message['member']['online']['is_online'] ? 'on' : 'off') . ' centericon" title="' . ($message['member']['online']['is_online'] ? $txt['pm_online'] : $txt['pm_offline']) . '"></span> ' : ($message['member']['online']['is_online'] ? $txt['pm_online'] : $txt['pm_offline']), '</a></li>';

 // Show the email if necessary
 if (!empty($message['member']['email']) && $message['member']['show_email'])
 echo '
 <li class="email"><a href="mailto:' . $message['member']['email'] . '" rel="nofollow">', ($settings['use_image_buttons'] ? '<span class="main_icons mail centericon" title="' . $txt['email'] . '"></span>' : $txt['email']), '</a></li>';

 echo '
 </ol>
 </li><!-- .profile -->';
 }

 // Any custom fields for standard placement?
 if (!empty($message['custom_fields']['standard']))
 foreach ($message['custom_fields']['standard'] as $custom)
 echo '
 <li class="custom ', $custom['col_name'], '">', $custom['title'], ': ', $custom['value'], '</li>';
 }
 // Otherwise, show the guest's email.
 elseif (!empty($message['member']['email']) && $message['member']['show_email'])
 echo '
 <li class="email">
 <a href="mailto:' . $message['member']['email'] . '" rel="nofollow">', ($settings['use_image_buttons'] ? '<span class="main_icons mail centericon" title="' . $txt['email'] . '"></span>' : $txt['email']), '</a>
 </li>';

 // Show the IP to this user for this post - because you can moderate?
 if (!empty($context['can_moderate_forum']) && !empty($message['member']['ip']))
 echo '
 <li class="poster_ip">
 <a href="', $scripturl, '?action=', !empty($message['member']['is_guest']) ? 'trackip' : 'profile;area=tracking;sa=ip;u=' . $message['member']['id'], ';searchip=', $message['member']['ip'], '">', $message['member']['ip'], '</a> <a href="', $scripturl, '?action=helpadmin;help=see_admin_ip" onclick="return reqOverlayDiv(this.href);" class="help">(?)</a>
 </li>';

 // Or, should we show it because this is you?
 elseif ($message['can_see_ip'])
 echo '
 <li class="poster_ip">
 <a href="', $scripturl, '?action=helpadmin;help=see_member_ip" onclick="return reqOverlayDiv(this.href);" class="help">', $message['member']['ip'], '</a>
 </li>';

 // Okay, are you at least logged in? Then we can show something about why IPs are logged...
 elseif (!$context['user']['is_guest'])
 echo '
 <li class="poster_ip">
 <a href="', $scripturl, '?action=helpadmin;help=see_member_ip" onclick="return reqOverlayDiv(this.href);" class="help">', $txt['logged'], '</a>
 </li>';

 // Otherwise, you see NOTHING!
 else
 echo '
 <li class="poster_ip">', $txt['logged'], '</li>';

 // Are we showing the warning status?
 // Don't show these things for guests.
 if (!$message['member']['is_guest'] && $message['member']['can_see_warning'])
 echo '
 <li class="warning">
 ', $context['can_issue_warning'] ? '<a href="' . $scripturl . '?action=profile;area=issuewarning;u=' . $message['member']['id'] . '">' : '', '<span class="main_icons warning_', $message['member']['warning_status'], '"></span> ', $context['can_issue_warning'] ? '</a>' : '', '<span class="warn_', $message['member']['warning_status'], '">', $txt['warn_' . $message['member']['warning_status']], '</span>
 </li>';

 // Are there any custom fields to show at the bottom of the poster info?
 if (!empty($message['custom_fields']['bottom_poster']))
 foreach ($message['custom_fields']['bottom_poster'] as $custom)
 echo '
 <li class="custom ', $custom['col_name'], '">', $custom['value'], '</li>';

 // Poster info ends.
 echo '
 </ul>
 </div><!-- .poster -->
 <div class="postarea">
 <div class="keyinfo">';


ALTERE

// Show information about the poster of this message.
echo '
<div class="poster">
<ul class="user_info nolist">';

// 1. AVATAR (Topo, design redondo com fallback mais inteligente)
echo '
<li class="avatar" style="margin-bottom: 5px;">';
// Verificação para forçar a exibição do avatar se ele existir
if (!empty($message['member']['avatar']['href']))
echo '
<a href="', $message['member']['href'], '"><img src="', $message['member']['avatar']['href'], '" alt="Avatar" style="max-width: 100px; border-radius: 50%;" /></a>';
elseif (!empty($message['member']['avatar']['image']))
echo '
<a href="', $message['member']['href'], '">', $message['member']['avatar']['image'], '</a>';
else
echo '
<a href="', $message['member']['href'], '"><img src="', $settings['default_images_url'], '/default_avatar_webmastersmz.png" alt="Avatar Padrão" style="max-width: 100px; border-radius: 50%;" onerror="this.style.display=\'none\';" /></a>';
echo '
</li>';

// 2. NOME E STATUS ONLINE
echo '
<li class="name" style="font-size: 1.2em; font-weight: bold;">
', $message['member']['link'];
if (!empty($modSettings['onlineEnable']) && !$message['member']['is_guest'])
echo '
', $context['can_send_pm'] ? '<a href="' . $message['member']['online']['href'] . '" title="' . $message['member']['online']['label'] . '">' : '', '<span class="' . ($message['member']['online']['is_online'] == 1 ? 'on' : 'off') . '" title="' . $message['member']['online']['text'] . '" style="display:inline-block; margin-left: 5px;"></span>', $context['can_send_pm'] ? '</a>' : '';
echo '
</li>';

// 3. ESTADO DE ESPÍRITO (Sem Loop, sempre visível)
$mood_val = 'Timido';
if (!empty($message['member']['options']['perfil_smfpt']) && trim($message['member']['options']['perfil_smfpt']) !== '')
$mood_val = trim($message['member']['options']['perfil_smfpt']);
elseif (!empty($message['member']['options']['teknoromi']) && trim($message['member']['options']['teknoromi']) !== '')
$mood_val = trim($message['member']['options']['teknoromi']);

$traducoes = array(
'Agressivo' => 'Agressivo', 'Tranquilo' => 'Tranquilo', 'Atrevido' => 'Atrevido',
'Exausto' => 'Exausto', 'Ranzinza' => 'Ranzinza', 'Trabalhador' => 'Trabalhador',
'Excentrico' => 'Excêntrico', 'Entusiasta' => 'Entusiasta', 'Louco' => 'Louco',
'Genio' => 'Génio', 'Distraido' => 'Distraído', 'Equilibrado' => 'Equilibrado',
'Preocupado' => 'Preocupado', 'Ansioso' => 'Ansioso', 'Tagarela' => 'Tagarela',
'Doente' => 'Doente', 'Radiante' => 'Radiante', 'Animado' => 'Animado',
'Emocionado' => 'Emocionado', 'Malhumorado' => 'Mal-humorado', 'Maluco' => 'Maluco',
'Indeciso' => 'Indeciso', 'Desanimado' => 'Desanimado', 'Desconectado' => 'Desconectado',
'Pirata' => 'Pirata', 'Inocente' => 'Inocente', 'Divertido' => 'Divertido',
'Anjo' => 'Anjo', 'Curioso' => 'Curioso', 'Ocupado' => 'Ocupado',
'Feliz' => 'Feliz', 'Alegre' => 'Alegre', 'Maduro' => 'Maduro',
'Relaxado' => 'Relaxado', 'Falecido' => 'Falecido', 'Brincalhao' => 'Brincalhão',
'Artista' => 'Artista', 'Sofrido' => 'Sofrido', 'Confuso' => 'Confuso',
'Diabolico' => 'Diabólico', 'Mimado' => 'Mimado', 'Frio' => 'Frio',
'Palhaco' => 'Palhaço', 'Atleta' => 'Atleta', 'Desconfiado' => 'Desconfiado',
'Estranho' => 'Estranho', 'Esquisito' => 'Esquisito', 'Timido' => 'Tímido',
'Sonolento' => 'Sonolento', 'Semsono' => 'Sem sono', 'Irritante' => 'Irritante',
'Sozinho' => 'Sozinho', 'Banido' => 'Banido', 'Cansado' => 'Cansado',
'Desportista' => 'Desportista', 'Rabugento' => 'Rabugento'
);
$mood_pt = isset($traducoes[$mood_val]) ? $traducoes[$mood_val] : $mood_val;

echo '
<li class="mood" style="padding: 10px 0; text-align:center;">
<b style="font-size:11px;">Estado de espírito:</b><br />
<img src="', $settings['default_images_url'], '/perfil_smfpt/', $mood_val, '.png" alt="', $mood_pt, '" title="', $mood_pt, '" onerror="this.onerror=null; this.src=\'', $settings['default_images_url'], '/perfil_smfpt/Timido.png\';" />
</li>';

// 4. AGRADECIMENTOS (Thank-O-Matic)
if (!empty($modSettings['thankYouPostDisplayPage']) && (empty($modSettings['thankYouPostDisplayDisableBecame']) || empty($modSettings['thankYouPostDisplayDisableMade'])))
{
echo '
<li class="thank_o_matic" style="padding-bottom: 5px;">
<b>Agradecimentos</b><br/>';
if(empty($modSettings['thankYouPostDisplayDisableMade']))
echo '
<span style="font-size: 11px;">- Dados: <b>', $message['member']['thank_you_post']['made'], '</b></span><br/>';

if(empty($modSettings['thankYouPostDisplayDisableBecame']))
echo '
<span style="font-size: 11px;">- Recebidos: <b>', $message['member']['thank_you_post']['became'], '</b></span>';
echo '
</li>';
}

// 5. TÍTULO E GRUPO
if (!empty($message['member']['title']))
echo '
<li class="title">', $message['member']['title'], '</li>';
if (!empty($message['member']['group']))
echo '
<li class="membergroup">', $message['member']['group'], '</li>';
if (!$message['member']['is_guest'] && !empty($message['member']['group_icons']))
echo '
<li class="icons">', $message['member']['group_icons'], '</li>';

// 6. ESTATÍSTICAS E REGISTO
if (!$message['member']['is_guest'])
{
if (!isset($context['disabled_fields']['posts']))
echo '
<li class="postcount"><b>Mensagens:</b> ', $message['member']['posts'], '</li>';

echo '
<li class="kayit">
<b>Membro desde:</b><br/>
<span style="font-size: 10px;">', $message['member']['registered'], '</span>
</li>';

// 7. BARRAS MODERNAS (Atividade e Experiência)
$post = (int) $message['member']['posts'];
$postWidth = ($post > 100) ? 100 : ($post > 0 ? $post : 3);
$deneyimi = ($post / 10);
if ($deneyimi > 100) $deneyimi = 100;

if ($context['user']['is_logged'])
{
echo '
<li class="stats_bars">
<div class="aktif_bar_container">
<div class="aktif_bar atividade" style="width: ', $postWidth, '%;"></div>
<span class="aktif_text">Atividade</span>
</div>
<div class="aktif_bar_container">
<div class="aktif_bar experiencia" style="width: ', $deneyimi, '%;"></div>
<span class="aktif_text">Experiência</span>
</div>
</li>';
}

// 8. BOTÕES DE PERFIL (Web / PM / Email)
if ($message['member']['show_profile_buttons'])
{
echo '
<li class="profile">
<ol class="profile_icons nolist" style="padding: 0; margin: 0;">';
if (!empty($message['member']['website']['url']) && !isset($context['disabled_fields']['website']))
echo '
<li style="display:inline;"><a href="', $message['member']['website']['url'], '" target="_blank" rel="noopener">', ($settings['use_image_buttons'] ? '<span class="main_icons www centericon" title="' . $message['member']['website']['title'] . '"></span>' : $txt['www']), '</a></li>';
if ($context['can_send_pm'])
echo '
<li style="display:inline;"><a href="', $scripturl, '?action=pm;sa=send;u=', $message['member']['id'], '">', $settings['use_image_buttons'] ? '<span class="main_icons im_on centericon" title="' . $txt['pm_online'] . '"></span>' : 'PM', '</a></li>';
echo '
</ol>
</li>';
}
}

// 9. IP E MODERAÇÃO
if (!empty($context['can_moderate_forum']) && !empty($message['member']['ip']))
echo '
<li class="poster_ip">
<a href="', $scripturl, '?action=', !empty($message['member']['is_guest']) ? 'trackip' : 'profile;area=tracking;sa=ip;u=' . $message['member']['id'], ';searchip=', $message['member']['ip'], '" class="show_on_hover"><span>', $txt['show_ip'], '</span></a>
</li>';

Profile.template.php

// Are there any custom profile fields - if so print them!
// Início do bloco de Estado de Espírito
echo '
<dl>
<dt><b>Estado de espírito: </b></dt>
<dd>
<select name="default_options[perfil_smfpt]">';

// Lista de humores (Valor no Banco => Texto no ecrã)
$humores_list = array(
'Agressivo' => 'Agressivo', 'Tranquilo' => 'Tranquilo', 'Atrevido' => 'Atrevido',
'Exausto' => 'Exausto', 'Ranzinza' => 'Ranzinza', 'Trabalhador' => 'Trabalhador',
'Excentrico' => 'Excêntrico', 'Entusiasta' => 'Entusiasta', 'Louco' => 'Louco',
'Genio' => 'Génio', 'Distraido' => 'Distraído', 'Equilibrado' => 'Equilibrado',
'Preocupado' => 'Preocupado', 'Ansioso' => 'Ansioso', 'Tagarela' => 'Tagarela',
'Doente' => 'Doente', 'Radiante' => 'Radiante', 'Animado' => 'Animado',
'Emocionado' => 'Emocionado', 'Malhumorado' => 'Mal-humorado', 'Maluco' => 'Maluco',
'Indeciso' => 'Indeciso', 'Desanimado' => 'Desanimado', 'Desconectado' => 'Desconectado',
'Pirata' => 'Pirata', 'Inocente' => 'Inocente', 'Divertido' => 'Divertido',
'Anjo' => 'Anjo', 'Curioso' => 'Curioso', 'Ocupado' => 'Ocupado',
'Feliz' => 'Feliz', 'Alegre' => 'Alegre', 'Maduro' => 'Maduro',
'Relaxado' => 'Relaxado', 'Falecido' => 'Falecido', 'Brincalhao' => 'Brincalhão',
'Artista' => 'Artista', 'Sofrido' => 'Sofrido', 'Confuso' => 'Confuso',
'Diabolico' => 'Diabólico', 'Mimado' => 'Mimado', 'Frio' => 'Frio',
'Palhaco' => 'Palhaço', 'Atleta' => 'Atleta', 'Desconfiado' => 'Desconfiado',
'Estranho' => 'Estranho', 'Esquisito' => 'Esquisito', 'Timido' => 'Tímido',
'Sonolento' => 'Sonolento', 'Semsono' => 'Sem sono', 'Irritante' => 'Irritante',
'Sozinho' => 'Sozinho', 'Banido' => 'Banido', 'Cansado' => 'Cansado',
'Desportista' => 'Desportista', 'Rabugento' => 'Rabugento'
);

foreach ($humores_list as $val => $label)
{
$is_selected = (!empty($context['member']['options']['perfil_smfpt']) && $context['member']['options']['perfil_smfpt'] == $val) ? ' selected="selected"' : '';
echo '
<option value="', $val, '"', $is_selected, '>', $label, '</option>';
}

echo '
</select>
</dd>
</dl>';


index.css

/* Profil WebmastersMZ - Design Moderno */
.poster {
    border: 1px solid #e0e0e0;
    background: linear-gradient(to bottom, #ffffff 0%, #f8f9fa 100%);
    border-top: 3px solid #0d6efd; /* Linha de destaque em azul tecnológico */
    border-radius: 8px;
    overflow: hidden;
    text-align: center;
    color: #333;
    box-shadow: 0 4px 6px rgba(0,0,0,0.05);
    padding-bottom: 10px;
    font-family: 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
}
.poster ul.user_info {
    padding: 0;
    margin: 0;
    list-style: none;
}
.poster ul.user_info > li {
    border-bottom: 1px solid #f0f0f0;
    padding: 8px 10px;
    font-size: 12px;
}
.poster ul.user_info > li:last-child {
    border-bottom: none;
}
.poster .avatar img {
    max-width: 100px;
    border-radius: 50%;
    border: 2px solid #fd7e14; /* Borda do avatar em laranja vibrante */
    padding: 2px;
    background: #fff;
    box-shadow: 0 2px 4px rgba(0,0,0,0.1);
    margin-top: 10px;
    object-fit: cover;
}
.poster .name {
    font-size: 15px;
    font-weight: 600;
}
.poster .name a {
    color: #0d6efd;
}
/* Barras de Estatísticas Modernas */
.stats_bars {
    padding: 10px !important;
}
.aktif_bar_container {
    background: #e9ecef;
    border-radius: 10px;
    height: 16px;
    margin-bottom: 6px;
    position: relative;
    overflow: hidden;
    box-shadow: inset 0 1px 2px rgba(0,0,0,0.1);
    width: 100%;
}
.aktif_bar {
    height: 100%;
    border-radius: 10px;
}
.aktif_bar.atividade { background: linear-gradient(90deg, #fd7e14, #ffb347); } /* Gradiente Laranja */
.aktif_bar.experiencia { background: linear-gradient(90deg, #0d6efd, #66b2ff); } /* Gradiente Azul */
.aktif_text {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    text-align: center;
    font-size: 10px;
    line-height: 16px;
    color: #fff;
    font-weight: bold;
    text-shadow: 0px 0px 2px rgba(0,0,0,0.5);
}

Coloque a pasta perfil_smfpt anexada na pasta images do seu tema padrão.
#3
Buttons / Adicionar um botão HTML BBC no...
Última mensagem por candidosa2 - 22 de Abril de 2026, 03:55
O SMF 2.1 permite adicionar um botão HTML ao editor. Este botão possibilita a execução de código HTML através da inserção de determinados códigos HTML dentro da tag HTML.

Abra o ficheiro "subs.editor.php" localizado na pasta Source e encontre o seguinte código.

array(
'code' => 'flash',
'description' => $editortxt['flash']
),

Adicione abaixo

array(
                'image' => 'html',
                'code' => 'html',
                'before' => '[html]',
                'after' => '[/html]',
                'description' => $txt['html']
            ),



Para o botão da BBC, coloque a imagem apresentada no anexo na pasta `images/bbc` do seu tema.
#4
Modificações / Este mod permite exibir um avi...
Última mensagem por candidosa2 - 22 de Abril de 2026, 03:48
Abra o ficheiro Source/Subs.php;

Encontre o seguinte:

array(
'tag' => 'url',
'type' => 'unparsed_equals',
'quoted' => 'optional',
'before' => '<a href="$1" class="bbc_link" target="_blank">',
'after' => '</a>',
'validate' => function (&$tag, &$data, $disabled)
{
$scheme = parse_url($data, PHP_URL_SCHEME);
if (empty($scheme))
$data = '//' . ltrim($data, ':/');
},
'disallow_children' => array('email', 'ftp', 'url', 'iurl'),
'disabled_after' => ' ($1)',
),
);

Substitua:

array(
'tag' => 'url',
'type' => 'unparsed_equals',
'quoted' => 'optional',
'before' => '<a href="https://portal2.smfpt.net/out.php?url=$1" class="bbc_link" target="_blank">',
'after' => '</a>',
'validate' => function (&$tag, &$data, $disabled)
{
$scheme = parse_url($data, PHP_URL_SCHEME);
if (empty($scheme))
$data = '//' . ltrim($data, ':/');
},
'disallow_children' => array('email', 'ftp', 'url', 'iurl'),
'disabled_after' => ' ($1)',
),
);

Link demo https://portal2.smfpt.net/
#5
Modificações e Pacotes / Adicionar NoFollow aos Links (...
Última mensagem por candidosa2 - 22 de Abril de 2026, 03:13
06 Dez 2017, 22:07
Nome da Modificação: NoFollow em Todos os Links
Autor: Nibogo
Tipo: Otimização para Motores de Busca
Compatibilidade: 2.1

Descrição: Adiciona o atributo nofollow aos links adicionados ao tópico. Isto impede que crie links externos, aos olhos dos motores de busca.

Link Original: http://custom.simplemachines.org/mods/index.php?mod=1236

O mod compatível com as versões Beta 2.1 está em anexo; pode descarregá-lo de lá.
#6
Modificações e Pacotes / Re: Ocultação de links e image...
Última mensagem por candidosa2 - 21 de Abril de 2026, 17:51
Utilizado para ocultar links dos visitantes. Configure as opções no painel de administração após a instalação.
Este é um mod personalizado, melhorado e visualmente melhorado.
Oculta os links dos visitantes e obriga-os a registarem-se.
Pode descarregar o ficheiro em anexo, se desejar.


Como corrigir agora no seu Subs.php (Manual)
Se quiseres resolver já sem reinstalar o mod, abre o teu ficheiro Subs.php e vai até à linha 1582. Verás isto:

// Cache the output if it took some time...
if (isset($cache_key, $cache_t) && microtime(true) - $cache_t > 0.05)
cache_put_data($cache_key, $message, 240);

Adiciona logo a seguir (depois do ; da última linha):

// Registered Links
if (($user_info['is_guest']) && (!empty($modSettings['hhyreglinks']) && $modSettings['hhyreglinks'] == 1))
{
$message = preg_replace('#<a href="(.*?)</a>#i', $txt['no_view_links'] . "\n" . '<a class="linkgizle_rep" href="' . $scripturl . '?action=signup">' . $txt['txt_reg_signup'] . '</a>&nbsp;' . $txt['txt_reg_or'] . '&nbsp;<a class="linkgizle_replikacep" href="' . $scripturl . '?action=login">' . $txt['txt_reg_login'] . '</a></span>', $message);
}
// End Registered Links
// Registered Images
if (($user_info['is_guest']) && (!empty($modSettings['hhyregimages']) && $modSettings['hhyregimages'] == 1))
{
$message = preg_replace('#<img src="(.*?)>#i', $txt['no_view_images'] . "\n" . ' <a href="' . $scripturl . '?action=signup">' . $txt['txt_reg_signup'] . '</a>&nbsp;' . $txt['txt_reg_or'] . '&nbsp;<a href="' . $scripturl . '?action=login">' . $txt['txt_reg_login'] . '</a>', $message);
}
// End Registered Images


Nota: Adicionei !empty(...) ao código manual para evitar erros de PHP "Undefined index" caso as definições ainda não tenham sido guardadas na base de dados.

Resumo do que aconteceu:
O mod Auto Embed Media Pro inseriu-se exatamente na linha que o Registered Links usava como referência. Ao mudar o xml para procurar apenas o fim da função de cache, ele voltará a funcionar independentemente de outros mods estarem lá.
#7
Modificações e Pacotes / Ocultação de links e imagens d...
Última mensagem por candidosa2 - 21 de Abril de 2026, 17:42
#8
SMF 2.1 / Bloquear Alteração de Nome no ...
Última mensagem por candidosa2 - 20 de Abril de 2026, 21:42
Se a interface não está colaborando (o que acontece às vezes no SMF 2.1 dependendo do pacote de tradução ou de modificações instaladas), a via SQL é a mais limpa e direta para um administrador com o seu perfil técnico.

No SMF, a permissão que controla a alteração do nome de exibição e outros detalhes da conta é a profile_identity_own.

Solução via Banco de Dados (SQL)
Para remover o direito dos membros comuns (e de outros grupos que não sejam moderadores) de alterarem o próprio nome, execute os seguintes comandos no seu PHPMyAdmin ou terminal MySQL:

Identificar o ID do grupo: Geralmente, membros comuns têm o id_group = 0.

Remover a permissão:

-- Remove a permissão de editar detalhes da conta (incluindo nome) para membros comuns
DELETE FROM smf_permissions
WHERE id_group = 0
AND permission = 'profile_identity_own';

Atenção: Se você tiver outros grupos de membros (como "Membros VIP" ou "Membros Antigos"), precisará repetir o comando alterando o id_group para o ID correspondente a esses grupos.
#9
Tutorial SMFPT / BoardNews Ehportal remover Pag...
Última mensagem por candidosa2 - 17 de Abril de 2026, 16:54
Bem tenho 2 boardnews mais quero que uma delas nao tenha a paginacao



1. Localize o ponto de edição
No arquivo PortalBlocks.php, vá até o final da função sp_boardNews. Você encontrará o código da paginação entre as linhas 723 e 725:

if (!empty($per_page))
echo '
<div class="sp_page_index">', $page_index, '</div>';

2. Aplique a correção por ID
Substitua essas linhas pelo código abaixo. Ele verifica se o bloco atual é o seu bloco VIP (ID 191) e, caso seja, impede a exibição das páginas:

// Ajuste Profissional: Esconde a paginação apenas para o bloco VIP ID 191
if (!empty($per_page) && $id != NUMEROIDDOBOARDNEWS)
echo '
<div class="sp_page_index">', $page_index, '</div>';

3. Por que esta solução resolve o seu problema:
Segmentação por ID: O código utiliza a variável $id (passada na linha 589 da função) para identificar especificamente o bloco que você está a configurar.

Preservação do Bloco Geral: Como o seu bloco de notícias geral possui um ID diferente de 191, ele continuará a mostrar a paginação normalmente.

Fim dos problemas de Cache/CSS: Ao remover o código diretamente no PHP, o "Páginas: [1]" deixa de existir no HTML gerado para o VIP, tornando desnecessária qualquer briga com arquivos CSS minificados ou caches de tema.

4. Procedimento pós-edição
Guarde o arquivo e envie-o para a pasta Sources/ no seu servidor.

Vá à Administração > Manutenção do Fórum > Rotina > Limpar o cache.

Agora você pode configurar o Maximum Characters do bloco VIP para 0 ou um valor alto, pois o layout não quebrará mais e a paginação terá sumido apenas deste quadro.


#10
Simpleportal / Re: Relato de bug – Problema c...
Última mensagem por candidosa2 - 12 de Abril de 2026, 23:18
Ao analisar o seu ficheiro PortalBlocks.php, vi que o seu sistema usa uma função própria chamada EhPortal_parsebbc. É logo a seguir a essa função que vamos dar o nosso "golpe de mestre".

Aqui estão os passos exatos para aplicar no ficheiro que acabou de enviar:

O Passo a Passo no PortalBlocks.php
1. Abra o seu PortalBlocks.php no editor.

2. Procure por esta linha exata (deve estar por volta da linha 527):

$row['body'] = EhPortal_parsebbc($row['body'], $row['smileys_enabled'], $row['id_msg']);
3. Pressione a tecla Enter no final dessa linha e cole este código exatamente por baixo dela:

// FIX ADELINO: Forçar resize de imagens geradas (Capas), ignorando smilies
$row['body'] = preg_replace(
'~<img(?![^>]*class="[^"]*smiley[^"]*")([^>]*)>~i',
'<img$1 style="max-height: 350px !important; max-width: 100% !important; width: auto !important; height: auto !important;">',
$row['body']
);

Como vai ficar o seu código (para ter a certeza):

$row['body'] = EhPortal_parsebbc($row['body'], $row['smileys_enabled'], $row['id_msg']);

// FIX ADELINO: Forçar resize de imagens geradas (Capas), ignorando smilies
$row['body'] = preg_replace(
'~<img(?![^>]*class="[^"]*smiley[^"]*")([^>]*)>~i',
'<img$1 style="max-height: 350px !important; max-width: 100% !important; width: auto !important; height: auto !important;">',
$row['body']
);

if (!empty($length) && $smcFunc['strlen']($row['body']) > $length && !$limited)
{


Como aumentar a imagem:
Abra novamente o PortalBlocks.php e vá ao código que acabámos de colar. Basta alterar o valor de max-height: 350px para 450px (ou 500px, dependendo do seu gosto).

Ficará exatamente assim:

// FIX ADELINO: Forçar resize de imagens geradas (Capas), ignorando smilies
$row['body'] = preg_replace(
'~<img(?![^>]*class="[^"]*smiley[^"]*")([^>]*)>~i',
'<img$1 style="max-height: 450px !important; max-width: 100% !important; width: auto !important; height: auto !important;">',
$row['body']
);