Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2006-11-29 21:34:18

Slavik
Гость

Mod ajax topic preview

Вот что у меня получилось (все с самого начала):
В 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=(&quot;|"|\'|)(.*)\\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&amp;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&amp;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;

#2 2006-12-04 15:52:19

Bear
Гость

Re: Mod ajax topic preview

Up :-D

#3 2006-12-04 19:20:20

Costa
Гость

Re: Mod ajax topic preview

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, но как это сделать, не соображу.

#4 2006-12-04 21:45:08

Slavik
Гость

Re: Mod ajax topic preview

 reg = /&words=.*/;
    l = l.replace(reg, '');

#5 2008-04-17 21:44:58

Dayset
Гость

Re: Mod ajax topic preview

Пардон - это AJAX? Я на панресе брал мод -написали ajax а превиев текст в самом viewforum под alt="" был заложен.
Где бы его посмотреть в деле -немаленький, само поставить дня только через 3 соберусь.

Подвал доски

Под управлением FluxBB. Хостинг Hostens