Mir ist eben grade aufgefallen das die Angegebene anzahl der Neuen Themen und die wahre Anzahl nicht über einstimmen. LG Marco
Hab ich auch schon gesehen - meine Vermutung war hier bislang das auch Themen gezählt werden, zu denen wir keinen Zugriff haben
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?!
und dennoch passiert das vieeel zu oft außer du wirst mein persönlicher knopfdrücker dann will ich nichts gesagt haben
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
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?
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!!!
Keins. Ist ein Forum, bei dem man nur die eigenen Beiträge sieht. Das ist wohl auch der Fehler, schätze ich.
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));
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.
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);
Vielleicht wars bei Dir Zufall aber bei mir siehts immer noch so aus aber geht ja mit Foren als gelesen markieren. wie oben beschrieben. ist verwirrend aber nicht weiter problematisch.