source: trunk/modules/ViewTopic.class.php @ 22

Last change on this file since 22 was 22, checked in by julian, 12 years ago
  • topics.topicStatus => topics.topicIsClosed (also removed useless constants)
  • Creating pms works again
  • Continued refactoring (EditTopic?)
File size: 18.0 KB
Line 
1<?php
2
3class ViewTopic extends ModuleTemplate {
4    protected $requiredModules = array(
5        'Auth',
6        'BBCode',
7        'Cache',
8        'Constants',
9        'Config',
10        'DB',
11        'Language',
12        'Navbar',
13        'PageParts',
14        'Template'
15    );
16
17    public function executeMe() {
18        $this->modules['Language']->addFile('ViewTopic');
19
20        $topicID = isset($_GET['topicID']) ? $_GET['topicID'] : 0; // ID des Themas
21        $postID = isset($_GET['postID']) ? $_GET['postID'] : 0; // ID des Beitrags
22        $page = isset($_GET['page']) ? $_GET['page'] : 1; // Seite
23
24        unset($topicPostsCounter);
25
26        // Thema und Seite eventuell ueber Beitrags-ID bestimmen
27        if($topicID == 0) {
28            $this->modules['DB']->query("SELECT topicID FROM ".TBLPFX."posts WHERE postID='$postID'"); // Laedt eventuell die ID des Themas
29            if($this->modules['DB']->getAffectedRows() != 1) die('Kann Beitragsdaten nicht laden/Beitrag existiert nicht!'); // Falls nicht Meldung ausgeben
30            list($topicID) = $this->modules['DB']->fetchArray(); // ID des Themas verfuegbar machen
31
32            $this->modules['DB']->query("SELECT postID FROM ".TBLPFX."posts WHERE topicID='$topicID' ORDER BY postTimestamp"); // Die IDs aller Beitraege des Themas laden
33            $postIDs = $this->modules['DB']->raw2FVArray(); // DB-Daten in Array umwandeln
34            $topicPostsCounter = count($postIDs); // Anzahl der IDs (Beitraege)
35
36            $page = 1; // Standardseite ist Seite 1
37            for($i = 0; $i < $topicPostsCounter; $i++) {
38                if($postIDs[$i] == $postID) break; // Falls die gewuenschte ID gefunden wurde kann die Schleife beendet werden (damit ist die Seite gefunden)
39                if(($i + 1) % $this->modules['Config']->getValue('posts_per_page') == 0) $page++; // Falls die Anzahl der Beitraege pro Seite erreicht wurde, naechste Seite angeben
40            }
41        }
42
43        // Thema- und Forumdaten laden
44        if(!$topicData = Functions::getTopicData($topicID)) die('Kann Daten nicht laden: Thema'); // Themendaten laden
45        if($topicData['topicMovedID'] != 0 && ($topicData = Functions::getTopicData($topicData['topicMovedID'])) == FALSE) die('Thema wurde verschoben/kann neues Thema nicht laden!'); // Falls das Thema verschoben wurde und die neuen Daten nicht gefunden werden koennen
46        elseif($topicData['forumID'] != 0 && ($forumData = Functions::getForumData($topicData['forumID'])) == FALSE) die('Kann Daten nicht laden: Forum');
47
48        $topicID = &$topicData['topicID']; // ID des Themas, ist wichtig, falls es ein verschobenes Thema ist
49        $forumID = &$topicData['forumID']; // ID des Forums
50
51
52        // User-IDs aller Moderatoren laden
53        $forumModIDs = $this->_loadForumModIDs($forumID);
54
55
56        // Authentifizierung
57        $authData = $this->_authenticateUser($forumData);
58
59
60        //update_topic_cookie($forum_id,$topicID,time());
61
62        if(!isset($_SESSION['topicViews'][$topicID])) { // Falls dieses Thema in dieser Session noch nicht besucht wurde...
63            $this->modules['DB']->query("UPDATE ".TBLPFX."topics SET topicViewsCounter=topicViewsCounter+1 WHERE topicID='$topicID'"); // ...Anzahl der Views um 1 erhoehen...
64            $_SESSION['topicViews'][$topicID] = TRUE; // ...Und Thema in dieser Session vermerken
65        }
66
67
68        //
69        // Seitenanzeige erstellen
70        //
71        if(!isset($topicPostsCounter)) $topicPostsCounter = Functions::getPostsCounter($topicID); // Anzahl der Beitraege bestimmen (kann eventuell aus schon vorhandenen Daten geschehen)
72        $pageListing = Functions::createPageListing($topicPostsCounter,$this->modules['Config']->getValue('posts_per_page'),$page,"<a href=\"".INDEXFILE."?action=ViewTopic&amp;topicID=$topicID&amp;page=%1\$s&amp;".MYSID."\">%2\$s</a>"); // Die Seitenansicht erstellen
73        $start = $page*$this->modules['Config']->getValue('posts_per_page')-$this->modules['Config']->getValue('posts_per_page'); // Startbeitrag
74
75
76        //
77        // Die Moderatorenwerkzeuge bestimmen
78        //
79        $modTools = array(); // Beinhaltet spaeter pro Element eine Moderationsoption
80        if($this->modules['Auth']->getValue('userIsAdmin') == 1 || $this->modules['Auth']->getValue('userIsSuperMod') == 1 || $topicData['posterID'] != 0 && USERID == $topicData['posterID'] && $authData['authEditPosts'] == 1 || $authData['authIsMod'] == 1) $modTools[] = "<a href=\"".INDEXFILE."?action=EditTopic&amp;mode=Edit&amp;topicID=$topicID&amp;".MYSID."\">".$this->modules['Language']->getString('Edit_topic').'</a>'; // Thema bearbeiten (duerfen auch User, die das Thema erstellt haben)
81        if($this->modules['Auth']->getValue('userIsAdmin') == 1 || $this->modules['Auth']->getValue('userIsSupermod') == 1 || $authData['authIsMod'] == 1) {
82            if($forumID != 0) $modTools[] = "<a href=\"".INDEXFILE."?action=edittopic&amp;mode=move&amp;topic_id=$topicID&amp;".MYSID."\">".$this->modules['Language']->getString('Move_topic').'</a>';
83            $modTools[] = "<a href=\"".INDEXFILE."?action=EditTopic&amp;mode=Delete&amp;topicID=$topicID&amp;".MYSID."\">".$this->modules['Language']->getString('Delete_topic').'</a>';
84
85            $temp = ($topicData['topicIsPinned'] == 1) ? $this->modules['Language']->getString('Mark_topic_unimportant') : $this->modules['Language']->getString('Mark_topic_important');
86            $modTools[] = '<a href="'.INDEXFILE."?action=EditTopic&amp;mode=Pinn&amp;topicID=$topicID&amp;".MYSID.'">'.$temp.'</a>';
87
88            $temp = ($topicData['topicIsClosed'] == 1) ? $this->modules['Language']->getString('Open_topic') : $this->modules['Language']->getString('Close_topic');
89            $modTools[] = "<a href=\"".INDEXFILE."?action=EditTopic&amp;mode=OpenClose&amp;topicID=$topicID&amp;".MYSID."\">".$temp.'</a>';
90        }
91        $modTools = implode(' | ',$modTools);
92
93
94        //
95        // Die Umfrage
96        //
97        $pollData = FALSE;
98        if($topicData['topicHasPoll'] == 1) { // Falls fuer das Thema eine Umfrage angegeben wurde...
99            $this->modules['DB']->query("SELECT * FROM ".TBLPFX."polls WHERE topicID='$topicID' LIMIT 1"); // ...versuchen die Daten der Umfrage zu laden...
100            if($pollData = $this->modules['DB']->fetchArray()) { // ...und falls diese existiert...
101                if($this->modules['Auth']->isLoggedIn() == 1) { // Falls User eingeloggt ist
102                    $this->modules['DB']->query("SELECT VoterID FROM ".TBLPFX."polls_votes WHERE PollID='".$pollData['PollID']."' AND VoterID='".USERID."'"); // Ueberpruefen, ob User shcon abgestimmt hat...
103                    if($this->modules['DB']->getAffectedRows() == 0) // ...falls nicht...
104                        $poll_tpl = new Template($tEMPLATE_PATH.'/'.$tCONFIG['templates']['viewtopic_poll_voting']); // ...Abstimmungsboxtemplate laden...
105                    else { // ...andernfalls...
106                        $info_text = $this->modules['Language']->getString('poll_already_voted_info'); // ...und Infotext fuer "schon abgestimmt" erzeugen
107                    }
108                }
109                else { // Falls User nicht eingeloggt ist...
110                    $poll_tpl = new Template($tEMPLATE_PATH.'/'.$tCONFIG['templates']['viewtopic_poll_results']); // ...Ergebnisboxtemplate laden...
111                    $info_text = $this->modules['Language']->getString('poll_not_logged_in_info'); // ...und Infotext fuer "nicht eingeloggt" erzeugen
112                }
113
114                $this->modules['DB']->query("SELECT OptionID,OptionTitle,OptionVotesCounter FROM ".TBLPFX."polls_options WHERE topicID='$topicID' ORDER BY OptionID"); // Die Auswahlmoeglichkeiten fuer die Umfrage laden
115                while($akt_option = $this->modules['DB']->fetchArray()) {
116                    $akt_fraction = ($poll_data['poll_votes'] == 0) ? 0 : round($akt_option['option_votes']/$poll_data['poll_votes'],2); // Der Anteil an Stimmen (0,xx)
117                    $akt_percent = $akt_fraction*100; // Stimmenanteil in Prozent
118                    $akt_votes = ($akt_option['option_votes'] == 1) ? $this->modules['Language']->getString('one_vote') : sprintf($this->modules['Language']->getString('x_votes'),$akt_option['option_votes']); // Anzahl der Stimmen
119                    $akt_checked = ($akt_option['option_id'] == 1) ? ' checked="checked"' : ''; // checked="checked" fuer den ersten Radiobutton erzeugen (damit auf jeden Fall was ausgewaehlt ist)
120                }
121            }
122        }
123
124
125        // Smilies laden
126        $smiliesData = array();
127        if($forumData['forumEnableSmilies'] == 1 || $this->Modules['Config']->getValue('enable_sig') == 1 && $this->Modules['Config']->getValue('allow_sig_smilies') == 1)
128            $smiliesData = $this->modules['Cache']->getSmiliesData('write');
129
130
131        // Rangdaten laden
132        $ranksData = $this->modules['Cache']->getRanksData();
133
134
135        $parsedSignatures = array(); // Hier werden spaeter eventuell die geparsten Signaturen gespeichert um das nicht mehrfach machen zu muessen
136
137
138        // Beitraege laden
139        $postsData = $this->_loadPostsData($topicID,$start);
140        $postsCounter = count($postsData);
141
142        //$akt_cell_class = $tCONFIG['cell_classes']['start_class'];
143        for($i = 0; $i < $postsCounter; $i++) {
144            $curPost = &$postsData[$i];
145
146            $curEditedText = '';
147            if($curPost['postEditedCounter'] > 0 && $curPost['postShowEditings'] == 1)
148                $curEditedText = sprintf($this->modules['Language']->getString('edited_post_text'),$curPost['postEditedCounter'],$curPost['postLastEditorNick']);
149
150            $show = array(
151                'editButton'=>FALSE,
152                'deleteButton'=>FALSE
153            );
154
155            if($this->modules['Auth']->isLoggedIn() == 1) {
156                if($this->modules['Auth']->getValue('userIsAdmin') == 1 || $this->modules['Auth']->getValue('userIsSupermod') == 1 || $authData['authIsMod'] == 1 || (($forumData['authMembersEditPosts'] == 1 && $authData['authEditPosts'] == 1 || $forumData['authEditPostsMembers'] != 1 && $authData['authEditPosts'] == 1) && USERID == $curPost['posterID'])) {
157                    $show['editButton'] = TRUE;
158                    if($curPost['postID'] != $topicData['topicFirstPostID'])
159                        $show['deleteButton'] = TRUE;
160                }
161            }
162
163            $curPostDateTime = Functions::toDateTime($curPost['postTimestamp']);
164
165
166            //
167            // Angaben ueber den Beitragsersteller
168            //
169            $curPosterNick = $curPosterRankText = $curPosterRankPic = $curPosterIDText = $curPosterAvatar = '';
170            if($curPost['posterID'] == 0) {
171                $curPosterNick = $curPost['postGuestNick'];
172                $curPosterRankText = $this->modules['Language']->getString('Guest');
173            } else {
174                $curPosterNick = '<a href="'.INDEXFILE.'?action=ViewProfile&amp;profileID='.$curPost['posterID'].'&amp;'.MYSID.'">'.$curPost['postPosterNick'].'</a>';
175                $curPosterIDText = sprintf($this->modules['Language']->getString('ID_x'),$curPost['posterID']);
176
177
178                //
179                // Ueberpruefung, ob die Emailadresse des Users angezeigt werden soll
180                // Zur Sicherheit wird es auch hier geloescht, damit der Templatebauer die Emailadresse
181                // nicht doch aus Versehen anzeigen l?sst
182                //
183                if($curPost['postPosterHideEmailAddress'] == 1) $curPost['posterEmailAddress'] = '';
184
185
186                //
187                // Avatar
188                //
189                if($this->modules['Config']->getValue('enable_avatars') == 1 && $curPost['postPosterAvatarAddress'] != '')
190                    $curPosterAvatar = '<img src="'.$curPost['postPosterAvatarAddress'].'" alt="" border="0"/>';
191
192
193                //
194                // Rangbild und Rangtext des Users festlegen
195                //
196                if($curPost['postPosterRankID'] != 0) { // Falls der User einen speziellen Rang zugewiessen bekommen hat...
197                    $curPosterRankText = $ranksData[1][$curPost['postPosterRankID']]['rankName']; // ...den Namen des Rang verwenden...
198                    $curPosterRankPic = $ranksData[1][$curPost['postPosterRankID']]['rankGfx']; // ...und das Bild des Rangs verwenden
199                }
200                elseif($curPost['postPosterIsAdmin'] == 1) { // Falls der User Administrator ist...
201                    $curPosterRankText = $this->modules['Language']->getString('rank_administrator'); // ...seinen Rang darauf setzen...
202                    $curPosterRankPic = '<img src="'.$this->modules['Config']->getValue('admin_rank_pic').'" alt="" border="0"/>'; // ...und das entsprechende Bild verwenden
203                }
204                elseif($curPost['postPosterIsSupermod'] == 1) { // Falls der User Supermoderator ist...
205                    $curPosterRankText = $this->modules['Language']->getString('rank_supermoderator'); // ...seinen Rang darauf setzen...
206                    $curPosterRankPic = '<img src="'.$this->modules['Config']->getValue('supermod_rank_pic').'" alt="" border="0"/>'; // ...und das entsprechende Bild verwenden
207                }
208                elseif(isset($forumModIDs[$curPost['posterID']]) == TRUE) { // Falls der User Moderator ist...
209                    $curPosterRankText = $this->modules['Language']->getString('rank_moderator'); // ...seinen Rang darauf setzen...
210                    $curPosterRankPic = '<img src="'.$this->modules['Config']->getValue('mod_rank_pic').'" alt="" border="0"/>'; // ...und das entsprechende Bild verwenden
211                }
212                else { // Falls der User ein ganz normaler User ist...
213                    foreach($ranksData[0] AS $curRank) { // Die Rangliste durchlaufen
214                        if($curRank['rankPosts'] > $curPost['postPosterPosts']) break;
215
216                        $curPosterRankText = $curRank['rankName']; // ...den Namen das Rangs verwenden...
217                        $curPosterRankPic = $curRank['rankGfx']; // ...und das Bild des Rangs verwenden
218                    }
219                }
220            }
221
222
223            //
224            // Den Beitrag entsprechend formatieren
225            //
226            $curPost['_postText'] = $curPost['postText'];
227            if($curPost['postEnableHtmlCode'] != 1 || $forumData['forumEnableHtmlCode'] != 1) $curPost['_postText'] = Functions::HTMLSpecialChars($curPost['_postText']);
228            if($curPost['postEnableSmilies'] == 1 && $forumData['forumEnableSmilies'] == 1) $curPost['_postText'] = strtr($curPost['_postText'],$smiliesData);
229            $curPost['_postText'] = nl2br($curPost['_postText']);
230            //if($curPost['post_enable_urltransformation'] == 1  && ($forum_id == 0 || $forumData['forum_enable_urltransformation'] == 1)) $curPost['post_text'] = transform_urls($curPost['post_text']);
231            if($curPost['postEnableBBCode'] == 1 && $forumData['forumEnableBBCode'] == 1) $curPost['_postText'] = $this->modules['BBCode']->parse($curPost['_postText']);
232
233
234            //
235            // Die Signatur entsprechend formatieren
236            //
237            $curSignature = '';
238            if($curPost['postShowSignature'] == 1 && $this->modules['Config']->getValue('enable_sig') == 1 && $curPost['postPosterSignature'] != '') {
239                if(!isset($parsedSignatures[$curPost['posterID']])) { // Falls die Signatur nicht schonmal formatiert wurde
240                    if($this->modules['Config']->getValue('allow_sig_html') != 1) $parsedSignatures[$curPost['posterID']] = Functions::HTMLSpecialChars($curPost['postPosterSignature']);
241                    if($this->modules['Config']->getValue('allow_sig_smilies') == 1) $parsedSignatures[$curPost['posterID']] = strtr($parsedSignatures[$curPost['posterID']],$smiliesData);
242                    $parsedSignatures[$curPost['posterID']] = nl2br($parsedSignatures[$curPost['posterID']]);
243                    if($this->modules['Config']->getValue('allow_sig_bbcode') == 1) $parsedSignatures[$curPost['posterID']] = $this->modules['BBCode']->parse($parsedSignatures[$curPost['posterID']]);
244                }
245                $curSignature = $parsedSignatures[$curPost['posterID']];
246            }
247
248            $curPost['_postEditBoxText'] = Functions::HTMLSpecialChars($curPost['postText']);
249            $curPost['_postSignature'] = $curSignature;
250            $curPost['_postEditedText'] = $curEditedText;
251            $curPost['_postPosterIDText'] = $curPosterIDText;
252            $curPost['_postDateTime'] = $curPostDateTime;
253            $curPost['_postPosterAvatar'] = $curPosterAvatar;
254            $curPost['_postPosterNick'] = $curPosterNick;
255            $curPost['_postPosterRankPic'] = $curPosterRankPic;
256            $curPost['_postPosterRankText'] = $curPosterRankText;
257            $curPost['show'] = $show;
258        }
259
260
261        if($this->modules['Auth']->isLoggedIn() == 1 && $this->modules['Config']->getValue('enable_email_functions') == 1 && $this->modules['Config']->getValue('enable_topic_subscription') == 1) {
262            $this->modules['DB']->query("SELECT UserID FROM ".TBLPFX."topics_subscriptions WHERE topicID='$topicID' AND UserID='".USERID."'");
263            $subscribeText = ($this->modules['DB']->getAffectedRows() == 0) ? $this->modules['Language']->getString('Subscribe_topic') : $this->modules['Language']->getString('Unsubscribe_topic');
264            $this->modules['Navbar']->setRightArea('<a href="'.INDEXFILE.'?action=SubscribeTopic&amp;topicID='.$topicID.'&amp;'.MYSID.'">'.$subscribeText.'</a>');
265        }
266
267        $this->modules['Navbar']->addCategories($forumData['catID']);
268        $this->modules['Navbar']->addElements(
269            array(Functions::HTMLSpecialChars($forumData['forumName']),INDEXFILE.'?action=ViewForum&amp;forumID='.$forumID.'&amp;'.MYSID),
270            array(Functions::HTMLSpecialChars($topicData['topicTitle']),INDEXFILE.'?action=ViewTopic&amp;topicID='.$topicID.'&amp;'.MYSID)
271        );
272
273        // Seite ausgeben
274        $this->modules['Template']->assign(array(
275            'postsData'=>$postsData,
276            'pageListing'=>$pageListing,
277            'modTools'=>$modTools,
278            'topicID'=>$topicID,
279            'forumID'=>$forumID,
280            'topicData'=>$topicData,
281            'pollData'=>$pollData
282        ));
283        $this->modules['PageParts']->printPage('ViewTopic.tpl');
284    }
285
286    protected function _loadForumModIDs($forumID) {
287        $forumModIDs = array();
288
289        if($forumID != 0) {
290            $this->modules['DB']->query("
291                SELECT
292                    authID
293                FROM
294                    ".TBLPFX."forums_auth
295                WHERE
296                    authType='".AUTH_TYPE_USER."'
297                    AND forumID='$forumID'
298                    AND authIsMod='1'
299            ");
300            while(list($curUserID) = $this->modules['DB']->fetchArray())
301                $forumModIDs[intval($curUserID)] = TRUE;
302
303            $this->modules['DB']->query("
304                SELECT
305                    t2.memberID
306                FROM (
307                    ".TBLPFX."forums_auth AS t1,
308                    ".TBLPFX."groups_members AS t2
309                )
310                WHERE
311                    t1.forumID='$forumID'
312                    AND t1.authIsMod=1
313                    AND t1.authType='".AUTH_TYPE_GROUP."'
314                    AND t2.groupID=t1.authID
315                GROUP BY
316                    t2.memberID
317            ");
318            while(list($curUserID) = $this->modules['DB']->fetchArray())
319                $forumModIDs[intval($curUserID)] = TRUE;
320        }
321
322        return $forumModIDs;
323    }
324
325    protected function _loadPostsData($topicID,$start) {
326        $this->modules['DB']->query("
327            SELECT
328                t1.*,
329                t2.userEmailAddress AS postPosterEmailAddress,
330                t2.userNick AS postPosterNick,
331                t2.userSignature AS postPosterSignature,
332                t2.userIsAdmin AS postPosterIsAdmin,
333                t2.userIsSupermod AS postPosterIsSupermod,
334                t2.userPostsCounter AS postPosterPosts,
335                t2.rankID AS postPosterRankID,
336                t2.userAvatarAddress AS postPosterAvatarAddress,
337                t2.userHideEmailAddress AS postPosterHideEmailAddress,
338                t2.userReceiveEmails AS postPosterReceiveEmails,
339                t3.smileyFileName AS postSmileyFileName
340            FROM ".TBLPFX."posts AS t1
341            LEFT JOIN ".TBLPFX."users AS t2 ON t1.posterID=t2.userID
342            LEFT JOIN ".TBLPFX."smilies AS t3 ON t3.smileyID=t1.smileyID
343            WHERE t1.topicID='$topicID'
344            ORDER BY t1.postTimestamp LIMIT $start,".$this->modules['Config']->getValue('posts_per_page')
345        );
346
347        return $this->modules['DB']->raw2Array();
348    }
349
350    protected function _authenticateUser(&$forumData) {
351        $authData = Functions::getAuthData($forumData,array('authViewForum','authPostTopic','authPostReply','authEditPosts','authIsMod'));
352        if($authData['authViewForum'] != 1) {
353            // TODO
354            echo 'Kein Zugriff';
355            exit;
356        }
357
358        return $authData;
359    }
360}
361
362?>
Note: See TracBrowser for help on using the repository browser.