Creación de la Tabla base de datos
Lo primero que vamos a hacer es crear una tabla en nuestra base de datos para guardar que usuario esta observando cada foro:
Quote::
--- Create Forum Notify table -------
CREATE TABLE nuke_bbforums_watch (
Forum_id smallint(5) unsigned NOT NULL default '0',
User_id mediumint(8) NOT NULL default '0',
Notify_status tinyint(1) NOT NULL default '0',
KEY forum_id (forum_id),
KEY user_id (user_id),
KEY notify_status (notify_status)
);
Ahora actuamos sobre dos ficheros importantes:
######### --- ADD to includes/constants.php -- #######
AƱadimos las siguientes dos lineas en includes/constants.php:
Quote::
// Forum Watch:
Define('FORUMS_WATCH_TABLE', $prefix.'_bbforums_watch');
######--- ADD three variables in languages/[lang]/forums.php -- #######
Y tres variables en los ficheros de Lenguas (tres en cada lengua):
Quote::
'Forum_watch_subject' => 'Forum Watch',
'Forum_watch' => 'Forum Watch',
'Forum_unwatch' => 'Forum Unwatch',
Ahora tocamos un fichero crucial... El que manda los mensajes a los usuarios suscritos a un tema: includes/functions_post.php
Adjuntaremos al final este fichero modificado para mas comodidad del webmaster.
######### --- includes/functions_post.php ---- #########
---------- Add this line at the end of function "function user_notification" --- line 432
Quote::
user_forum_notification($mode, $post_data, $topic_title, $forum_id, $topic_id, $post_id, $notify_user);
----------- Create new function --------
Creamos una nueva Función:
Quote::
Function user_forum_notification($mode, &$post_data, &$topic_title, &$forum_id, &$topic_id, &$post_id, &$notify_user)
{
global $board_config, $lang, $db, $phpbb_root_path, $MAIN_CFG;
global $userdata;
$current_time = gmtime();
////// mio - Observar Foro - Forum Watch //////
if(!$topic_title || $topic_title == "" ){
$row = $db->sql_fetchrow( $db->sql_query('SELECT topic_title FROM '.TOPICS_TABLE.' WHERE topic_id ='.$topic_id ));
$topic_title = $row['topic_title'];
}
if ($mode == 'reply' || $mode == 'newtopic' ) {
$result = $db->sql_query('SELECT user_id FROM '.USERS_TABLE.' WHERE user_level<1');
$user_id_sql = '';
while ($row = $db->sql_fetchrow($result)) { $user_id_sql .= ', '.$row['user_id']; }
$sql = "SELECT u.user_id, u.user_email, u.user_lang
FROM ".FORUMS_WATCH_TABLE." tw, ".USERS_TABLE." u
WHERE tw.forum_id = $forum_id
AND tw.user_id NOT IN (".$userdata['user_id'].", ".ANONYMOUS.$user_id_sql.")
AND u.user_id = tw.user_id";
$result = $db->sql_query($sql);
$update_watched_sql = '';
$bcc_list_ary = array();
if ($row = $db->sql_fetchrow($result)) {
// Sixty second limit
set_time_limit(0);
do {
if ($row['user_email'] != '') {
$bcc_list_ary[$row['user_lang']][] = $row['user_email'];
}
$update_watched_sql .= ($update_watched_sql != '') ? ', ' . $row['user_id'] : $row['user_id'];
}
while ($row = $db->sql_fetchrow($result));
if (sizeof($bcc_list_ary)) {
include("includes/phpBB/emailer.php");
$emailer = new emailer();
$orig_word = array();
$replacement_word = array();
obtain_word_list($orig_word, $replacement_word);
$emailer->from($board_config['board_email']);
$emailer->replyto($board_config['board_email']);
$topic_title = (count($orig_word)) ? preg_replace($orig_word, $replacement_word, htmlunprepare($topic_title)) : htmlunprepare($topic_title);
reset($bcc_list_ary);
while (list($user_lang, $bcc_list) = each($bcc_list_ary))
{
$emailer->use_template('topic_notify', $user_lang);
for ($i = 0; $i < count($bcc_list); $i++) {
$emailer->bcc($bcc_list[$i]);
}
// The Topic_reply_notification lang string below will be used
// if for some reason the mail template subject cannot be read
// ... Note it will not necessarily be in the posters own language!
// modificación importante
$emailer->set_subject($lang['Forum_watch_subject'].": $forum_id: - ".$topic_title);
// translators update their templates
$emailer->msg = preg_replace('#[ ]?{USERNAME}#', '', $emailer->msg);
$emailer->assign_vars(array(
'EMAIL_SIG' => (!empty($board_config['board_email_sig'])) ? str_replace('<br />', "\n", "-- \n" . $board_config['board_email_sig']) : '',
'SITENAME' => $board_config['sitename'],
// Important Modify
'TOPIC_TITLE' => $lang['Forum_watch_subject'].": $forum_id: - ".$topic_title,
'U_TOPIC' => getlink('&file=viewtopic&' . POST_POST_URL . "=$post_id", true, true)."#$post_id",
'U_STOP_WATCHING_TOPIC' => getlink("&file=viewforum&f=$forum_id&unwatch=forum", true, true))
);
$emailer->send();
$emailer->reset();
}
}
}
$db->sql_freeresult($result);
}
////// Fin Observar Foro - End of Forum Watch //////
}
//
// Fill smiley templates (or just the variables) with smileys
// Either in a window or inline
//
Modificamos viewforum.php
Nos vamos al fichero: modules/Forums/viewforum.php
He marcado en rojo "(is_user() && $is_auth['auth_mod'])" porque si quisiesemos abrir la opción atodos los usuarios, solo tendriamos que tocar aquĆ:. Sustituyendolo por (is_user())----- go to "End of forum prune" and add the next lines ---
Y detras de la función Prune añadimos:
Quote::
//
// End of forum prune
//
If (is_user() && $is_auth['auth_mod']){
$can_watch_forum = TRUE;
$sql = "SELECT notify_status
FROM ".FORUMS_WATCH_TABLE."
WHERE forum_id = $forum_id
AND user_id = ".$userdata['user_id'];
$result = $db->sql_query($sql);
if ( $row = $db->sql_fetchrow($result) ) {
// user watching
if ( isset($_GET['unwatch']) ) {
if ( $_GET['unwatch'] == 'forum' ) {
// user tring to "unwatch"
$sql_priority = (SQL_LAYER == "mysql") ? "LOW_PRIORITY" : '';
$db->sql_query("DELETE $sql_priority FROM ".FORUMS_WATCH_TABLE."
WHERE forum_id = $forum_id
AND user_id = ".$userdata['user_id']);
}
url_refresh(getlink("&file=viewforum&f=$forum_id"));
$message = $lang['No_longer_watching'].'<br /><br />'.sprintf($lang['Click_return_topic'], '<a href="'.getlink("&file=viewforum&f=$forum_id").'">', '</a>');
message_die(GENERAL_MESSAGE, $message);
} else {
// user not ask for "unwatch"
$is_watching_forum = TRUE;
}
} else {
if ( isset($_GET['watch']) ) {
if ( $_GET['watch'] == 'forum' ) {
$is_watching_forum = TRUE;
$sql_priority = (SQL_LAYER == "mysql") ? "LOW_PRIORITY" : '';
$sql = "INSERT $sql_priority INTO ".FORUMS_WATCH_TABLE." (user_id, forum_id, notify_status)
VALUES (".$userdata['user_id'].", $forum_id, 0)";
$result = $db->sql_query($sql);
}
url_refresh(getlink("&file=viewforum&f=$forum_id"));
$message = $lang['You_are_watching'].'<br /><br />'.sprintf($lang['Click_return_topic'], '<a href="'.getlink("&file=viewforum&f=$forum_id").'">', '</a>');
message_die(GENERAL_MESSAGE, $message);
}
}
} else {
// no user but try to unwatch
if ( isset($_GET['unwatch']) ) {
if ( $_GET['unwatch'] == 'forum' ) {
url_redirect(getlink('Your_Account'), true);
}
}
}
//
// End of forum watching
//
//
// Forum watch link
//
$s_watching_forum ='';
If ( $can_watch_forum ) {
if ( $is_watching_forum ) {
$s_watching_forum = ' <a href="'.getlink("&file=viewforum&f=$forum_id&unwatch=forum").'">'.$lang['Forum_unwatch'].'</a> ';
} else {
$s_watching_forum = ' <a href="'.getlink("&file=viewforum&f=$forum_id&watch=forum").'">'.$lang['Forum_watch'].'</a> ';
}
}
//
// End Forum watch link
//
--------- go to U_POST_NEW_TOPIC and add SERV_LINE
Por ultimo, buscamos la linea donde pone U_POST_NEW_TOPIC y detras aƱadimos una variable.
En nuestro caso esa variable se usa para mandar tambiƩn el enlace de RSS del foro y otros sevicios.
Quote::
'U_POST_NEW_TOPIC' => getlink("&file=posting&mode=newtopic&".POST_FORUM_URL."=$forum_id"),
// (rss, igoogle, watch forums...)
'SERV_LINE' => '<a href="rss/forums.php?f='.$forum_id.'"><img src="images/rss2.gif" alt="RSS: '.$forum_row['forum_name'].'" style="vertical-align:middle;" /></a> RSS'.$s_watching_forum,
Por ultimo hay que ir al Template de nuestro Tema:
themes/[Theme_name]/template/forums/viewforum_body.html
E insertar la variable 'SERV_LINE'
En nuestro caso esta insertada del siguiente modo en la linea 165 de nuestro tema:
Quote::
<tr>
<td colspan="8" class="gensmall">{SERV_LINE}</td>
</tr>