コード例 #1
0
	/**
	 * Callback for the <WikiForumThread> hook.
	 * Takes the following arguments: id (ID number of the thread, used in SQL
	 * query), replies (whether to display replies)
	 */
	public static function renderWikiForumThread( $input, $args, $parser, $frame ) {
		global $wgOut, $wgLang;

		if ( isset( $args['id'] ) && $args['id'] > 0 ) {
			$dbr = wfGetDB( DB_SLAVE );
			$sqlThreads = $dbr->select(
				array( 'wikiforum_forums', 'wikiforum_category', 'wikiforum_threads', 'user' ),
				array(
					'wft_thread', 'wft_thread_name', 'wft_text', 'wff_forum',
					'wff_forum_name', 'wfc_category', 'wfc_category_name',
					'user_name', 'user_id', 'wft_edit_timestamp', 'wft_edit_user',
					'wft_posted_timestamp', 'wft_user', 'wft_closed',
					'wft_closed_user'
				),
				array(
					'wff_deleted' => 0,
					'wfc_deleted' => 0,
					'wft_deleted' => 0,
					'wff_category = wfc_category',
					'wff_forum = wft_forum',
					'wft_thread' => intval( $args['id'] )
				),
				__METHOD__,
				array(),
				array( 'user' => array( 'LEFT JOIN', 'user_id = wft_user' ) )
			);
			$overview = $dbr->fetchObject( $sqlThreads );

			if ( $overview ) {
				$posted = wfMsg(
					'wikiforum-posted',
					$wgLang->timeanddate( $overview->wft_posted_timestamp ),
					WikiForumClass::getUserLink( $overview->user_name )
				);
				if ( $overview->wft_edit_timestamp > 0 ) {
					$posted .= '<br /><i>' .
						wfMsg(
							'wikiforum-edited',
							$wgLang->timeanddate( $overview->wft_edit_timestamp ),
							WikiForumClass::getUserLinkById( $overview->wft_edit_user )
						) . '</i>';
				}

				$output = WikiForumGui::getHeaderRow(
					$overview->wfc_category,
					$overview->wfc_category_name,
					$overview->wff_forum,
					$overview->wff_forum_name,
					false
				);

				$specialPageObj = SpecialPage::getTitleFor( 'WikiForum' );
				$link = $specialPageObj->escapeFullURL( 'thread=' . $overview->wft_thread );

				$output .= WikiForumGui::getThreadHeader(
					'<a href="' . $link . '">' . $overview->wft_thread_name . '</a>',
					$parser->recursiveTagParse( $overview->wft_text, $frame ),
					$posted,
					'',
					$overview->wft_thread,
					$overview->user_id
				);

				if ( isset( $args['replies'] ) && $args['replies'] ) {
					$replies = $dbr->select(
						array( 'wikiforum_replies', 'user' ),
						array( '*', 'user_name' ),
						array( 'wfr_deleted' => 0, 'wfr_thread' => $overview->pkThread ),
						__METHOD__,
						array( 'ORDER BY' => 'wfr_posted_timestamp ASC' ),
						array( 'user' => array( 'LEFT JOIN', 'user_id = wfr_user' ) )
					);

					foreach ( $replies as $reply ) {
						$posted = wfMsg(
							'wikiforum-posted',
							$wgLang->timeanddate( $reply->wfr_posted_timestamp ),
							WikiForumClass::getUserLink( $reply->user_name )
						);
						if ( $reply->wfr_edit > 0 ) {
							$posted .= '<br /><i>' .
								wfMsg(
									'wikiforum-edited',
									$wgLang->timeanddate( $reply->wfr_edit ),
									WikiForumClass::getUserLinkById( $reply->wfr_edit_user )
								) . '</i>';
						}
						$output .= WikiForumGui::getReply(
							$wgOut->parse( WikiForum::deleteTags( $reply->wfr_reply_text ) ),
							$posted,
							'',
							$reply->wfr_reply_id
						);
					}
				}

				$output .= WikiForumGui::getThreadFooter();
				return $output;
			}
		} else {
			return '';
		}
	}
コード例 #2
0
	function showThread( $threadId ) {
		global $wgOut, $wgRequest, $wgUser, $wgLang, $wgScriptPath;

		$output = $this->showFailure();
		$dbr = wfGetDB( DB_SLAVE );

		$sqlData = $dbr->select(
			array( 'wikiforum_forums', 'wikiforum_category', 'wikiforum_threads', 'user' ),
			array(
				'wft_thread', 'wft_thread_name', 'wft_text', 'wff_forum',
				'wff_forum_name', 'wfc_category', 'wfc_category_name',
				'user_name', 'user_id', 'wft_sticky', 'wft_edit_timestamp',
				'wft_edit_user', 'wft_posted_timestamp', 'wft_user',
				'wft_closed', 'wft_closed_user',
			),
			array(
				'wff_deleted' => 0,
				'wfc_deleted' => 0,
				'wft_deleted' => 0,
				'wff_category = wfc_category',
				'wff_forum = wft_forum',
				'wft_thread' => intval( $threadId )
			),
			__METHOD__,
			array(),
			array( 'user' => array( 'LEFT JOIN', 'user_id = wft_user' ) )
		);

		$data_overview = $dbr->fetchObject( $sqlData );

		$maxRepliesPerPage = intval( wfMsgForContent( 'wikiforum-max-replies-per-page' ) );

		// limiting
		if ( $maxRepliesPerPage && $wgRequest->getVal( 'lc' ) > 0 ) {
			$limit_count = $wgRequest->getVal( 'lc' );
		} elseif ( $maxRepliesPerPage > 0 ) {
			$limit_count = $maxRepliesPerPage;
		}

		if ( is_numeric( $wgRequest->getVal( 'lp' ) ) ) {
			$limit_page = $wgRequest->getVal( 'lp' ) - 1;
		} else {
			$limit_page = 0;
		}
		// end limiting

		$specialPage = SpecialPage::getTitleFor( 'WikiForum' );

		if ( $data_overview ) {
			$queryOptions['ORDER BY'] = 'wfr_posted_timestamp ASC';
			if ( $limit_count > 0 ) {
				$queryOptions['LIMIT'] = $limit_count;
				$queryOptions['OFFSET'] = $limit_page * $limit_count;
			}
			$replies = $dbr->select(
				array( 'wikiforum_replies', 'user' ),
				array( '*', 'user_name', 'user_id' ),
				array(
					'wfr_deleted' => 0,
					'wfr_thread' => $data_overview->wft_thread
				),
				__METHOD__,
				$queryOptions,
				array( 'user' => array( 'LEFT JOIN', 'user_id = wfr_user' ) )
			);

			if ( !wfReadOnly() ) {
				$dbw = wfGetDB( DB_MASTER );
				$dbw->update(
					'wikiforum_threads',
					array( 'wft_view_count = wft_view_count + 1' ),
					array( 'wft_thread' => intval( $data_overview->wft_thread ) ),
					__METHOD__
				);
			}

			$editButtons = $this->showThreadButtons(
				$data_overview->wft_user,
				$data_overview->wft_closed,
				$data_overview->wft_thread,
				$data_overview->wff_forum
			);

			$menuLink = '';

			if ( $wgUser->isAllowed( 'wikiforum-admin' ) ) {
				if ( $data_overview->wft_sticky == 1 ) {
					$icon = '<img src="' . $wgScriptPath . '/extensions/WikiForum/icons/tag_blue_delete.png" title="' . wfMsg( 'wikiforum-remove-sticky' ) . '" /> ';
					$menuLink = $icon . '<a href="' . $specialPage->escapeFullURL( array( 'removesticky' => $data_overview->wft_thread ) ) . '">' .
						wfMsg( 'wikiforum-remove-sticky' ) . '</a> ';
				} else {
					$icon = '<img src="' . $wgScriptPath . '/extensions/WikiForum/icons/tag_blue_add.png" title="' . wfMsg( 'wikiforum-make-sticky' ) . '" /> ';
					$menuLink = $icon . '<a href="' . $specialPage->escapeFullURL( array( 'makesticky' => $data_overview->wft_thread ) ) . '">' .
							wfMsg( 'wikiforum-make-sticky' ) . '</a> ';
				}
			}

			$icon = '<img src="' . $wgScriptPath . '/extensions/WikiForum/icons/comment_add.png" title="' . wfMsg( 'wikiforum-write-reply' ) . '" /> ';
			// Replying is only possible to open threads
			if ( $data_overview->wft_closed == 0 ) {
				$menuLink .= $icon . '<a href="#writereply">' .
					wfMsg( 'wikiforum-write-reply' ) . '</a>';
			}

			$posted = wfMsg(
				'wikiforum-posted',
				$wgLang->timeanddate( $data_overview->wft_posted_timestamp ),
				WikiForumClass::getUserLink( $data_overview->user_name )
			);
			if ( $data_overview->wft_edit_timestamp > 0 ) {
				$posted .= '<br /><i>' .
					wfMsg(
						'wikiforum-edited',
						$wgLang->timeanddate( $data_overview->wft_edit_timestamp ),
						WikiForumClass::getUserLinkById( $data_overview->wft_edit_user )
					) . '</i>';
			}

			$output .= WikiForumGui::getSearchbox();
			$output .= WikiForumGui::getHeaderRow(
				$data_overview->wfc_category,
				$data_overview->wfc_category_name,
				$data_overview->wff_forum,
				$data_overview->wff_forum_name,
				$menuLink
			);

			// Add topic name to the title
			// @todo FIXME: this is lame and doesn't apply to the <title> attribute
			$wgOut->setPageTitle( wfMsg( 'wikiforum-topic-name', $data_overview->wft_thread_name ) );

			$output .= WikiForumGui::getThreadHeader(
				htmlspecialchars( $data_overview->wft_thread_name ),
				$this->parseIt( $data_overview->wft_text ),// $wgOut->parse( $data_overview->wft_text ),
				$posted,
				$editButtons,
				$data_overview->wft_thread,
				$data_overview->user_id
			);

			foreach ( $replies as $reply ) {
				$editButtons = $this->showReplyButtons(
					$reply->wfr_user,
					$reply->wfr_reply_id,
					$data_overview->wft_thread,
					$data_overview->wft_closed
				);

				$posted = wfMsg(
					'wikiforum-posted',
					$wgLang->timeanddate( $reply->wfr_posted_timestamp ),
					WikiForumClass::getUserLink( $reply->user_name )
				);
				if ( $reply->wfr_edit_timestamp > 0 ) {
					$posted .= '<br /><i>' .
						wfMsg(
							'wikiforum-edited',
							$wgLang->timeanddate( $reply->wfr_edit_timestamp ),
							WikiForumClass::getUserLinkById( $reply->wfr_edit_user )
						) . '</i>';
				}

				$output .= WikiForumGui::getReply(
					$this->parseIt( $reply->wfr_reply_text ),// $wgOut->parse( $reply->wfr_reply_text ),
					$posted,
					$editButtons,
					$reply->wfr_reply_id,
					$reply->user_id
				);
			}

			$output .= WikiForumGui::getThreadFooter();

			if ( $limit_count > 0 ) {
				$countReplies = $dbr->selectRow(
					'wikiforum_replies',
					'COUNT(*) AS count',
					array(
						'wfr_deleted' => 0,
						'wfr_thread' => $data_overview->wft_thread
					),
					__METHOD__
				);
				$output .= WikiForumGui::getFooterRow(
					$limit_page,
					$countReplies->count,
					$limit_count,
					$data_overview->wff_forum,
					intval( $threadId )
				);
			}

			$mod_editcomment = $wgRequest->getInt( 'editcomment' );
			$mod_form = $wgRequest->getBool( 'form' );
			if (
				$data_overview->wft_closed == 0 ||
				( isset( $mod_editcomment ) && $mod_editcomment > 0 &&
					$mod_form != true &&
					$wgUser->isAllowed( 'wikiforum-moderator' )
				)
			)
			{
				$output .= $this->showEditor( $data_overview->wft_thread, 'addcomment' );
			} else {
				$this->errorTitle = wfMsg( 'wikiforum-thread-closed' );
				$this->errorMessage = wfMsg( 'wikiforum-error-thread-closed' );
				$this->errorIcon = 'lock.png';// 'icon_thread_closed';
			}
		} else {
			$this->errorTitle = wfMsg( 'wikiforum-thread-not-found' );
			$this->errorMessage = wfMsg(
				'wikiforum-thread-not-found-text',
				'<a href="' . $specialPage->escapeFullURL() . '">' .
					wfMsg( 'wikiforum-overview' ) . '</a>'
			);
		}

		$movethread_link = '';
		if ( $wgUser->isAllowed( 'wikiforum-moderator' ) ) {
			$icon = '<img src="' . $wgScriptPath . '/extensions/WikiForum/icons/note_go.png" title="' . wfMsg( 'wikiforum-move-thread' ) . '" /> ';
			$movethread_link = $icon . '<a href="' . $specialPage->escapeFullURL( array( 'movethread' => $data_overview->wft_thread ) ) . '">' . wfMsg( 'wikiforum-move-thread' ) . '</a> ';
			$output .= WikiForumGui::getHeaderRow( 0, '', 0, '', $movethread_link );
		}

		$output .= $this->showFailure();

		return $output;
	}