[2.3] Ähnliche Themen

Dieses Thema im Forum "hacks von rellek" wurde erstellt von rellek, 1 Januar 2005.

  1. rellek

    rellek relativ sensationell Mitarbeiter

    Name: Ähnliche Themen
    Version: 1.0
    Für wBB-Version: 2.3
    Getestet mit: 2.3 Beta 3

    Beschreibung: Mit diesem Hack werden zu jedem Thema 5 ähnliche Themen gesucht. Dazu wird
    die MySQL-Bedingung LIKE verwendet, d.h. wenn die Anzeige "komisch" oder
    unsauber funktioniert, dann ist MySQL schuld.
    Dieser Hack ist im Gegensatz zu den meisten anderen Hacks, die ähnliches
    leisten, sehr sparsam gecodet. Es für die Abfrage nur ein zusätzlicher SQL-
    Query nötig, ein weiterer kommt hinzu, wenn der Permission-Cache nicht gesetzt
    ist, um die Foren ausfindig zu machen, in denen gesucht wird.
    Foren, zu denen man keine Berechtigung hat, werden, genauso wie passwortgeschützte
    Foren, von der Suche nach ähnlichen Themen ausgeschlossen, sodass niemand etwas
    sieht, was er nicht sehen darf.

    MySQL5-Probleme? Hier klicken: Ähnliche Themen
    Ähnliche Themen = Top 5 letzte aktivie Themen? Hier: http://board.rellek.org/325960-post121.html

    Demo: Im Anhang
    Copyright: (c) 2005 by rellek
    Disclaimer: Keine Haftung für irgendwelche Schäden am Board. Fehler sind natürlich nicht ausgeschlossen

    ---

    Bekannte Fehler: -
    Updates und Bugfixes: -
     

    Anhänge:

    Zuletzt bearbeitet: 28 März 2009
  2. David

    David Neuer Benutzer

    Hallo,

    ich habe soeben den Hack "Ähnliche Themen" gemäß Anleitung ( :angle:) installiert, also

    1) Sprachdatei importiert
    2) Thread.php geändert und wieder auf den Server geladen
    3) thread.tpl geändert
    4) Templates importiert und gecached


    Obwohl die Installation recht simpel ist, hab ich dennoch folgendes Problem:

    Bei der Anzeige der Threads erfolgt keine Ausgabe von "ähnlichen Themen".

    Ich habe einmal bewußt Threads mit den Namen Test A, Test B und Test C angelegt. Somit müßten mir ja (eigentlich) diese Themen angezeigt werden.

    Warum die Tabelle gar nicht angezeigt wird, ist mir ein Rätsel... es sei denn, die Ergebnisse lt. MYSQL wären 0 und es würde dann bewusst auf eine Anzeige verzichtet ?

    Wo könnte hier der Fehler liegen.. ?!

    Gruß
    David


    P.S. die Thread-Bewertung hab ich generell deaktiert.. Es funktioniert aber auch nicht nach dem Einschalten....
     
  3. rellek

    rellek relativ sensationell Mitarbeiter

    Wenn keine ähnlichen Themen gefunden wurden, wird die ähnliche Themen-Tabelle nicht angezeigt.

    Um zu testen, ob das soweit funktioniert, solltest du 2 Threads, am besten mit dem gleichen Topic, erstellen...
     
  4. David

    David Neuer Benutzer

    Hallo,

    das hatte ich schon getan... 3 Threads erstellt mit den Topics Test A, Test B und Test C

    Ich hatte den Hack so verstanden, das er mir die jeweils anderen dann anzeigt, wenn es eine "ähnliche Beschreibung" im Topic gibt...

    .. und das wäre ja bei den 3 genannten Thread jeweils der Begriff TEST, oder müßen die IMMER 100% identisch sein.. ? (wobei das in der realität kaum vorkommen dürfte? ! )

    ...aber ich probiere weiter :yes:
     
  5. rellek

    rellek relativ sensationell Mitarbeiter

    ...naja, was eben ähnlich ist - was mysql als ähnlich ansieht...

    ich hats bei yourwbb schon angesprochen, vielleicht werd ich für ne spätere version jedes wort auswerten, wenn es im suchwortindex steht.
     
  6. David

    David Neuer Benutzer

    ich habe gerade mal versucht, 2 Threads mit identischem Topic anzulegen...

    Das funktioniert gar nicht ?(

    Hab es in einem 2.3er und in einem 2.2.1er (ohne den Hack) getestet. Beim Anlegen des 2.Threads wird nach dem Button -Neues Thema- der bereits angelegte Thread angezeigt.

    Dies ist an und für sich löblich :yo , ist mir aber bisher noch nie so aufgefallen ?! :tztz:

    Es gibt hier leider keinen Testthread, um es auch hier mal zu testen...

    Sind ggfs. noch ACP-Funktionen zu aktivieren ?

    Gruß
    David
     
  7. rellek

    rellek relativ sensationell Mitarbeiter

  8. David

    David Neuer Benutzer

    ich habs.... :D

    es funktioniert nur dann, wenn man Threads mit identischen Topics in unterschiedlichen Foren anlegt...dann wird einem auch die Tabelle angezeigt... :yo

    So, jetzt noch aus einem "identischen Topic" ein "ähnliches Topic" ... dann wärs perfekt :D

    Gruß
    David
     
  9. rellek

    rellek relativ sensationell Mitarbeiter

    nene, das klappt auch in gleichen foren - kuck z.b. mal unter dem thread - die threads sind alle im gleichen forum.
     
  10. David

    David Neuer Benutzer

    jepp, hab es hier auch gerade getestet...

    Dann hängt es wohl mit einem anderen Hack zusammen... Seltsam ist nur, das es auf 2 unterschiedlichen Boards mit unterschiedlichen Versionen so ist...

    Gemeinsamer Nenner wäre u.a. "wer hat den Thread gelesen" ? :D

    aber ich kämpf mich mal durch :yes:

    Gruß
    David

    P.S. : die beiden Testthreads kann man wieder löschen 8)

    P.S.2 : Vielen Dank für die prompten Antworten :yo
     
  11. rellek

    rellek relativ sensationell Mitarbeiter

    @ PS1: die können auch bleiben, wenn jemand zu blöd zum einbauen ist, dann kann ich wenigstens sagen, kuck mal da *g*

    @ PS2: Is doch kein Thema.
     
  12. David

    David Neuer Benutzer

    naja, zu blöd für diesen Hack war ich ja nicht :D

    Er funktioniert ja ... Da Woltlab soeben die Final 2.3er freigegeben hat, werde ich es nochmal mit einer jungfräuchlichen newthread.php versuchen :D

    Gruß
    David
     
  13. conker

    conker johnny rotten<br />(Boardberater)

    ist der hack auch für das wbblite in planung?
     
  14. rellek

    rellek relativ sensationell Mitarbeiter

    Ich hab noch keinen Weg gefunden, den man ohne Weiteres verantworten kann, um die Foren ausfindig zu machen, zu denen man Zutritt hat.
     
  15. David

    David Neuer Benutzer

    Nachdem ich die aktuelle 2.3 Forensoftware installiert hatte, konnte ich anschließend trotzdem NICHT mehrfach einen Beitrag mit identischem Topic in einem Thread erfassen. Ab dem 2.Versuch erfolgte automatisch die Anzeige des bereits erfassten Beitrages...

    Erst nachdem ich in der newthread.php den nachfolgenden Programmcode ausdokumentiert hatte, funktionierte es.

    Code:
    			
    			/* thread already exists? */
    //			$result = $db->query_first("SELECT threadid FROM bb".$n."_threads WHERE boardid = '".$boardid."' AND starterid='$wbbuserdata[userid]' AND starter='".addslashes($wbbuserdata['username'])."' AND topic='".addslashes($topic)."' AND starttime>='".(time() - $dpvtime)."'", 1);
    //			if ($result['threadid']) {
    //				header("Location: thread.php?threadid=".$result['threadid'].$SID_ARG_2ND_UN);
    //				exit();	
    //			}
    Liegt also eindeutig an der Forensoftware :D

    Gruß
    David
     
  16. rellek

    rellek relativ sensationell Mitarbeiter

    das kannste auch ausstellen ohne auskommentieren ... acp -> flood control glaube
     
  17. rellek

    rellek relativ sensationell Mitarbeiter

    Wer am Beta-Test der neuen Version teilnehmen möchte, der ersetzt bitte den längeren Abschnitt zwischen den beiden
    Code:
    /* Ähnliche Themen */
    und
    Code:
    /* Ähnliche Themen Ende */
    mit:
    Code:
    /* Ähnlich Themen */
    function GetAccessableForums() {
    	global $db, $n, $wbbuserdata, $boardcache;
    	
    	if (!isset($boardcache) || !is_array($boardcache)) $boardcache = array();
    	$result = $db->query("SELECT boardid,boardorder,parentid,parentlist FROM bb".$n."_boards ORDER BY parentid ASC, boardorder ASC");
    	while ($row = $db->fetch_array($result)) {
    		$boardcache[$row['parentid']][$row['boardorder']][$row['boardid']] = $row;
    	}
    
    	$boardpermissions = getPermissions();
    	$boardids = '';
    	foreach ($boardcache as $key => $val) {
    		foreach ($val as $key2 => $val2) {
    			foreach ($val2 as $row) if ((!isset($boardpermissions[$row['boardid']]['can_view_board']) || $boardpermissions[$row['boardid']]['can_view_board'] != 0) && (!isset($boardpermissions[$row['boardid']]['can_enter_board']) || $boardpermissions[$row['boardid']]['can_enter_board'] != 0) && (!isset($boardpermissions[$row['boardid']]['can_read_thread']) || $boardpermissions[$row['boardid']]['can_read_thread'] != 0)) $boardids .= ",".$row['boardid'];
    		}	
    	}
    	return $boardids;
    }
    $ttopic = str_replace("."," ",$threadtopic);
    $ttopic = str_replace("!"," ",$ttopic);
    $ttopic = str_replace("?"," ",$ttopic);
    $ttopic = str_replace("/"," ",$ttopic);
    $ttopic = str_replace("§"," ",$ttopic);
    $ttopic = str_replace("$"," ",$ttopic);
    $ttopic = str_replace("%"," ",$ttopic);
    $ttopic = str_replace("&"," ",$ttopic);
    $ttopic = str_replace("("," ",$ttopic);
    $ttopic = str_replace(")"," ",$ttopic);
    $ttopic = str_replace("="," ",$ttopic);
    $ttopic = str_replace("\\"," ",$ttopic);
    $ttopic = str_replace("?"," ",$ttopic);
    $ttopic = explode(" ",$ttopic);
    $badwordlist = explode("\n",$badsearchwords);
    $y = count($ttopic);
    if($y>1) {
      foreach($ttopic as $tt) {
      	$x++;
      	if(!in_array($tt, $badwordlist)) {
      		if($x>1 && (strlen($tt)>$minwordlength && strlen($tt)<$maxwordlength)) $like_string .= " OR t.topic LIKE ";
      		if(strlen($tt)>$minwordlength && strlen($tt)<$maxwordlength) $like_string .= "'%".$tt."%'";
      }
    }
    } else $like_string = "'%$threadtopic%'";
    if($like_string) {
    	$similar = $db->query("SELECT
                                t.threadid, t.boardid, x.title, x.boardid, t.prefix, t.topic, t.starttime, t.starterid, t.starter, t.lastposttime, t.lastposterid, t.lastposter, t.replycount, t.views, t.attachments, t.closed, t.important, t.pollid
                                FROM bb".$n."_threads t, bb".$n."_boards x
                                LEFT JOIN bb".$n."_boards b ON (t.boardid=b.boardid)
                                WHERE t.visible='1'
                                AND t.closed <> 3
                                AND t.threadid <> $threadid
                                AND b.password=''
                                AND t.boardid=x.boardid
                                AND t.boardid IN (0".GetAccessableForums().")
                                AND (t.topic LIKE ".$like_string.")
                                ORDER BY t.lastposttime DESC
    LIMIT 0, 5;");
    	}
    if($like_string && $db->num_rows($similar)) {
    	$i = "0";
    	while ($row = $db->fetch_array($similar)) {
    		$i++;
    		$tdclass = getone($i, "tablea", "tableb");
    		$started = formatdate($wbbuserdata['dateformat'], $row['starttime'],1);
    		$started .= " <span class=\"time\">".formatdate($wbbuserdata['timeformat'], $row['starttime'])."</span>";
    		$lastreply = formatdate($wbbuserdata['dateformat'], $row['lastposttime'],1);
    		$lastreply .= " <span class=\"time\">".formatdate($wbbuserdata['timeformat'], $row['lastposttime'])."</span>";
    		if ($row['replycount'] >= 1000) $row['replycount'] = number_format($row['replycount'], 0, "", $lang->get("LANG_GLOBAL_THOUSANDS_SEP"));
    		if ($row['views'] >= 1000) $row['views'] = number_format($row['views'], 0, "", $lang->get("LANG_GLOBAL_THOUSANDS_SEP"));
    		if (strlen($row['topic']) > 60) $row['topic'] = substr($row['topic'], 0, 54).' [...]';
    		eval("\$similar_thread_bit .= \"".$tpl->get("thread_similarthread_bit")."\";");
    	}
    	eval("\$similar_thread = \"".$tpl->get("thread_similarthread")."\";");
    }
    /* Ähnliche Themen Ende */
    Auftretende Bugs bitte melden !
     
  18. Gucky

    Gucky [inaktiv]

    Hi, also wenn ich das austausche bekomm ich nur folgenden Fehler:

    Liegts an mir???

    EDIT:
    Nööö, nicht an mir sondern an Sonderzeichen im Topic ;)
    Bei "normalen" Themen hab ich keinen Fehler :)
     
  19. rellek

    rellek relativ sensationell Mitarbeiter

    Wie heißt der Topic?

    Fix dazu kommt gleich.
     
  20. rellek

    rellek relativ sensationell Mitarbeiter

    Ersetzt den langen Abschnitt bitte nochmal mit:

    Code:
    /* Ähnlich Themen */
    function GetAccessableForums() {
    	global $db, $n, $wbbuserdata, $boardcache;
    	
    	if (!isset($boardcache) || !is_array($boardcache)) $boardcache = array();
    	$result = $db->query("SELECT boardid,boardorder,parentid,parentlist FROM bb".$n."_boards ORDER BY parentid ASC, boardorder ASC");
    	while ($row = $db->fetch_array($result)) {
    		$boardcache[$row['parentid']][$row['boardorder']][$row['boardid']] = $row;
    	}
    
    	$boardpermissions = getPermissions();
    	$boardids = '';
    	foreach ($boardcache as $key => $val) {
    		foreach ($val as $key2 => $val2) {
    			foreach ($val2 as $row) if ((!isset($boardpermissions[$row['boardid']]['can_view_board']) || $boardpermissions[$row['boardid']]['can_view_board'] != 0) && (!isset($boardpermissions[$row['boardid']]['can_enter_board']) || $boardpermissions[$row['boardid']]['can_enter_board'] != 0) && (!isset($boardpermissions[$row['boardid']]['can_read_thread']) || $boardpermissions[$row['boardid']]['can_read_thread'] != 0)) $boardids .= ",".$row['boardid'];
    		}	
    	}
    	return $boardids;
    }
    $ttopic = str_replace("."," ",$threadtopic);
    $ttopic = str_replace("!"," ",$ttopic);
    $ttopic = str_replace("?"," ",$ttopic);
    $ttopic = str_replace("/"," ",$ttopic);
    $ttopic = str_replace("§"," ",$ttopic);
    $ttopic = str_replace("$"," ",$ttopic);
    $ttopic = str_replace("%"," ",$ttopic);
    $ttopic = str_replace("&"," ",$ttopic);
    $ttopic = str_replace("("," ",$ttopic);
    $ttopic = str_replace(")"," ",$ttopic);
    $ttopic = str_replace("="," ",$ttopic);
    $ttopic = str_replace("\\"," ",$ttopic);
    $ttopic = str_replace("?"," ",$ttopic);
    $ttopic = str_replace("-"," ",$ttopic);
    $ttopic = str_replace("*"," ",$ttopic);
    $ttopic = str_replace("+"," ",$ttopic);
    $ttopic = str_replace("#"," ",$ttopic);
    $ttopic = str_replace("_"," ",$ttopic);
    $ttopic = str_replace(","," ",$ttopic);
    $ttopic = str_replace(":"," ",$ttopic);
    $ttopic = str_replace(";"," ",$ttopic);
    $ttopic = str_replace("<"," ",$ttopic);
    $ttopic = str_replace(">"," ",$ttopic);
    $ttopic = str_replace("|"," ",$ttopic);
    $ttopic = explode(" ",$ttopic);
    $badwordlist = explode("\n",$badsearchwords);
    $y = count($ttopic);
    if($y>1) {
      foreach($ttopic as $tt) {
      	if(!in_array($tt, $badwordlist)) {
      		if(strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength) $x++;
      		if($x>1 && (strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength)) $like_string .= " OR t.topic LIKE ";
      		if(strlen($tt)>=$minwordlength && strlen($tt)<=$maxwordlength) $like_string .= "'%".$tt."%'";
      }
    }
    } else $like_string = "'%$threadtopic%'";
    if($like_string) {
    	$similar = $db->query("SELECT
    											t.threadid, t.boardid, x.title, x.boardid, t.prefix, t.topic, t.starttime, t.starterid, t.starter, t.lastposttime, t.lastposterid, t.lastposter, t.replycount, t.views, t.attachments, t.closed, t.important, t.pollid
    											FROM bb".$n."_threads t, bb".$n."_boards x
    											LEFT JOIN bb".$n."_boards b ON (t.boardid=b.boardid)
    											WHERE t.visible='1'
    											AND t.closed <> 3
    											AND t.threadid <> $threadid
    											AND b.password=''
    											AND t.boardid=x.boardid
    											AND t.boardid IN (0".GetAccessableForums().")
    											AND (t.topic LIKE ".$like_string.")
    											ORDER BY t.lastposttime DESC
    											LIMIT 0, 5;");
    	}
    if($like_string && $db->num_rows($similar)) {
    	$i = "0";
    	while ($row = $db->fetch_array($similar)) {
    		$i++;
    		$tdclass = getone($i, "tablea", "tableb");
    		$started = formatdate($wbbuserdata['dateformat'], $row['starttime'],1);
    		$started .= " <span class=\"time\">".formatdate($wbbuserdata['timeformat'], $row['starttime'])."</span>";
    		$lastreply = formatdate($wbbuserdata['dateformat'], $row['lastposttime'],1);
    		$lastreply .= " <span class=\"time\">".formatdate($wbbuserdata['timeformat'], $row['lastposttime'])."</span>";
    		if ($row['replycount'] >= 1000) $row['replycount'] = number_format($row['replycount'], 0, "", $lang->get("LANG_GLOBAL_THOUSANDS_SEP"));
    		if ($row['views'] >= 1000) $row['views'] = number_format($row['views'], 0, "", $lang->get("LANG_GLOBAL_THOUSANDS_SEP"));
    		if (strlen($row['topic']) > 60) $row['topic'] = substr($row['topic'], 0, 54).' [...]';
    		eval("\$similar_thread_bit .= \"".$tpl->get("thread_similarthread_bit")."\";");
    	}
    	eval("\$similar_thread = \"".$tpl->get("thread_similarthread")."\";");
    }
    /* Ähnliche Themen Ende */
     

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies, um Inhalte zu personalisieren, diese deinem Erleben anzupassen und dich nach der Registrierung angemeldet zu halten.
    Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden