1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

Themen Anzahl

Dieses Thema im Forum "Forum Support" wurde erstellt von alexrider15, 02.02.14.

  1. alexrider15
    Offline

    alexrider15 Vip

    Mir ist eben grade aufgefallen das die Angegebene anzahl der Neuen Themen und die wahre Anzahl nicht über einstimmen.
    [​IMG]

    LG Marco
     
  2. hellboyPS
    Offline

    hellboyPS Owner becrafted Team

  3. mottenkopp
    Offline

    mottenkopp becrafted Team Vip Governor

    Das buggt manchmal rum .
     
  4. Heisenberg_81
    Offline

    Heisenberg_81 Crafter

    Hab ich auch schon gesehen - meine Vermutung war hier bislang das auch Themen gezählt werden, zu denen wir keinen Zugriff haben
     
  5. iQodyo
    Offline

    iQodyo becrafted Team Vip Governor

    Ich gehe schwer davon aus, dass Deine Vermutung zutrifft ;)
     
    elz000r gefällt dies.
  6. elz000r
    Offline

    elz000r Vip

    "Foren als gelesen markieren" regelt ;-)
     
    Rounira gefällt dies.
  7. hellboyPS
    Offline

    hellboyPS Owner becrafted Team

    me2

    Hier die SQL Anfrage, die das tut, bei der mir bisher die Lust vergeht, diese (nochmals) zu analysieren und abzuändern...
    Code:
    // Crancraft - Modded to only show number of unread THREADS not POSTS:	  
    return $this->_getDb()->fetchOne('
    SELECT count(*) FROM (SELECT DISTINCT thread_id FROM (
    SELECT post.thread_id
    FROM xf_post AS post
    INNER JOIN xf_thread AS thread ON
    (post.thread_id = thread.thread_id AND thread.node_id IN (' . $this->_getDb()->quote($forumIds) . '))
    INNER JOIN xf_forum AS forum ON
    (forum.node_id = thread.node_id AND forum.find_new = 1)
    LEFT JOIN xf_thread_read AS thread_read ON
    (thread_read.thread_id = thread.thread_id AND thread_read.user_id = ?)
    LEFT JOIN xf_forum_read AS forum_read ON
    (forum_read.node_id = thread.node_id AND forum_read.user_id = ?)
    WHERE post.post_date > ?
    AND post.message_state = \'visible\'
    AND post.post_date > GREATEST(
    IF (thread_read.thread_read_date IS NULL, 0, thread_read.thread_read_date),
    IF (forum_read.forum_read_date IS NULL, 0, forum_read.forum_read_date)
    ) ) AS restable) AS restable2
    ', array($userId, $userId, $autoReadDate));
    
    
    Man müsste wohl davon ausgehen, dass $froumIds schon die richtigen Berechtigungen miteinbezieht. Scheint aber nicht so zu sein?!
     
  8. Rounira
    Offline

    Rounira Vip Governor

    und dennoch passiert das vieeel zu oft :p außer du wirst mein persönlicher knopfdrücker dann will ich nichts gesagt haben :)
     
  9. Heisenberg_81
    Offline

    Heisenberg_81 Crafter

    Das sieht soweit gut aus, da ich hier auch davon ausgehen würde das $forumIds bereits gefiltert ist.

    Wie sind hier die Unterhaltungen & das Ticketsystem gelöst? Sind das Foren, auf denen ich Zugriff habe, aber nur auf bestimme Threads? Falls ja wäre das wohl die Ursache des Problems
     
  10. hellboyPS
    Offline

    hellboyPS Owner becrafted Team

    Jo, Ticketsystem dachte ich mir auch schon. Wäre ja mal schwer zu lösen dann.
     
  11. raah
    Offline

    raah Moderator becrafted Team Vip

    Oder das Team-Forum wird mit gezählt.
     
  12. elz000r
    Offline

    elz000r Vip

    Captain Obvious :-D, leg dich wieder hin raah :D
     
    Gedd88 gefällt dies.
  13. Heisenberg_81
    Offline

    Heisenberg_81 Crafter

    Die Unterhaltungen kann man zumindest mal ausschliessen, soweit ich das sehen kann gehen diese über die xf_conversation_*-Tabellen - darf ich fragen was für ein AddOn für das Ticketsystem eingesetzt wird?
     
  14. Smaragd_
    Offline

    Smaragd_ Admin becrafted Team

    Nachdem ich meist auf dem neuesten Stand der frischen Beiträge bin, tritt bei mir das Problem nur dann auf, wenn Beiträge, die ich noch nicht gelesen habe, gelöscht wurden.
    Und ich kann euch sagen, es werden mehr Beiträge gelöscht, als ihr euch vorstellen könnt!!!
     
  15. hellboyPS
    Offline

    hellboyPS Owner becrafted Team

    Keins. Ist ein Forum, bei dem
    man nur die eigenen Beiträge sieht. Das ist wohl auch der Fehler, schätze ich.
     
  16. Heisenberg_81
    Offline

    Heisenberg_81 Crafter

    alles klar, das würde also bedeuten, das man einerseits die foren nicht mitzählen darf, bei denen man nur die eingenen threads sehen darf (je nach Gruppen ID, hier als beispiel 1234):
    Code:
    SELECT distinct t.thread_id
    FROM xf_permission_entry_content pec INNER JOIN
    	xf_node n ON n.node_id = pec.content_id AND n.node_type_id = 'Forum' INNER JOIN
    	xf_thread t ON t.node_id = n.node_id
    WHERE pec.permission_id = 'viewOthers' AND pec.permission_value = 'deny' AND pec.user_group_id=1234 AND pec.content_type = 'node'
    aber aus diesen Threads wiederum jene zulassen muss, bei welchen man den ersten Post erstellt hat (benötigt User Id, hier 12345):
    Code:
    SELECT distinct t.thread_id
    FROM xf_post p INNER JOIN
    	xf_thread t ON p.thread_id = t.thread_id
    WHERE t.user_id = 12345
    also gesamthaft etwa so (ungetestet):
    Code:
    return $this->_getDb()->fetchOne('
    SELECT count(*)
    FROM (
    	SELECT DISTINCT thread_id
    	FROM (
    		SELECT post.thread_id
    		FROM xf_post AS post INNER JOIN
    			xf_thread AS thread ON (post.thread_id = thread.thread_id AND thread.node_id IN (' . $this->_getDb()->quote($forumIds) . ')) INNER JOIN
    			xf_forum AS forum ON (forum.node_id = thread.node_id AND forum.find_new = 1) LEFT JOIN
    			xf_thread_read AS thread_read ON (thread_read.thread_id = thread.thread_id AND thread_read.user_id = ?) LEFT JOIN
    			xf_forum_read AS forum_read ON (forum_read.node_id = thread.node_id AND forum_read.user_id = ?)
    		WHERE post.post_date > ? AND
    			post.message_state = \'visible\' AND
    			post.post_date > GREATEST(
    				IF (thread_read.thread_read_date IS NULL, 0, thread_read.thread_read_date),
    				IF (forum_read.forum_read_date IS NULL, 0, forum_read.forum_read_date)
    			) AND
    			(
    				post.thread_id NOT IN (
    					SELECT DISTINCT t.thread_id
    					FROM xf_permission_entry_content pec INNER JOIN
    						xf_node n ON n.node_id = pec.content_id AND n.node_type_id = 'Forum' INNER JOIN
    						xf_thread t ON t.node_id = n.node_id
    					WHERE pec.permission_id = 'viewOthers' AND pec.permission_value = 'deny' AND pec.user_group_id=? AND pec.content_type = 'node'
    				) OR
    				post.thread_id IN (
    					SELECT DISTINCT t.thread_id
    					FROM xf_post p INNER JOIN
    						xf_thread t ON p.thread_id = t.thread_id
    					WHERE t.user_id = ?
    				)
    
    	) AS restable
    ) AS restable2
    ', array($userId, $userId, $autoReadDate, $groupId, $userId));
    
     
    hellboyPS gefällt dies.
  17. hellboyPS
    Offline

    hellboyPS Owner becrafted Team

    Schon ganz gut. Allerdings ist die $groupId nicht einzigartig - ein User kann mehrere, oder keine Gruppen haben. Von dem XenForo_Visitor Objekt, von dem die $userId kommt, krieg ich das auch nicht gesagt (der kennt nur Methoden wie isMemberOf($groupId) usw.).
    Das hier soll wohl sowas wie eine Dokumentation zu dem Objekt sein (konnte es nur über Text-Version des Googlecaches aufrufen...): http://vxf.vn/docs/classes/XenForo_Visitor.html
    Ist also garnicht mal so einfach rauszufinden, welche Foren das sind.
    Andererseits hindert uns nichts daran, die ForenID des Ticketsystems hardzucoden... dazu sollte man aber vorher mal testen, wie es sich mit den Teamforen etc. verhält.
     
  18. Heisenberg_81
    Offline

    Heisenberg_81 Crafter

    stimmt, $groupId ist hier das Problem - besonders da verschiede Gruppen unterschiedliche Rechte haben können, diese entsprechend (bei Benutzer mit mehreren Gruppen) korrekt berücksichtigt werden müssen.

    da mich das ganze aber trozdem nicht in Ruhe lässt - hier ein anderer Ansatz ;)

    Code:
    //User Objekt anhand $userId erstellen
    $user = XenForo_Visitor::setup($userId);
    
    //erst mal alle Foren auslesen, bei denen man nur eigenen Threads sehen kann
    $specialNodes = $this->_getDb()->fetchAll('
    	SELECT DISTINCT n.node_id
    	FROM xf_permission_entry_content pec INNER JOIN
    		xf_node n ON n.node_id = pec.content_id AND n.node_type_id = \'Forum\'
    
    	WHERE pec.permission_id = \'viewOthers\' AND pec.permission_value IN (\'deny\',\'reset\') AND pec.content_type = \'node\' AND n.node_id IN ('.$this->_getDb()->quote($forumIds).')
    ');
    
    $restrictedNodes = array();
    
    //jeweils für den User die Rechte in den betroffenen Foren überprüfen
    foreach ($specialNodes as $specialNode) {
    	$permissions = $user->getNodePermissions($specialNode['node_id']);
    	if ($permissions['viewOthers'] === false) {
    		$restrictedNodes[] = $specialNode['node_id'];
    	}
    }
    
    //Query-Parameter dynamisch machen, da je nach dem eine unterscheidliche Anzahl mitgegeben werden muss
    $queryParams = array($userId, $userId, $autoReadDate);
    $additionalWhere ='';
    if (count($restrictedNodes)>0) {
    	//falls Foren gefunden werden, in der der aktuelle Benutzer nur selbst erstelle Threads lesen kann, eine zusätzliche Bedinung festlegen...
    	$additionalWhere = ' AND
    			(
    				post.thread_id NOT IN ('.implode(',',$restrictedNodes).') OR
    				post.thread_id IN (
    					SELECT DISTINCT t.thread_id
    					FROM xf_post p INNER JOIN
    						xf_thread t ON p.thread_id = t.thread_id
    					WHERE t.user_id = ?
    				)
    			)
    ';
    	//...und den zusätzlichen Query-Parameter setzten
    	$queryParams[] = $userId;
    }
    
    //Nun die übliche Abfrage, je nach Fall mit zusätzlicher Bedingung und zusätzlichem Query-Parameter
    return $this->_getDb()->fetchOne('
    SELECT count(*)
    FROM (
    	SELECT DISTINCT thread_id
    	FROM (
    		SELECT post.thread_id
    		FROM xf_post AS post INNER JOIN
    			xf_thread AS thread ON (post.thread_id = thread.thread_id AND thread.node_id IN (' . $this->_getDb()->quote($forumIds) . ')) INNER JOIN
    			xf_forum AS forum ON (forum.node_id = thread.node_id AND forum.find_new = 1) LEFT JOIN
    			xf_thread_read AS thread_read ON (thread_read.thread_id = thread.thread_id AND thread_read.user_id = ?) LEFT JOIN
    			xf_forum_read AS forum_read ON (forum_read.node_id = thread.node_id AND forum_read.user_id = ?)
    		WHERE post.post_date > ? AND
    			post.message_state = \'visible\' AND
    			post.post_date > GREATEST(
    				IF (thread_read.thread_read_date IS NULL, 0, thread_read.thread_read_date),
    				IF (forum_read.forum_read_date IS NULL, 0, forum_read.forum_read_date)
    			) ' . $additionalWhere . '
    	) AS restable
    ) AS restable2
    ', $queryParams);
    
     
  19. alexrider15
    Offline

    alexrider15 Vip

    Habt ihr was gemacht
    [​IMG]

    Lg marco
     
  20. Mi_Mue
    Offline

    Mi_Mue Governor

    Vielleicht wars bei Dir Zufall aber bei mir siehts immer noch so aus ;) aber geht ja mit Foren als gelesen markieren. wie oben beschrieben.
    Unbenannt.jpg

    ist verwirrend aber nicht weiter problematisch.
     

Die Seite empfehlen