← Tutoriais

[GERAL & PHPBB] Sites Dinamicos com phpbb

Lida 6796 vezes

Offline

cenourinha 
Elite
Mensagens 4094 Gostos 21
Troféus totais: 34
Trófeus: (Ver todos)
Mobile User Apple User Level 6 Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4

Sites Dinamicos com phpbb

Neste tutorial, eu irei monstrar como fazer o seu proprio site, mas mais dinamico, incluindo login em phpbb a trabalhar em todas as paginas do seu site! Este tutorial vai aumentar e ajudar-te a entender o quanto o php e o mysql são poderosos. Com algumas modificações simples e faceis, que eu vou encluir aqui, vais poder adicionar facilmente, anuncios de data de aniversario, utilizadores online, mensagens privadas e topicos recentes a qualquer pagina do seu site. Podes tambem usar o login do phpbb com formularios de outra base de dados no teu site. Expandindo o teu site numa comunidade dinamica!

Este tutorial usa muitas modificações tiradas do http://www.phpbbhacks.com/, alguma modificadas por mim, e outros. Vou dar o meu melhor para dar a ideia do que quero fazer!


1. Acesso aos dados do utilizador

Para usar o login do PHPbb em todas as paginas do seu site, vai ser preciso adicionar o codigo correcto na <header> de todas as paginas não-phpbb. Espero que utilizes algo como um topo.php, incluido em todas as paginas, ou então vais ter muito codigo para inserir em casa pagina. Eu vou explicar todos os codigos, não te preocupes em copiar.

Promeiro, temos de definir o phpbb. É uma pequena segurança que foi adicionada na versão 2.0.0. Adicionado para previnir defaces ao teu forum

define('IN_PHPBB', true);

Agora precisamos de incluir os ficheiros do phpbb. Isto é muito simples e facil de fazer, apenas tens de mudar as pastas do teus ficheirosall you need to change are the absolute paths to your files.

$site_root_path = './'; //<-- Modifica | se for na root do site deixa como esta
$phpbb_root_path2 = '/phpbb2/'; //<-- Modifica | insere a pasta do forum
$phpbb_root_path = $site_root_path . $phpbb_root_path2;
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.php');
include($phpbb_root_path . 'config.php');

Agora, tens de adicionar o codigo de  gerenciamento de utilizador, isto faz todo o trabalho importante. Isto vai buscar a informação do utilizador logado. Tambem vai defenir todas as variaveis phpbb que vão ser usadas no teu site.

$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);

Bem, isto é tudo o que precisas para fazer com que os utilizadores possam aceder ao teu site. Este simples codigo, pode fazer muitas coisas que tu queiras, mas nos proximos passos, vou-te ensinar a levar isto um pouco mais a frente, aqui esta o codigo completo para esta secção:

define('IN_PHPBB', true);

$site_root_path = './'; //<-- Modifica | se for na root do site deixa como esta
$phpbb_root_path2 = '/phpbb2/'; //<-- Modifica | insere a pasta do forum
$phpbb_root_path = $site_root_path . $phpbb_root_path2;
include($phpbb_root_path . 'extension.inc');
include($phpbb_root_path . 'common.php');
include($phpbb_root_path . 'config.php');

$userdata = session_pagestart($user_ip, PAGE_INDEX);
init_userprefs($userdata);


2. Utilizadores online!

Uma das funções que a maior parte das pessoas vai querer adicionar ao seu site, é mostrar quem esta online. Esta hack pode ser visto em  http://www.phpbbhacks.com/viewhack.php?id=201 , se quiseres alterar isto, vais ter que ser muito bom em php, pois é muito dificil. Como o codigo é tão longo, eu não vou explicar o que cada passo faz.

$user_forum_sql = ( !empty($forum_id) ) ? "AND ( u.user_session_page = $forum_id
OR s.session_page = $forum_id)" : "";

$sql = "SELECT u.username, u.user_id, u.user_allow_viewonline, u.user_level, s.session_logged_in, s.session_ip
FROM ".USERS_TABLE." u, ".SESSIONS_TABLE." s
WHERE u.user_id = s.session_user_id
AND ( s.session_time >= ".( time() - 300 ) . "
OR u.user_session_time >= " . ( time() - 300 ) . " )
$user_forum_sql
ORDER BY u.username ASC";
$result = $db->sql_query($sql);
if(!$result)
{
message_die(GENERAL_ERROR, "Impossivel Obter informação", "", __LINE__, __FILE__, $sql);
}

$userlist_ary = array();
$userlist_visible = array();

$logged_visible_online = 0;
$logged_hidden_online = 0;
$guests_online = 0;
$online_userlist = "";

$prev_user_id = 0;
$prev_session_ip = 0;

while( $row = $db->sql_fetchrow($result) )
{
// User is logged in and therefor not a guest
if( $row['session_logged_in'] )
{
// Skip multiple sessions for one user
if( $row['user_id'] != $prev_user_id )
{
$style_color = "";
if( $row['user_level'] == ADMIN )
{
$row['username'] = '<b>' . $row['username'] . '</b>';
$style_color = 'style="color:#' . $theme['fontcolor3'] . '"';
}
else if( $row['user_level'] == MOD )
{
$row['username'] = '<b>' . $row['username'] . '</b>';
$style_color = 'style="color:#' . $theme['fontcolor2'] . '"';
}

if( $row['user_allow_viewonline'] )
{
$user_online_link = '<a href="' . append_sid($phpbb_root_path2."profile.$phpEx?mode=viewprofile&amp;" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color .'>' . $row['username'] . '</a>';
$logged_visible_online++;
}
else
{
$user_online_link = '<a href="' . append_sid($phpbb_root_path."profile.$phpEx?mode=viewprofile&amp;" . POST_USERS_URL . "=" . $row['user_id']) . '"' . $style_color .'><i>' . $row['username'] . '</i></a>';
$logged_hidden_online++;
}

if( $row['user_allow_viewonline'] || $userdata['user_level'] == ADMIN )
{
$online_userlist .= ( $online_userlist != "" ) ? ", " . $user_online_link : $user_online_link;
}
}
}
else
{
if( $row['session_ip'] != $prev_session_ip ){
$guests_online++;
}
}

$prev_user_id = $row['user_id'];
$prev_session_ip = $row['session_ip'];
}

if( empty($online_userlist) )
{
$online_userlist = $lang['None'];
}
$online_userlist = ( ( isset($forum_id) ) ? $lang['Browsing_forum'] : $lang['Registered_users'] ) . " " . $online_userlist;

$total_online_users = $logged_visible_online + $logged_hidden_online + $guests_online;

if($total_online_users > $board_config['record_online_users'])
{
$sql = "UPDATE " . CONFIG_TABLE . "
SET config_value = '$total_online_users'
WHERE config_name = 'record_online_users'";
if( !$result = $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, "Não pode actualizar o recorde de utilizadores (numero de utilizadores)", "", __LINE__, __FILE__, $sql);
}

$sql = "UPDATE " . CONFIG_TABLE . "
SET config_value = '" . time() . "'
WHERE config_name = 'record_online_date'";
if( !$result = $db->sql_query($sql) )
{
message_die(GENERAL_ERROR, "Não pode actualizar o recorde de utilizadores (data)", "", __LINE__, __FILE__, $sql);
}

$board_config['record_online_users'] = $total_online_users;
$board_config['record_online_date'] = time();
}

if( $total_online_users == 0 )
{
$l_t_user_s = $lang['Online_users_zero_total'];
}
else if( $total_online_users == 1 )
{
$l_t_user_s = $lang['Online_user_total'];
}
else
{
$l_t_user_s = $lang['Online_users_total'];
}

if( $logged_visible_online == 0 )
{
$l_r_user_s = $lang['Reg_users_zero_total'];
}
else if( $logged_visible_online == 1 )
{
$l_r_user_s = $lang['Reg_user_total'];
}
else
{
$l_r_user_s = $lang['Reg_users_total'];
}

if( $logged_hidden_online == 0 )
{
$l_h_user_s = $lang['Hidden_users_zero_total'];
}
else if( $logged_hidden_online == 1 )
{
$l_h_user_s = $lang['Hidden_user_total'];
}
else
{
$l_h_user_s = $lang['Hidden_users_total'];
}

if( $guests_online == 0 )
{
$l_g_user_s = $lang['Guest_users_zero_total'];
}
else if( $guests_online == 1 )
{
$l_g_user_s = $lang['Guest_user_total'];
}
else
{
$l_g_user_s = $lang['Guest_users_total'];
}

$l_online_users = sprintf($l_t_user_s, $total_online_users);
$l_online_users .= sprintf($l_r_user_s, $logged_visible_online);
$l_online_users .= sprintf($l_h_user_s, $logged_hidden_online);
$l_online_users .= sprintf($l_g_user_s, $guests_online);

$onlinet="$l_online_users<br>$online_userlist<br>";



Agora, agora para toda a informação ser gerada, fazemos um print da variavel $onlinet na pagina. Se quiseres editar a forma com que os dados vão aparecer, terás de editar o seguinte codigo.


3. Alargando as capacidades das Mensagens Privadas

Isto é uma modificação, que eu ainda não vi em nenhum site que visitei. Então decidi adicionar ao meu site. e criei o script direito. Este script vai verificar se tens novas mensagens privadas e vai abrir uma janela pop-up se o utilizador tiver essa função activa no perfil. Eu adaptei este hack de um já disponivel: http://www.phpbbhacks.com/viewhack.php?id=710 A primeira parte do codigo é necessaria, e vau ser usada muitas vezes apartir de agora, este codigo vai verificar se o utilizador está logado na sua conta.


if($userdata['session_logged_in']){ //logado

Não te esqueças de fechar os comandos da condição depois do fim do codigo, eu vou lembrar-te. Esta proxima parte faz tudo o que precisamos, vai começar por verificar novas mensagens privadas, senão tiver, não faz nada.

if ( $userdata['user_new_privmsg'] ) //mensagens privadas por AJ Quick
{
$l_message_new = ( $userdata['user_new_privmsg'] == 1 ) ? $lang['New_pm'] : $lang['New_pms'];
$l_privmsgs_text = sprintf($l_message_new, $userdata['user_new_privmsg']);

if ( $userdata['user_last_privmsg'] > $userdata['user_lastvisit'] )
{
$sql = "UPDATE " . USERS_TABLE . "
SET user_last_privmsg = " . $userdata['user_lastvisit'] . "
WHERE user_id = " . $userdata['user_id'];
if ( !$db->sql_query($sql) )
{
message_die(GENERAL_ERROR, 'Impossivel receber informação das mensagens privadas', '', __LINE__, __FILE__, $sql);
}

$s_privmsg_new = 1;
$icon_pm = $images['pm_new_msg'];
}
else
{
$s_privmsg_new = 0;
$icon_pm = $images['pm_no_new_msg'];
}

Esta parte basicamente verifica novas mensagens e actualiza a tabela. A proxima parte do codigo é necessaria para usar as variaveis de texto possam ser exibidas.

}
else
{
$l_privmsgs_text = $lang['No_new_pm'];

$s_privmsg_new = 0;
$icon_pm = $images['pm_no_new_msg'];
}

if ( $userdata['user_unread_privmsg'] )
{
$l_message_unread = ( $userdata['user_unread_privmsg'] == 1 ) ? $lang['Unread_pm'] : $lang['Unread_pms'];
$l_privmsgs_text_unread = sprintf($l_message_unread, $userdata['user_unread_privmsg']);
}
else
{
$l_privmsgs_text_unread = $lang['No_unread_pm'];
}

Agora fecha os comandos da condição, ou seja apartir de agora o utilizador não vai estar logado.

}

Para mostrar a informação, é necessario o seguinte codigo, insere no local onde queres que a informação seja exibida:

<a href="<?php echo $phpbb_root_path2 ?>privmsg.php?folder=inbox"><?php echo $l_privmsgs_text ?></a>

Simples não? Agora vamos tratar das pop-ups. Vai ser necessario adicionar este codigo nas tags head do HTML, deverá aparecer assim:

<?php
if ( !empty($userdata['user_popup_pm']) ){
?>
<script language="Javascript" type="text/javascript">
<!--
if (<?php echo $s_privmsg_new ?>)
{
window.open('<?php echo $phpbb_root_path2 ."privmsg.".$phpEx."?mode=newpm" ?>', '_phpbbprivmsg', 'HEIGHT=225,resizable=yes,WIDTH=400');;
}
//-->
</script>
<?php
}
?>


EM FASE DE TRADUÇÃO!
Offline

asturmas 
Administrador
Mensagens 19734 Gostos 50
Feedback +2

Troféus totais: 39
Trófeus: (Ver todos)
Mobile User Windows User Super Combination Combination Topic Starter 100 Poll Votes 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter

Esperemos pela versao final  :wink:
Offline

fpware 
Fundador
Mensagens 15318 Gostos 7
Troféus totais: 38
Trófeus: (Ver todos)
Linux User Mobile User Level 6 Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5

Traduz lá isso! :D
Offline

cenourinha 
Elite
Mensagens 4094 Gostos 21
Troféus totais: 34
Trófeus: (Ver todos)
Mobile User Apple User Level 6 Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4

Já traduzi mais um pouco, algumas palavras que não entendo, tento ir ao google e adapta-las, se alguem vir um erro, tanto na tradução, como em portugues diga sff!
Offline

fpware 
Fundador
Mensagens 15318 Gostos 7
Troféus totais: 38
Trófeus: (Ver todos)
Linux User Mobile User Level 6 Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5

Já detectei alguns erros, mas o melhor é deixar-te terminar e depois corrigir tudo ;)

Vai no bom caminho! :D

Se precisares de ajuda com o inglês avisa.
Offline

cenourinha 
Elite
Mensagens 4094 Gostos 21
Troféus totais: 34
Trófeus: (Ver todos)
Mobile User Apple User Level 6 Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4

mais um bocado!

Ufa, é só trabalho!
Offline

asturmas 
Administrador
Mensagens 19734 Gostos 50
Feedback +2

Troféus totais: 39
Trófeus: (Ver todos)
Mobile User Windows User Super Combination Combination Topic Starter 100 Poll Votes 50 Poll Votes 10 Poll Votes Poll Voter Poll Starter

lool
O cenourinha ta com work a mais lol
Offline

cenourinha 
Elite
Mensagens 4094 Gostos 21
Troféus totais: 34
Trófeus: (Ver todos)
Mobile User Apple User Level 6 Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 5 Level 4

Citação de: "asturmas"
lool
O cenourinha ta com work a mais lol


Podes crer, sou um gajo muito atarefado!