Быстрый лёгкий надёжный форумный движок
Вы не вошли.
Страницы 1
Тема закрыта
Вот что у меня получилось (все с самого начала):
В header.php перед ~170:
$user_agent = isset($_SERVER['HTTP_USER_AGENT']) ? strtolower($_SERVER['HTTP_USER_AGENT']) : '';
добавить
if (in_array(basename($_SERVER['PHP_SELF']), array('viewforum.php', 'search.php')) && ($pun_user['show_preview']))
{
?>
<script type="text/javascript" src="<?php echo substr(PUN_ROOT,2) ?>include/tooltip_preview.js"></script>
<script type="text/javascript">
var preview_type = <?php echo $pun_user['show_preview'] ?>
</script>
<?php
if ($pun_user['show_preview'] == '1') $hint_box = '<div id="tooltip_preview" style="visibility:hidden;position: absolute; " class="infobox">'.$lang_topic['Quote Hint'].'</div>';
else $hint_box = '<div onmouseover="javascript:show = 1;" onmouseout="javascript:waithideTip();" id="tooltip_preview" style="visibility:hidden;position: absolute; " class="previewbox">'.$lang_topic['Quote Hint'].'</div><div id="tooltip_wait" style="visibility:hidden;position: absolute; " class="infobox">Loading... Please wait</div>';
}
в viewforum.php после:
require PUN_ROOT.'include/common.php';
добавить
require PUN_ROOT.'preview.common.php';
создать include/tooltip_preview.js такого содержания:
var posts = new Array();
var posts2 = new Array();
var topics = new Array();
var topics2 = new Array();
var newt = new Array();
var newt2 = new Array();
var curid = 0;
var curtypeis = '';
var vt = '';
var busy = 0;
var show = 0;
var hide = 1;
function getAbsPos (p) {
var s = { x:0, y:0 };
while (p.offsetParent) {
s.x += p.offsetLeft;
s.y += p.offsetTop;
p = p.offsetParent;
}
return s;
}
function addHandler(object, event, handler)
{
if (typeof object.addEventListener != 'undefined')
object.addEventListener(event, handler, false);
else if (typeof object.attachEvent != 'undefined')
object.attachEvent('on' + event, handler);
else
return;
}
function emptyCache(typeis, id) {
obj = document.getElementById("tooltip_preview");
if (typeis == 'p')
for (var i=0; i<posts.length; i++) if (posts[i] == id) return;
if (typeis == 't')
for (var i=0; i<topics.length; i++) if (topics[i] == id) return;
if (typeis == 'new')
for (var i=0; i<newt.length; i++) if (newt[i] == id) return;
curtypeis = typeis;
curid = id;
busy = 1;
xajax_preview(typeis, id);
}
function waithideTip() {
document.getElementById("tooltip_wait").style.visibility = "hidden";
show = 0;
timeoutID = setTimeout('hideTip()',800);
};
function nowhideTip() {
if (document.getElementById("tooltip_wait")) document.getElementById("tooltip_wait").style.visibility = "hidden";
show = 0;
hideTip();
};
function hideTip() {
if (show == 0) {
document.getElementById("tooltip_preview").style.visibility = "hidden";
document.getElementById("tooltip_preview").innerHTML = '';
if (preview_type == 2) clearTimeout(timeoutID);
};
}
function parse_url(l) {
reg = /.*viewtopic.php./;
l = l.replace(reg, '');
reg = /^id./;
if (l.match(reg)) {
l = l.replace(reg, '');
reg = /&action=new/;
if (l.match(reg)) vt = 'new'
else vt = 't';
l = l.replace(reg, '');
}
else {
reg = /^pid./;
if (l.match(reg)) {
vt = 'p';
l = l.replace(reg, '');
reg = /#.*/;
l = l.replace(reg, '');
};
};
return l;
};
function showTip(e) {
// alert('Ah tung!');
// if (busy ==1 || show == 1) return;
if (e.srcElement)
l = parse_url(e.srcElement.href)
else
l = parse_url(this.href);
emptyCache(vt, l);
obj = document.getElementById("tooltip_preview");
if (vt == 'p')
for (var i=0; i<posts.length; i++) if (posts[i] == l) obj.innerHTML = posts2[i];
if (vt == 't')
for (var i=0; i<topics.length; i++) if (topics[i] == l) obj.innerHTML = topics2[i];
if (vt == 'new')
for (var i=0; i<newt.length; i++) if (newt[i] == l) obj.innerHTML = newt2[i];
if (e.srcElement)
coord = getAbsPos(e.srcElement)
else
coord = getAbsPos(this);
obj.style.top = coord.y - obj.clientHeight -14 + "px";
if (vt == 't' || vt == 'new') obj.style.left = coord.x - obj.clientWidth + 240 + "px";
if (vt == 'p') obj.style.left = coord.x - obj.clientWidth + 120 + "px";
if (obj.innerHTML != '') obj.style.visibility = "visible";
show = 1;
}
function load_message(e) {
busy = 1;
if (document.getElementById("tooltip_preview").style.visibility == "visible") return;
obj = document.getElementById("tooltip_wait");
if (e.srcElement)
coord = getAbsPos(e.srcElement)
else
coord = getAbsPos(this);
if (e.srcElement)
l = parse_url(e.srcElement.href)
else
l = parse_url(this.href);
obj.style.top = coord.y - obj.clientHeight -14 + "px";
if (vt == 't' || vt == 'new') obj.style.left = coord.x - obj.clientWidth + 240 + "px";
if (vt == 'p') obj.style.left = coord.x - obj.clientWidth + 120 + "px";
obj.style.visibility = "visible";
obj = document.getElementById("tooltip_preview");
obj.style.top = coord.y - obj.clientHeight -14 + "px";
if (vt == 't' || vt == 'new') obj.style.left = coord.x - obj.clientWidth + 320 + "px";
if (vt == 'p') obj.style.left = coord.x - obj.clientWidth + 120 + "px";
if (vt == 'p') xajax_full_preview(vt, l, 0);
if (vt == 'new') xajax_full_preview(vt, l, 0);
if (vt == 't') xajax_full_preview(vt, l, 1);
}
function relinks() {
if (preview_type == '2') {
obj = document.getElementById("tooltip_preview");
obj.width = '30em';
obj.height = '';
var nav_menu = '';
var topic_id = 0;
var page_count = 0;
var number_page = 0;
};
var links = document.links;
for (var i=0; i<links.length; i++) attachLink(links[i]);
}
function attachLink (elt) {
var reg = /&p=./;
var reg2 = /action=all/;
var re = new RegExp('viewtopic.php');
if (!elt.href.match(re) || elt.href.match(reg) || elt.href.match(reg2)) return;
if (preview_type == 1) {
addHandler(elt, 'mouseover', showTip);
addHandler(elt, 'mouseout', nowhideTip);
}
else {
addHandler(elt, 'mouseover', load_message);
addHandler(elt, 'mouseout', waithideTip);
}
}
function show_preview(message) {
obj = document.getElementById("tooltip_preview");
obj.innerHTML = message;
if (show == 1) obj.style.visibility = "visible";
busy = 0;
if (curtypeis == 'p') {
posts.push(curid);
posts2.push(message);
};
if (curtypeis == 't') {
topics.push(curid);
topics2.push(message);
};
if (curtypeis == 'new') {
newt.push(curid);
newt2.push(message);
};
}
function generateNavMenu(tid, pid, num_pages, page) {
navMenu = '<p align=right>';
if (page == 1) navMenu += '<< <'
else navMenu += '<a href="#first" onclick="javascript:goto_post(\'first\')"><<</a> <a href="#prev" onclick="javascript:goto_post(\'prev\')"><</a> ';
navMenu += page + '/' + num_pages;
if (page == num_pages) navMenu += '> >>'
else navMenu += ' <a href="#next" onclick="javascript:goto_post(\'next\')">></a> <a href="#end" onclick="javascript:goto_post(\'end\')">>></a>';
navMenu += ' <a href="viewtopic.php?pid=' + pid + '#p' + pid + '" title="go to post">^</a> <a href="#closetip" onclick="javascript:nowhideTip()">x</a>';
navMenu += '</p>';
topic_id = tid;
number_page = page;
page_count = num_pages;
}
function show_full(message, tid, pid, num_pages, page) {
generateNavMenu(tid, pid, num_pages, page);
obj = document.getElementById("tooltip_wait");
obj.style.visibility = "hidden";
obj = document.getElementById("tooltip_preview");
obj.innerHTML = navMenu + message;
coord = getAbsPos(obj);
if (show != 1) obj.style.top = coord.y - obj.clientHeight -4 + "px";
obj.style.visibility = "visible";
show = 1;
busy = 0;
}
function goto_post(w) {
document.getElementById("tooltip_preview").visibility = "hidden";
document.getElementById("tooltip_wait").visibility = "visible";
if (w == 'first') xajax_full_preview('t', topic_id, 1);
if (w == 'prev') xajax_full_preview('t', topic_id, number_page - 1);
if (w == 'next') xajax_full_preview('t', topic_id, number_page + 1);
if (w == 'end') xajax_full_preview('t', topic_id, page_count);
}
создать preview.common.php
<?php
require PUN_ROOT.'include/xajax.inc.php';
$xajax = new xajax("preview.server.php"); // initializing xajax
$xajax->registerFunction("preview");
$xajax->registerFunction("full_preview");
?>
создать preview.server.php
<?php
define('PUN_ROOT', './');
require PUN_ROOT.'include/common.php';
require PUN_ROOT.'include/parser.php';
function preparse($text)
{
$bb = array('b', 'i', 'u', 's');
foreach ($bb as $cbb) {
$count = substr_count($text, '['.$cbb.']') - substr_count($text, '[/'.$cbb.']');
if ($count > 0) for ($i = 0; $i < $count; $i++) $text .= '[/'.$cbb.']';
}
if (strpos($text, 'quote') !== false)
{
$text = str_replace('[quote]', "\t\n".'[b]Öèòàòà:[/b]', $text);
$text = preg_replace('#\[quote=("|"|\'|)(.*)\\1\]#seU', '"[b]".str_replace(array(\'[\', \'\\"\'), array(\'[\', \'"\'), \'$2\')." ".$lang_common[\'wrote\'].":[/b]"', $text);
$text = preg_replace('#\[\/quote\]\s*#', '', $text);
}
if (strpos($text, 'spoiler') !== false)
{
$text = str_replace('[spoiler]', "\t\n".'[b]Ñïîéëåð:[/b]', $text);
$text = preg_replace('#\[\/spoiler\]\s*#', '', $text);
}
if (strpos($text, 'code') !== false)
{
$text = str_replace('[_code]', "\t\n".'[b]Êîä:[/b]', $text); <=== убрать _
$text = preg_replace('#\[\/code\]\s*#', '', $text);
}
return $text;
}
function preview($typeis, $id)
{
global $db, $pun_user;
$objResponse = new xajaxResponse();
if ($typeis == 'p') $result = $db->query('SELECT message FROM '.$db->prefix.'posts WHERE id='.$id ) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
if ($typeis == 't') $result = $db->query('SELECT message FROM '.$db->prefix.'posts WHERE topic_id='.$id.' ORDER BY id LIMIT 1') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
if ($typeis == 'new') $result = $db->query('SELECT message FROM '.$db->prefix.'posts WHERE topic_id='.$id.' AND posted > '.$pun_user['last_visit'].' ORDER BY id LIMIT 1') or error('Unable to new topic post topic info', __FILE__, __LINE__, $db->error());
$cur_post = $db->fetch_assoc($result);
$ml = 170;
if (strlen($cur_post['message']) > $ml) $d = '...';
$mes = $cur_post['message'];
$mes = preparse(substr($mes, 0 ,$ml));
$previewmsg = parse_message($mes.$d, 1);
$objResponse->addScript("show_preview('".$previewmsg."');");
return $objResponse->getXML();
}
function full_preview($typeis, $id, $page)
{
global $db, $pun_user;
$objResponse = new xajaxResponse();
if ($typeis == 'p') {
$result = $db->query('SELECT topic_id FROM '.$db->prefix.'posts WHERE id='.$id ) or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
$tid = $db->fetch_assoc($result);
$id = $tid['topic_id'];
};
$i = 0;
$result = $db->query('SELECT id, message FROM '.$db->prefix.'posts WHERE topic_id='.$id.' ORDER BY id') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error());
$num_pages= $db->num_rows($result);
while ($posts = $db->fetch_assoc($result)) {
$i++;
if (($typeis == 'new' && $posts['posted'] > $pun_user['last_vizit']) || ($typeis == 't' && $i == $page) || ($typeis == 'p' && $i == $num_pages)) break;
}
$previewmsg = parse_message($posts['message'], 0);
$objResponse->addScript("show_full('".$previewmsg."', ".$id.", ".$posts['id'].", ".$num_pages.", ".$i.");");
return $objResponse->getXML();
}
require("preview.common.php");
$xajax->processRequests();
?>
в style/imports/base.css добавить в конец
DIV.previewbox {
font-weight: normal;
display: block;
visibility:hidden;
position: absolute;
width: 37em;
text-align: left;
font-size: 0.8em;
padding: 0.5em;
}
в style/imports/[style_name]_cs.css добавить в конец что-то вроде этого
DIV.previewbox {
border: 1px solid #0066B9;
background: #F1F1F1 url(../../img/QuickQuote/hint_bg_oxygen.gif) no-repeat right bottom;
color: #333;
z-index:100;opacity:0.8;
}
в бд добавить поле в таблице $db->prefix.'users':
ALTER TABLE `prefix_users` ADD `show_preview` TINYINT( 1 ) DEFAULT '0' NOT NULL AFTER `show_sig` ;
В profile.php 803
$form = extract_elements(array('disp_topics', 'disp_posts', 'show_smilies', 'show_img', 'show_img_sig', 'show_avatars', 'show_sig', 'style'));
заменить на
$form = extract_elements(array('disp_topics', 'disp_posts', 'show_smilies', 'show_img', 'show_img_sig', 'show_avatars', 'show_sig', 'show_preview', 'style'));
814 строка
if (!isset($form['show_sig']) || $form['show_sig'] != '1') $form['show_sig'] = '0';
после добавить
if (!isset($form['show_preview']) || ($form['show_preview'] != '1' && $form['show_preview'] != '2')) $form['show_preview'] = '0';
902 строка:
$result = $db->query('SELECT u.username, u.email, u.title, u.realname, u.url, u.jabber, u.icq, u.msn, u.aim, u.yahoo, u.location, u.birthday, u.use_avatar, u.signature, u.disp_topics, u.disp_posts, u.email_setting, u.save_pass, u.notify_with_post, u.show_smilies, u.show_img, u.show_img_sig, u.show_avatars, u.show_sig, u.timezone, u.style, u.num_posts, u.last_post, u.registered, u.registration_ip, u.admin_note, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id='.$id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
заменить на
$result = $db->query('SELECT u.username, u.email, u.title, u.realname, u.url, u.jabber, u.icq, u.msn, u.aim, u.yahoo, u.location, u.birthday, u.use_avatar, u.signature, u.show_preview, u.disp_topics, u.disp_posts, u.email_setting, u.save_pass, u.notify_with_post, u.show_smilies, u.show_img, u.show_img_sig, u.show_avatars, u.show_sig, u.timezone, u.style, u.num_posts, u.last_post, u.registered, u.registration_ip, u.admin_note, g.g_id, g.g_user_title FROM '.$db->prefix.'users AS u LEFT JOIN '.$db->prefix.'groups AS g ON g.g_id=u.group_id WHERE u.id='.$id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error());
найти ~1500:
<div class="inform">
<fieldset>
<legend><?php echo $lang_profile['Post display legend'] ?></legend>
<div class="infldset">
перед добавить
<div class="inform">
<fieldset>
<legend><?php echo $lang_profile['Preview display legend'] ?></legend>
<div class="infldset">
<p><?php echo $lang_profile['Preview display info'] ?></p>
<div class="rbox">
<label>
<input type="radio" name="form[show_preview]" value="0"<?php if ($user['show_preview'] == '0') echo ' checked=1' ?> /><?php echo $lang_profile['No show preview'] ?><br />
<input type="radio" name="form[show_preview]" value="1"<?php if ($user['show_preview'] == '1') echo ' checked=1' ?> /><?php echo $lang_profile['Show preview 1'] ?><br />
<input type="radio" name="form[show_preview]" value="2"<?php if ($user['show_preview'] == '2') echo ' checked=1' ?> /><?php echo $lang_profile['Show preview 2'] ?><br />
</label>
</div>
</div>
</fieldset>
</div>
В lang/profile.php добавить:
'Preview display legend' => 'Выбор типа предпросмотра сообщений',
'Preview display info' => 'Вы можете посмотреть часть сообщения или все сообщение не открывая новой страницы. Для этого достаточно навести на заголовок темы или последнее сообщение, в всплывающем окошке вы увидите текст сообщения.',
'No show preview' => 'Не показывать',
'Show preview 1' => 'Показывать часть сообщения',
'Show preview 2' => 'Показывать полное сообщение',
Если у вас установлен патченный tooltip от hcs тогда пропускаем этот шаг, иначе после
// START SUBST - <body>
if (isset($focus_element))
{
$tpl_main = str_replace('<body onload="', '<body onload="document.getElementById(\''.$focus_element[0].'\').'.$focus_element[1].'.focus();', $tpl_main);
$tpl_main = str_replace('<body>', '<body onload="document.getElementById(\''.$focus_element[0].'\').'.$focus_element[1].'.focus()">', $tpl_main);
}
добавляем
// QQ_NP HCS TOOLTIP MOD BEGIN
if (isset($hint_box )) {
$tpl_main = str_replace('<body onload="', '<body onload="relinks();', $tpl_main);
$tpl_main = str_replace('<body>', '<body onload="relinks();">', $tpl_main);
}
// QQ_NP HCS TOOLTIP MOD END
заменяем
// START SUBST - <pun_status>
if ($pun_user['is_guest'])
$tpl_temp = '<div id="brdwelcome" class="inbox">'."\n\t\t\t".$lang_common['Not logged in'].' ( '.'<a href="'.substr(PUN_ROOT, 2).'login.php">'.$lang_common['Login'].'</a> | '.'<a href="'.substr(PUN_ROOT, 2).'register.php">'.$lang_common['Register'].'</a>'.' )'.'<p>'."\n\t\t".'</div>';
else
{
$tpl_temp = '<div id="brdwelcome" class="inbox">'."\n\t\t\t".'<ul class="conl">'."\n\t\t\t\t".'<li>'.$lang_common['Logged in as'].' <strong>'.pun_htmlspecialchars($pun_user['username']).'</strong>'.' ( <a href="'.$anplace.'login.php?action=out&id='.$pun_user['id'].'">'.$lang_common['Logout'].'</a> )'.'</li>'."\n\t\t\t\t".'<li>'.$lang_common['Last visit'].': '.format_time($pun_user['last_visit']).'</li>';
на
// START SUBST - <pun_status>
if ($pun_user['is_guest'])
$tpl_temp .= '<div id="brdwelcome" class="inbox">'."\n\t\t\t".$lang_common['Not logged in'].' ( '.'<a href="'.substr(PUN_ROOT, 2).'login.php">'.$lang_common['Login'].'</a> | '.'<a href="'.substr(PUN_ROOT, 2).'register.php">'.$lang_common['Register'].'</a>'.' )'.'<p>'."\n\t\t".'</div>';
else
{
$tpl_temp .= '<div id="brdwelcome" class="inbox">'."\n\t\t\t".'<ul class="conl">'."\n\t\t\t\t".'<li>'.$lang_common['Logged in as'].' <strong>'.pun_htmlspecialchars($pun_user['username']).'</strong>'.' ( <a href="'.$anplace.'login.php?action=out&id='.$pun_user['id'].'">'.$lang_common['Logout'].'</a> )'.'</li>'."\n\t\t\t\t".'<li>'.$lang_common['Last visit'].': '.format_time($pun_user['last_visit']).'</li>';
Tip: в DIV.infobox можно добавить такую строчку: z-index:100;filter:alpha(opacity=90);opacity:0.9;-moz-opacity:0.9;
Up :-D
Slavik, я тут пытаюсь прикрутить мод выделения цветом в поиске, так вот topic preview глючит не по-деццки, если в запросе в конце добавлено &words=topic. Вываливается огроменное окно, в котором выведен xml-результат, в конце которого говорится о том, что в результате имеются white space. Прикручиваю пока к старой версии topic preview, хотя, думаю, и на новой тоже самое будет. Мод выделения цвета обрамляет найденные слова bb-кодами , которые потом заменяются на <span style="background-color: #FFFF00; color: #000000"></span>.
ПунДебаг говорит, что вот в этой строке:
if ($typeis == 't') $result = $db->query('SELECT message, poster, posted FROM '.$db->prefix.'posts WHERE topic_id='.$id.' ORDER BY id LIMIT 1') or error('Unable to fetch topic info', __FILE__, __LINE__, $db->error());
Unknown columns 'words' in 'where clause' (Errno 1054)
Запрос такой: http://www.mostok.org/forum/viewtopic.p … ords=topic
Чего можно сделать? Чувствую, что надо в java-скрипте от url-а отчикать этот &words=topic, но как это сделать, не соображу.
reg = /&words=.*/;
l = l.replace(reg, '');
Пардон - это AJAX? Я на панресе брал мод -написали ajax а превиев текст в самом viewforum под alt="" был заложен.
Где бы его посмотреть в деле -немаленький, само поставить дня только через 3 соберусь.
Страницы 1
Тема закрыта