Área de Perfil SMF 2.1.7

Iniciado por candidosa2, 22 de Abril de 2026, 20:20

Tópico anterior - Tópico seguinte

candidosa2 e 4 Visitantes estão a ver este tópico.

candidosa2



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.