Hallo,
ich habe da ein kleines problem mit der Shoutbox für ein SMF Forum(addon dazu)
die user wollten jetzt das der neuste Beitrag wie in einem Chat unten angezeigt wird und nicht oben... Gesagt getan und die Abfrage aus der Datenbank entsprechend geändert auf
Lainaafrom ".$db_prefix."sbox_content order by id ASC,
Nun stehen die neusten Antworten unten. Da aber ein iframe ist und der auch Scrollbalken senkrecht haben soll springt die Box leider nach jedem refresh oder eintippen wieder nach oben und man muss immer ernuet runterscrollen.
wie bekomme ich es hin das man nach dem eintippen und refresh ans ende der shoutbox kommt, sprich das man hochscrollen muss um altere beiträge zu lesen aber die neusten immer unten sind und auch der scrollbalken?
Huhu,
ich habe nun mal bisschen probiert es mit einem ANKER zu setzen. Wie gesagt das neuste Post nach unten setzen kein Problem:$result = db_query("select * from ".$db_prefix."sbox_content order by id asc, time asc limit ".$modSettings['sbox_MaxLines'],__FILE__,__LINE__);
im meta refresh dann den anker gesetzt <meta http-equiv="refresh" content="'.$modSettings['sbox_RefreshTime'].';URL=sboxDB.php#read">
den entsprechenden Anker in die Abfrageif(mysql_num_rows($result))
{
$count=0; // counter to distinguish font color
while($row = mysql_fetch_assoc($result))
{
echo '<a id="read"></a>';
Dann im sbox.template alles auf #read angepasst. Nun springt er nach unten und dann fangen die Probleme an.
1. Sieht man den header der seite nicht mehr(springt ja in die letzte zeile der Box)
2. kein autorefresh mehr unter dem IE
3. er zeigt das neuste Post erst nach Zeitverzögerung(liegt wohl an der grösse der Box und den maximal gezeigten Zeilen)
4. flackert leicht auf und ab bei jedem autorefresh
Hat hier jemand eine andere Lösung oder findet den Fehler? Ich brauche da mal bitte etwas Hilfe da ich nicht der GURU bin und das unbedingt brauch.
Danke allen und bitte bitte ei wenig Hilfe
Versuch mal folgendes:
1. Nicht bei JEDER ausgegebenen Zeile den Anker setzen, sondern nur ein einziges mal am Ende.
2. Dann per JavaScript manuell den Anker anspringen.
Das Ende von sboxDB.php sieht dann aus wie folgt:
echo '<a id="read"></a>
<script language="JavaScript" type="text/javascript"><!-- // --><![CDATA[
location.href="#read";
// ]]></script>
</body>
</html>';
}
?>
So funktioniert es bei mir.
Deep
Oh danke für die Hilfe. Leider habe ich einen Hänger. Nur dein Code dazu oder irgendwelche Änderungen von mir auch. Kannst du mir vielleicht die dateien und änderungen hier posten? Bin da leider nicht ganz so der Guru.....
danke dir
Hier zur Sicherheit mal meine sboxDB.php:
<?php
require("../SSI.php");
if (!defined('SMF'))
die('Hacking attempt...');
// global variables
global $db_connection, $context, $settings, $txt, $user_info, $modSettings, $db_prefix;
// Check if refresh time is invalid
if ($modSettings['sbox_RefreshTime'] == '')
$modSettings['sbox_RefreshTime'] = '20';
if ($modSettings['sbox_RefreshTime'] < '5')
$modSettings['sbox_RefreshTime'] = '5';
//display html header
echo '<html xmlns="http://www.w3.org/1999/xhtml"', $context['right_to_left'] ? ' dir="rtl"' : '', '>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=', $context['character_set'], '" />
<meta name="description" content="Shoutbox" />
<meta name="keywords" content="Shoutbox" />
<title>Shoutbox</title>
<meta http-equiv="refresh" content="'.$modSettings['sbox_RefreshTime'].';URL=sboxDB.php">
<link rel="stylesheet" type="text/css" href="', $settings['theme_url'], '/style.css?rc2" />
<script language="JavaScript" type="text/javascript"><!-- // --><![CDATA[
function killYesNo()
{
return confirm("'.$txt['sbox_KillShout'].'");
}
// ]]></script>
<style type="text/css"><!-- // --><![CDATA[
<!--
.Kill
{
color: #ff0000;
}
.OddLine
{
font-family: '.$modSettings['sbox_FontFamily1'].';
font-style: normal;
font-size: '.$modSettings['sbox_TextSize1'].';
font-weight: normal;
color: '.$modSettings['sbox_TextColor1'].';
}
.EvenLine
{
font-family: '.$modSettings['sbox_FontFamily2'].';
font-style: normal;
font-size: '.$modSettings['sbox_TextSize2'].';
font-weight: normal;
color: '.$modSettings['sbox_TextColor2'].';
}
body
{
padding: 0px 0px 0px 0px;
background-color: '.$modSettings['sbox_BackgroundColor'].';
}
a:link
{
color: #ff0000;
text-decoration: none;
}
//-->
// ]]></style>';
// Automatic installation of shoutbox table and settings
if ($modSettings['sbox_AutoInstall'] != "1")
{
// Shoutbox table
$result = mysql_query("
CREATE TABLE {$db_prefix}sbox_messages
(id int(11) NOT NULL auto_increment,
shouttime int(11) NOT NULL default '',
name varchar(80) NOT NULL default '',
content text NOT NULL,
PRIMARY KEY (id)) TYPE=MyISAM;");
// Shoutbox settings
$toSet = array();
$toSet['sbox_Visible'] = '1';
$toSet['sbox_GuestAllowed'] = '0';
$toSet['sbox_MaxLines'] = '30';
$toSet['sbox_Height'] = '180';
$toSet['sbox_SmiliesVisible'] = '1';
$toSet['sbox_TextSize1'] = 'x-small';
$toSet['sbox_TextColor1'] = '#123456';
$toSet['sbox_TextSize2'] = 'x-small';
$toSet['sbox_TextColor2'] = '#000000';
$toSet['sbox_RefreshTime'] = '20';
$toSet['sbox_BackgroundColor'] = '#E5E5E8';
$toSet['sbox_FontFamily1'] = 'Verdana, sans-serif';
$toSet['sbox_FontFamily2'] = 'Verdana, sans-serif';
$toSet['sbox_AutoInstall'] = '0';
// Insert settings
foreach ($toSet as $key => $value)
mysql_query("INSERT INTO {$db_prefix}settings (`variable`, `value`) VALUES ('$key', '$value');");
// Prevent shoutbox from installing table and seetings again
mysql_query("UPDATE {$db_prefix}settings set value='1' where variable='sbox_AutoInstall'");
}
switch ($_REQUEST['action'])
{
case "init_shoutbox":
if ($context['user']['is_admin'])
{
}
break;
case "write":
if ((!$context['user']['is_guest']) || ($modSettings['sbox_GuestAllowed'] == "1"))
{
// empty messages are not allowed
$content=$_REQUEST['sboxText'];
if(chop($content."") != "")
{
// handle spacial characters
$content=addslashes($content);
// enquote html and script code to avoid html/javascript injection
$content = htmlentities($content, ENT_QUOTES);
// Enable BB-Code
$content = doUBBC($content);
$time=time();
// insert shout message into database
$sql = "insert into ".$db_prefix."sbox_messages (name,content,shouttime) values ('".$user_info['username']."','".$content."','".$time."')";
db_query($sql,__FILE__,__LINE__);
// delete old shout messages (get id of last shouting and delete all shoutings as defined in settings)
$result = db_query("select id from ".$db_prefix."sbox_messages where name='".$user_info['username']."' and content='".$content."' and shouttime='$time'",__FILE__,__LINE__);
$rows = mysql_fetch_assoc($result) ;
$sql = "delete from ".$db_prefix."sbox_messages where id < '".($rows["id"]-$modSettings['sbox_MaxLines'])."'";
db_query($sql,__FILE__,__LINE__);
}
}
break;
case "kill":
if ($context['user']['is_admin'])
{
$id = "".$_REQUEST['kill'];
if ($id != "")
{
$sql = "delete from ".$db_prefix."sbox_messages where id=".$id."";
db_query($sql,__FILE__,__LINE__);
}
}
break;
}
// close header and open body
echo '
</head>
<body>';
// get smilie path
$themedir = $settings['default_theme_url']; // smf theme path
$imgdir = $themedir."/images/"; // smilie path
// get shout messages out of database
$result = db_query("select id,name,shouttime,content from ".$db_prefix."sbox_messages order by id desc, shouttime asc limit ".$modSettings['sbox_MaxLines'],__FILE__,__LINE__);
if(mysql_num_rows($result))
{
$count=0; // counter to distinguish font color
while($row = mysql_fetch_assoc($result))
{
$count = $count + 1; // increase counter
$name = $row["name"]; // user name
$shouttime = $row["shouttime"]; // shouting date and time
$content = stripslashes($row['content']); // shouting content
$time=$shouttime;
// replace smilie code with path to smilie image
$content = str_replace ($txt['sbox_smilie01_code'], '<img src="'.$imgdir.$txt['sbox_smilie01_file'].'" alt="'.$txt['sbox_smilie01_text'].'" title="'.$txt['sbox_smilie01_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie02_code'], '<img src="'.$imgdir.$txt['sbox_smilie02_file'].'" alt="'.$txt['sbox_smilie02_text'].'" title="'.$txt['sbox_smilie02_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie03_code'], '<img src="'.$imgdir.$txt['sbox_smilie03_file'].'" alt="'.$txt['sbox_smilie03_text'].'" title="'.$txt['sbox_smilie03_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie04_code'], '<img src="'.$imgdir.$txt['sbox_smilie04_file'].'" alt="'.$txt['sbox_smilie04_text'].'" title="'.$txt['sbox_smilie04_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie05_code'], '<img src="'.$imgdir.$txt['sbox_smilie05_file'].'" alt="'.$txt['sbox_smilie05_text'].'" title="'.$txt['sbox_smilie05_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie06_code'], '<img src="'.$imgdir.$txt['sbox_smilie06_file'].'" alt="'.$txt['sbox_smilie06_text'].'" title="'.$txt['sbox_smilie06_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie07_code'], '<img src="'.$imgdir.$txt['sbox_smilie07_file'].'" alt="'.$txt['sbox_smilie07_text'].'" title="'.$txt['sbox_smilie07_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie08_code'], '<img src="'.$imgdir.$txt['sbox_smilie08_file'].'" alt="'.$txt['sbox_smilie08_text'].'" title="'.$txt['sbox_smilie08_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie09_code'], '<img src="'.$imgdir.$txt['sbox_smilie09_file'].'" alt="'.$txt['sbox_smilie09_text'].'" title="'.$txt['sbox_smilie09_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie10_code'], '<img src="'.$imgdir.$txt['sbox_smilie10_file'].'" alt="'.$txt['sbox_smilie10_text'].'" title="'.$txt['sbox_smilie10_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie11_code'], '<img src="'.$imgdir.$txt['sbox_smilie11_file'].'" alt="'.$txt['sbox_smilie11_text'].'" title="'.$txt['sbox_smilie11_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie12_code'], '<img src="'.$imgdir.$txt['sbox_smilie12_file'].'" alt="'.$txt['sbox_smilie12_text'].'" title="'.$txt['sbox_smilie12_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie13_code'], '<img src="'.$imgdir.$txt['sbox_smilie13_file'].'" alt="'.$txt['sbox_smilie13_text'].'" title="'.$txt['sbox_smilie13_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie14_code'], '<img src="'.$imgdir.$txt['sbox_smilie14_file'].'" alt="'.$txt['sbox_smilie14_text'].'" title="'.$txt['sbox_smilie14_text'].'" border="0" />', $content);
$content = str_replace ($txt['sbox_smilie15_code'], '<img src="'.$imgdir.$txt['sbox_smilie15_file'].'" alt="'.$txt['sbox_smilie15_text'].'" title="'.$txt['sbox_smilie15_text'].'" border="0" />', $content);
// Offset the time.
$time = $time + ($user_info['time_offset'] + $modSettings['time_offset']) * 3600;
if ($time < 0)
$time = 0;
// get actual weekday
$days = array($txt['sbox_Sunday'],$txt['sbox_Monday'],$txt['sbox_Tuesday'],$txt['sbox_Wednesday'],$txt['sbox_Thurday'],$txt['sbox_Friday'],$txt['sbox_Saturday']);
$day=$days[date("w",$time)]; // weekday
$date=$day." | ". date("G:i",$time); // time
// display shouting message and use a different color each second row
if ($count % 2)
echo '
<div class="OddLine">';
else
echo '
<div class="EvenLine">';
if ($context['user']['is_admin'])
echo '<a title="'.$txt['sbox_KillShout'].'" class="Kill" onclick="return killYesNo();" href="sboxDB.php?action=kill&kill='.$row['id'].'">[X]</a>';
echo '[ '.$date.' ] <b><'.$name.'></b> '.$content.'</div>';
}
echo '<a id="read"></a>
<script language="JavaScript" type="text/javascript"><!-- // --><![CDATA[
location.href="#read";
// ]]></script>
</body>
</html>';
}
?>
Deep
PS.: Was Du in sbox.template.php geändert hast, ist okay.
danke für deine Hilfe. deine sbox.php ist etwas anders als meine aber ich habe das mal so eingebaut wie du. Funktioniert hervorragend mit einem riesen Problem :)
nun springt die Box so weiter runter das die shoutbox oben im browser nicht mehr zu lesen ist.....also sprich es springt zu tief:(
weiter tritt das problem auf das die letzte zeile erst später zu lesen ist als man sie tippt das muss irgendwie mit den reihen und den maximalen anzahl der Zeilen oder der grösse der shoutbox zu tun.
Kannst du mir da helfen? aber das nadere funktioniert schon mal :)
PS: kannst du mir mal einen Link geben wo ich mir deine anschauen kann das ich mal ein Bild bekomme wie es richtig aussehen muss :)
Ja, die sboxDB.php ist aus der Version 1.05beta, auf welche ich im englischen Thread (http://www.simplemachines.org/community/index.php?topic=76344.0) hinwies.
Übrigens ist der Titel Deines Threads etwas verwirrend, denn wir reden hier nicht über die "Ultimate Shoutbox" sondern über die "SMF Shoutbox".. ;)
Einen Link zu meiner Shoutbox kann ich Dir nicht geben, weil ich sie lokal auf meinem Arbeitsplatzrechner modifiziert habe.
Es wäre im Gegenzug aber möglicherweise hilfreich, wenn Du ein paar Screenshots posten könntest. Ich hab nämlich nicht so recht verstanden, was Du meinst mit "es springt zu tief" und "letzte Zeile erst später zu lesen ist". Hast Du die Shoutbox riesengroß gemacht?
Ergänzung:
Hier ist ein Bild der von mir modifizierten Shoutbox:

Deep
Oh sorry wegen dem Titel, dachte das wäre die ultimate. Ich versuche das nun mal zu klären da ich wie gesagt nicht der guru in sowas bin :(
Bei dir ist ja die shoutbox und der letzte eintrag unten wo auch der scrollbalken ja hin springen soll. Bei mir springt er unter die shoutbox so das ich die shoutbox gar nicht mehr sehe sondern schon die ersten Foren
Ich habe dein Bild mal genommen und es dort mit einer
2makiert. auf die Höhe springt der Anker und ich sehe die Shoutbox nicht mehr.
zu
1 auf dem Bild:
wenn da nun jemand etwas schreibt z.B TEST dann erscheint das erst als neustes Post wenn ein weiterer User z.B Test2 geschrieben hat, also es rutscht erst dann hoch. In der DB ist der Eintrag sofort drinne aber wird irgendwie erst später angezeigt weil die letzte Zeile nicht nach der grösse der Shoutbox zu sehen ist. Doof zu erklären. Ich habe die Grösse auf 250 und 25 angezeigte Zeilen geändert und da muss das irgendwie hängen.

PS: ist deine Shoutbox aktueller als meine? Wenn es da funktioniert würde ich die nehmen müsste dann zwar paar smilies zufügen aber das ist einfach, das kann selbst ich ;)
Das Problem mit der "2" kann ich mir im Moment nicht erkären. Keine Ahnung, warum dieser Effekt bei Dir auftritt. Eigentlich dürfte das nicht passieren, denn der Javascript-Befehl
location.href="#read";
verweist auf den innerhalb des IFRAMES lokalen Anker "read", welcher unmttelbar vor diesem Befehl definiert wird. Echt seltsam.
Zur "1": Ich bin mir nicht sicher, ob ich verstanden habe was Du meinst. Du meinst: Jemand tippt was in die Shoutbox und jemand anderes sieht das, was der erste geschrieben hat, erst später?
Falls es das ist, was Du meinst: Das liegt am Aktualisierungsintervall. Ich glaube, die Grundeinstellung liegt bei 20 oder 30 Sekunden - solange dauert es, bis sich der Inhalt der Shoutbox wieder aktualisiert. Der Inhalt wird auch aktualisiert, wenn man was reinschreibt oder den Refresh-Button drückt.
Du kannst das Aktualisierungsintervall im Admin-Bereich unter "Forum warten" einstellen. Je kleiner Du es einstellt, desto kürzer ist die Verzögerung aber umso größer wird die Server-Last, besonders wenn Du viele Besucher hast.
Ja, meine Shoutbox ist aktueller als Deine. Du kannst die neue Version gern benutzen, sie ist kompatibel zur alten. Der einzige Grund, warum es noch eine Betaversion ist, ist der Umstand, dass ich derzeit nicht in der Lage bin, die geänderte Installationsprozedur hinreichend zu testen.
Deep
zur 2 finde ich keine Lösung
zu 1 da hast du recht wie ich das meine aber es passiert selbst bei einem refresh von 2 Sekunden.
Wärst du mir so lieb deine Shoutbox zu geben? Download finde ich nirgends und ich würde mich freuen da ich es nicht hinbekomme.
Du hast die Shoutbox doch bereits. Und was an meiner neuer ist, befindet sich in sboxDB.php - und den Quelltext hierfür findest Du in diesem Thread.
Falls Du sie komplett neu herunterladen willst, findest Du die Version 1.05beta hier (http://deep23.de.funpic.de/sbox_v1.05.zip) und das deutsche Sprachpaket hier (http://deep23.de.funpic.de/sbox_v1.05_german.zip).
Deep
So nu habe ich mal die 1.05 installiert und erhalte folgenden fehler in der sbox
LainaaDie Anfrage kann nicht beantwortet werden, da im Server ein interner Fehler aufgetreten ist.
Fehlermeldung:
Premature end of script headers: sboxDB.php
den hatte ich in der 1.04 auch und das ändern ging ganz schnell das weiss ich aber ich komme nicht mehr drauf was. Kann mir jemand helfen?
Falls in der 1. Zeile von sboxDB.php
<?
steht, dann änder das in
<?php
Deep
Danke aber das war es leider nicht....das war was ganz sinmples das weiss ich noch aber wie egsagt ich komme da nicht drauf.... >:(
Ahhh, dann war es wahrscheinlich das Ändern der Rechte für sboxDB.php per chmod auf 644?
Deep
GEIL, du bist unschlagbar....genau das war es siehe auch redme der 1.04 Super danke dann schaue ich nun mal ob deins funktioniert
So, shoutbox läuft und der fehler das die letzte zeile erst später kommt ist wech aber leider springt der anker zu tief das ich nur 1cm von der Box lesen kann unten und die seite springt so tief das der header alles fehlt und nur 2 zeilen von der box zu lesen sind. >:( :(
Fehler nun mal massiv eingegrenzt. Mit dem Internet Explorer funktioniert das alles wie du es gemacht hast einwandfrei= neuste Post unten und er springt immer schön brav an den Anker ohne die seite zu verscheiben
Aber mit dem Firefox springt er zwar auch nach unten aber nimmt die ganze seite mit nicht nur das Messege-Fenster.
Kann man das für beide vernünftig machen?
Noch paar witzige Sachen :) tippt mann im Chat 26 ein kommt ne fledermaus als bild bei 30 eine Weltkugel..... Wo zur Hölle kommt denn das her?
lach noch mehr lustige Symbole mit 17 18 20 26 29 30 31 dann ist bis 80 ruhe :D