User:AndiRay/Article Comments
Why what?
[edit]I'm using MediaWiki 1.13.2 PHP 5.2.6 (cgi-fcgi) MySQL 5.0.67-community-nt
I started to use the Extension:ArticleComments (from Jim R. Wilson User:Jimbojw) but whiched to have a "leave comment..." statement at the bottom of every site (except mainsites, like User:Subfader/Article Comments) and I wanted it to open a talkpage to each article (like the extension does by default).
On the talkpage the "leave comment..." statement should stand at the top... beneath the comments should be displayed like [[1]] but the newest ontop.
I came across alot of differculties by trying to achieve this... like:
- double or tripple posting of the "leave comment..." statement
- the statement was shown on the wrong sites
- the statements werent shown on the right sites
Now I thought I should write about it... maybe it hepls some other noobs like me ^^
I will just write what I did... with my changes
Installation
[edit]Location and LocalSettings.php
[edit]
First step the normal installation:
1. Download ArticleComments, and be sure to rename the downloaded file to ArticleComments.php.
2. Drop this script in $IP/extensions
Note: $IP is your MediaWiki install directory.
3. Enable the extension by adding these lines to your LocalSettings.php:
require_once('extensions/ArticleComments.php'); $wgArticleCommentDefaults['showurlfield']=false;//removes the URL field from the comment form $wgArticleCommentsNSDisplayList = array(NS_MAIN,NS_TALK,100,102,104,2); //the namespaceID's work (beware to use the right ones)
Specialpages
[edit]then I followed the instructions from: www.leerwiki.nl [2]
- Go to the special page MediaWiki:Article-comments-new-comment
- Edit the page with
<div class='comment'> <div class='commenttop'> <div class='username'>$3 said...</div> <div class='date'>$4</div> </div> <div class='commentpost'>$2</div> </div>
Note: $3 said... is one of thos small changes that make a difference... this will make the name displayed in the comment, link to his userpage
- Go to the special page Mediawiki:Article-comments-commenter-said
- Edit the page with
~~$3 said ...
Theme CSS
[edit]Add this to MediaWiki:Common.css:
div.comment { border: 1px solid silver; padding: 1px; margin-bottom: 16px; } div.commenttop { padding: 4px; background: #EEEEEE; } div.username { font: 11px verdana, arial, sans-serif; font-weight: bold; width: auto; float: left; } div.date { width: auto; text-align: right; } div.commentpost { padding: 4px; background: #F9F9F9; }
Monobook.php
[edit]then i followed the instructions on User:Subfader/Article Comments
Edit skins/monobook.php and find
<!-- start content --> <!-- end content -->
Add the following code inbetween or if you have content in that section already, add it to the very end.
<?php displayArticleCommentForm(); ?>
Note: Another change I hade to make
ArticleComment.php
[edit]Edit extension/ArticleComments.php (or maybe copypaste my file at the bottom), find...
# Display the form if (in_array($title->getNamespace(), $nsList)) { echo(wfArticleCommentForm($title, $params)); }
change to...
#Needet to search trough the link to find out if its a talkpage or whatever $mystring = $wgTitle; $findme1 = 'discussion'; $findme2 = 'talk'; $pos1 = strpos($mystring, $findme1); $pos2 = strpos($mystring, $findme2); # Display the form, #&& $wgTitle != 'sitename' on these sites the "leave comment ..." statement wont appear if (in_array($title->getNamespace(), $nsList) && $wgTitle != 'Main Page' && $wgTitle != 'Other Page' ) { if ($pos1 === false && $pos2 === false) { echo(wfArticleCommentForm($title, $params));#if its not a discussionpage it will perform } }
find...
$wgMessageCache->addMessage('article-comments-talk-page-starter', "<noinclude>Comments on [[$1]]\n<comments />\n----- __NOEDITSECTION__</noinclude>\n"); $wgMessageCache->addMessage('article-comments-new-comment', "\n== \$1 ==\n\n<div class='commentBlock'>\n\$2\n\n--\$3 \$4\n</div>\n");
chage to...
$wgMessageCache->addMessage('article-comments-talk-page-starter', "<comments />\n <h1>Comments</h1>\n <!--COMMENTS_BELOW--> "); $wgMessageCache->addMessage('article-comments-new-comment', "<div class='comment'> <div class='commenttop'> <div class='username'>$1</div> <div class='date'>$4</div> </div> <div class='commentpost'>$2</div> </div>");
find and comment it out or delete this part...
# Check whether the article or its talk page contains a <comments /> flag if (!$skipCheck && preg_match('/<comments( +[^>]*)?\\/>/', $articleContent)===0 && preg_match('/<comments( +[^>]*)?\\/>/', $talkContent)===0 ) { $wgOut->setPageTitle(wfMsgForContent($ac.'submission-failed')); $wgOut->addWikiText( "<div class='errorbox'>". wfMsgForContent($ac.'no-comments', $title->getPrefixedText()). "</div>" ); return; }
My ArticleComments.php file
[edit]<?php
/*
* ArticleComments.php - A MediaWiki extension for adding comment sections to articles.
* @author Jim R. Wilson
* @version 0.4.3
* @copyright Copyright (C) 2007 Jim R. Wilson
* @license The MIT License - http://www.opensource.org/licenses/mit-license.php
* -----------------------------------------------------------------------
* Description:
* This is a MediaWiki (http://www.mediawiki.org/) extension which adds support
* for comment sections within article pages, or directly into all pages.
* Requirements:
* MediaWiki 1.6.x, 1.8.x, 1.9.x or higher
* PHP 4.x, 5.x or higher
* Installation:
* 1. Drop this script (ArticleComments.php) in $IP/extensions
* Note: $IP is your MediaWiki install dir.
* 2. Enable the extension by adding this line to your LocalSettings.php:
* require_once('extensions/ArticleComments.php');
* Usage:
* Once installed, you may utilize ArticleComments by adding the following flag in the article text:
* <comments />
* Note: Typically this would be placed at the end of the article text.
* Version Notes:
* version 0.4.3:
* Added new insertion feature, comments will now be inserted before <!--COMMENTS_ABOVE--> if present
* Or, after <!--COMMENTS_BELOW--> if present (the latter causes reverse chronological comment ordering).
* version 0.4.2:
* Updated default spam filtering code to check all fields against $wgSpamRegex, if specified.
* version 0.4.1:
* Updated default spam filtering code. (now matches <a> tags in commenterName)
* version 0.4:
* Updated default spam filtering code.
* Abstracted Spam filter via hook (ArticleCommentsSpamCheck) to aid future spam checkers
* version 0.3:
* Added rudimentary spam filtering based on common abuses.
* version 0.2:
* Fixed form post method to use localized version of "Special"
* Added option for making the form automatically visible (no "Leave a comment..." link)
* Added option of diabling the "Website" field
* Added system message for prepopulating the comment box.
* Added system message for structuring comment submission text.
* Added abstracted method for form creation (for insertion into skins)
* Added option to "Whitelist" Namespaces for comment submission (as by skin-level form).
* Added check for user blocked status prior to comment submission.
* version 0.1:
* Initial release.
* -----------------------------------------------------------------------
* Copyright (c) 2007 Jim R. Wilson
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do
* so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
* HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
* -----------------------------------------------------------------------
*/
# Confirm MW environment
if (!defined('MEDIAWIKI')) die();
# Credits
$wgExtensionCredits['other'][] = array(
'name'=>'ArticleComments',
'author'=>'Jim R. Wilson - wilson.jim.r <at> gmail.com',
'url'=>'http://jimbojw.com/wiki/index.php?title=ArticleComments',
'description'=>'Enables comment sections on article pages.',
'version'=>'0.4.1'
);
# Add Extension Functions
$wgExtensionFunctions[] = 'wfArticleCommentsParserSetup';
# Sets up the ArticleComments Parser hook for <comments />
function wfArticleCommentsParserSetup() {
global $wgParser;
$wgParser->setHook( 'comments', 'wfArticleCommentsParserHook' );
}
function wfArticleCommentsParserHook( $text, $params = array(), &$parser ) {
# Generate a comment form for display
$commentForm = wfArticleCommentForm( $parser->mTitle, $params );
# Hide content from the Parser using base64 to avoid mangling.
# Note: Content will be decoded after Tidy has finished its processing of the page.
return '<pre>@ENCODED@'.base64_encode($commentForm).'@ENCODED@</pre>';
}
/**
* Echos out a comment form depending on the page action and namespace.
* @param Title $title The title of the article on which the form will appear.
* @param Array $params A hash of parameters containing rendering options.
*/
function displayArticleCommentForm( $title = null, $params = array() ) {
global $wgRequest, $wgArticleCommentsNSDisplayList;
# Short circuit for anything other than action=view or action=purge
if ($wgRequest->getVal('action') &&
$wgRequest->getVal('action')!='view' &&
$wgRequest->getVal('action')!='purge'
) return;
# Short-circuit if displayl ist is undefined or null
if ($wgArticleCommentsNSDisplayList==null) return;
# Use wgTitle if title is not specified
if ($title==null) {
global $wgTitle;
$title = $wgTitle;
}
# Ensure that the namespace list is an actual list
$nsList = $wgArticleCommentsNSDisplayList;
if (!is_array($nsList)) $nsList = array($nsList);
#Needet to search trough the link
$mystring = $wgTitle;
$findme1 = 'Discussion';
$findme2 = 'talk';
$pos1 = strpos($mystring, $findme1);
$pos2 = strpos($mystring, $findme2);
#Needet to search trough the link to find out if its a talkpage or whatever
$mystring = $wgTitle;
$findme1 = 'discussion';
$findme2 = 'talk';
$pos1 = strpos($mystring, $findme1);
$pos2 = strpos($mystring, $findme2);
# Display the form,
#&& $wgTitle != 'sitename' on these sites the "leave comment ..." statement wont appear
if (in_array($title->getNamespace(), $nsList)
&& $wgTitle != 'Main Page'
&& $wgTitle != 'Other Page'
)
{
if ($pos1 === false && $pos2 === false)
{
echo(wfArticleCommentForm($title, $params));#if its not a discussionpage / talkpage it will perform
}
}
/**
* Generates and returns an ArticleComment form.
* @param Title $title The title of the article on which the form will appear.
* @param Array $params A hash of parameters containing rendering options.
*/
function wfArticleCommentForm( $title = null, $params = array() ) {
global $wgScript, $wgArticleCommentDefaults, $wgContentLang, $wgContLang;
$wcl = ($wgContentLang ? $wgContentLang : $wgContLang);
# Merge in global defaults if specified
if (is_array($wgArticleCommentDefaults) &&
!empty($wgArticleCommentDefaults)) {
$tmp = array();
foreach ($wgArticleCommentDefaults as $k=>$v) {
$tmp[strtolower($k)] = $v;
}
$params = array_merge($tmp, $params);
}
# Use wgTitle if title is not specified
if ($title==null) {
global $wgTitle;
$title = $wgTitle;
}
$ac = 'article-comments-';
$formAction = $wgScript.'?title='.$wcl->getNsText(NS_SPECIAL).':ProcessComment';
# Build out the comment form.
$content =
'<div id="commentForm">'.
'<form method="post" action="'.$formAction.'">'.
'<input type="hidden" id="titleKey" name="titleKey" '.
'value="'.$title->getDBKey().'" />'.
'<input type="hidden" id="titleNS" name="titleNS" '.
'value="'.$title->getNamespace().'" />'.
'<p>'.wfMsgForContent($ac.'name-field').'<br />'.
'<input type="text" id="commenterName" name="commenterName" /></p>'.
($params['showurlfield']=='false' || $params['showurlfield']===false?'':
'<p>'.wfMsgForContent($ac.'url-field').'<br />'.
'<input type="text" id="commenterURL" name="commenterURL" value="http://" /></p>'
).
'<p>'.wfMsgForContent($ac.'comment-field').'<br />'.
'<textarea id="comment" name="comment" style="width:30em" rows="5">'.
'</textarea></p>'.
'<p><input id="submit" type="submit" '.
'value="'.wfMsgForContent($ac.'submit-button').'" /></p>'.
'</form></div>';
# Short-circuit if noScript has been set to anything other than false
if (isset($params['noscript']) &&
$params['noscript']!=='false' &&
$params['noscript']) {
return $content;
}
# Inline JavaScript to make form behavior more rich (must degrade well in JS-disabled browsers)
$content .= "<script type='text/javascript'>//<![CDATA[\n(function(){\n";
# Prefill the name field if the user is logged in.
$content .=
'var prefillUserName = function(){'."\n".
'var ptu=document.getElementById("pt-userpage");'."\n".
'if (ptu) document.getElementById("commenterName").value='.
'ptu.getElementsByTagName("a")[0].innerHTML;};'."\n".
'if (window.addEventListener) window.addEventListener'.
'("load",prefillUserName,false);'."\n".
'else if (window.attachEvent) window.attachEvent'.
'("onload",prefillUserName);'."\n";
# Prefill comment text if it has been specified by a system message
# Note: This is done dynamically with JavaScript since it would be annoying
# for JS-disabled browsers to have the prefilled text (since they'd have
# to manually delete it).
$pretext = wfMsgForContent($ac.'prefilled-comment-text');
if ($pretext) {
$content .=
'var comment = document.getElementById("comment");'."\n".
'comment._everFocused=false;'."\n".
'comment.innerHTML="'.htmlspecialchars($pretext).'";'."\n".
'var clearCommentOnFirstFocus = function() {'."\n".
'var c=document.getElementById("comment");'."\n".
'if (!c._everFocused) {'."\n".
'c._everFocused=true;'."\n".
'c.value="";}}'."\n".
'if (comment.addEventListener) comment.addEventListener'.
'("focus",clearCommentOnFirstFocus,false);'."\n".
'else if (comment.attachEvent) comment.attachEvent'.
'("onfocus",clearCommentOnFirstFocus);'."\n";
}
# Hides the commentForm until the "Make a comment" link is clicked
# Note: To disable, set $wgArticleCommentDefaults['hideForm']=false in LocalSettings.php
if (!isset($params['hideform']) ||
($params['hideform']!='false' &&
!$params['hideform']===false)) {
$content .=
'var cf=document.getElementById("commentForm");'."\n".
'cf.style.display="none";'."\n".
'var p=document.createElement("p");'."\n".
'p.innerHTML="<a href=\'javascript:void(0)\' onclick=\''.
'document.getElementById(\\"commentForm\\").style.display=\\"block\\";'.
'this.style.display=\\"none\\";false'.
'\'>'.wfMsgForContent($ac.'leave-comment-link').'</a>";'."\n".
'cf.parentNode.insertBefore(p,cf);'."\n";
}
$content .= "})();\n//]]></script>";
return $content;
}
# Attach Hooks
$wgHooks['ParserAfterTidy'][] = 'wfProcessEncodedContent';
$wgHooks['ArticleCommentsSpamCheck'][] = 'defaultArticleCommentSpamCheck';
/**
* Processes HTML comments with encoded content.
* Usage: $wgHooks['OutputPageBeforeHTML'][] = 'wfProcessEncodedContent';
* @param OutputPage $out Handle to an OutputPage object presumably $wgOut (passed by reference).
* @param String $text Article/Output text (passed by reference)
* @return Boolean Always tru to give other hooking methods a chance to run.
*/
function wfProcessEncodedContent($out, $text) {
$text = preg_replace(
'/<pre>@ENCODED@([0-9a-zA-Z\\+\\/]+=*)@ENCODED@<\\/pre>/e',
'base64_decode("$1")',
$text
);
return true;
}
# Sets up special page to handle comment submission
$wgExtensionFunctions[] = 'setupSpecialProcessComment';
function setupSpecialProcessComment() {
global $IP, $wgMessageCache;
require_once($IP.'/includes/SpecialPage.php');
SpecialPage::addPage(new SpecialPage('ProcessComment', '', true, 'specialProcessComment', false));
# Messages used in this extension
$wgMessageCache->addMessage('article-comments-title-field', 'Title');
$wgMessageCache->addMessage('article-comments-name-string', 'Name');
$wgMessageCache->addMessage('article-comments-name-field', 'Name (required): ');
$wgMessageCache->addMessage('article-comments-url-field', 'Website: ');
$wgMessageCache->addMessage('article-comments-comment-string', 'Comment');
$wgMessageCache->addMessage('article-comments-comment-field', 'Comment: ');
$wgMessageCache->addMessage('article-comments-submit-button', 'Submit');
$wgMessageCache->addMessage('article-comments-leave-comment-link', 'Leave a comment ...');
$wgMessageCache->addMessage('article-comments-invalid-field', 'The $1 provided <nowiki>[$2]</nowiki> is invalid.');
$wgMessageCache->addMessage('article-comments-required-field', '$1 field is required.');
$wgMessageCache->addMessage('article-comments-submission-failed', 'Comment Submission Failed');
$wgMessageCache->addMessage('article-comments-failure-reasons', 'Sorry, your comment submission failed for the following reason(s):');
$wgMessageCache->addMessage('article-comments-no-comments', 'Sorry, the article "[[$1]]" is not accepting comments at this time.');
$wgMessageCache->addMessage('article-comments-talk-page-starter', "<comments />\n <h1>Comments</h1>\n <!--COMMENTS_BELOW--> ");//Changes here
$wgMessageCache->addMessage('article-comments-commenter-said', '$1 said ...');
$wgMessageCache->addMessage('article-comments-summary', 'Comment provided by $1 - via ArticleComments extension');
$wgMessageCache->addMessage('article-comments-submission-succeeded', 'Comment submission succeeded');
$wgMessageCache->addMessage('article-comments-submission-success', 'You have successfully submitted a comment for [[$1]]');
$wgMessageCache->addMessage('article-comments-submission-view-all', 'You may view all comments on that article [[$1|here]]');
$wgMessageCache->addMessage('article-comments-prefilled-comment-text', '');
$wgMessageCache->addMessage('article-comments-user-is-blocked', 'Your user account is currently blocked from editing [[$1]].');
$wgMessageCache->addMessage('article-comments-new-comment', "<div class='comment'> <div class='commenttop'> <div class='username'>$1</div> <div class='date'>$4</div> </div> <div class='commentpost'>$2</div> </div>");//Changes here
$wgMessageCache->addMessage('article-comments-no-spam', "At least one of the submitted fields was flagged as spam.");
$wgMessageCache->addMessage('processcomment', 'Process Article Comment');
}
/**
* Special page for comment processing.
*/
function specialProcessComment() {
global $wgOut, $wgParser, $wgUser, $wgContentLang, $wgContLang;
$wcl = ($wgContentLang ? $wgContentLang : $wgContLang);
# Retrieve submitted values
$titleKey = $_POST['titleKey'];
$titleNS = intval($_POST['titleNS']);
$commenterName = $_POST['commenterName'];
$commenterURL = isset($_POST['commenterURL']) ? $_POST['commenterURL'] : '';
$comment = $_POST['comment'];
# Perform validation checks on supplied fields
$ac = 'article-comments-';
$messages = array();
if (!$titleKey) $messages[] = wfMsgForContent(
$ac.'invalid-field', wfMsgForContent($ac.'title-field'), $titleKey
);
if (!$commenterName) $messages[] = wfMsgForContent(
$ac.'required-field', wfMsgForContent($ac.'name-string'));
if (!$comment) $messages[] = wfMsgForContent(
$ac.'required-field', wfMsgForContent($ac.'comment-string'));
if (!empty($messages)) {
$wgOut->setPageTitle(wfMsgForContent($ac.'submission-failed'));
$wikiText = "<div class='errorbox'>";
$wikiText .= wfMsgForContent($ac.'failure-reasons')."\n\n";
foreach ($messages as $message) {
$wikiText .= "* $message\n";
}
$wgOut->addWikiText($wikiText . "</div>");
return;
}
# Setup title and talkTitle object
$title = Title::newFromDBkey($titleKey);
$title->mNamespace = $titleNS - ($titleNS % 2);
$article = new Article($title);
$talkTitle = Title::newFromDBkey($titleKey);
$talkTitle->mNamespace = $titleNS + 1 - ($titleNS % 2);
$talkArticle = new Article($talkTitle);
# Check whether user is blocked from editing the talk page
if ($wgUser->isBlockedFrom($talkTitle)) {
$wgOut->setPageTitle(wfMsgForContent($ac.'submission-failed'));
$wikiText = "<div class='errorbox'>";
$wikiText .= wfMsgForContent($ac.'failure-reasons')."\n\n";
$wikiText .= '* '.wfMsgForContent($ac.'user-is-blocked', $talkTitle->getPrefixedText())."\n";
$wgOut->addWikiText($wikiText . "</div>");
return;
}
# Retrieve article content
$articleContent = '';
if ( $article->exists() ) {
$articleContent = $article->getContent();
}
# Retrieve existing talk content
$talkContent = '';
if ( $talkTitle->exists() ) {
$talkContent = $talkArticle->getContent();
}
# Check if talk NS is in the Namespace display list
# Note: if so, then there's no need to confirm that <comments /> appears in the article or talk page.
global $wgArticleCommentsNSDisplayList;
$skipCheck = (
is_array($wgArticleCommentsNSDisplayList) ?
in_array($talkTitle->getNamespace(),$wgArticleCommentsNSDisplayList):
false
);
#Had to take it out
# Check whether the article or its talk page contains a <comments /> flag
#if (!$skipCheck &&
# preg_match('/<comments( +[^>]*)?\\/>/', $articleContent)===0 &&
# preg_match('/<comments( +[^>]*)?\\/>/', $talkContent)===0
#) {
# $wgOut->setPageTitle(wfMsgForContent($ac.'submission-failed'));
# $wgOut->addWikiText(
# "<div class='errorbox'>".
# wfMsgForContent($ac.'no-comments', $title->getPrefixedText()).
# "</div>"
# );
# return;
#}
# Run spam checks
$isspam = false;
wfRunHooks( 'ArticleCommentsSpamCheck', array( $comment , $commenterName, $commenterURL, &$isspam ) );
# If it's spam - it's gone!
if ($isspam) {
$wgOut->setPageTitle(wfMsgForContent($ac.'submission-failed'));
$wgOut->addWikiText(
"<div class='errorbox'>".
wfMsgForContent($ac.'no-spam').
"</div>"
);
return;
}
# Initialize the talk page's content.
if ( $talkContent == '' ) {
$talkContent = wfMsgForContent($ac.'talk-page-starter', $title->getPrefixedText() );
}
# Determine signature components
$d = $wcl->timeanddate( date( 'YmdHis' ), false, false) . ' (' . date( 'T' ) . ')';
if ($commenterURL && $commenterURL!='http://') $sigText = "[$commenterURL $commenterName]";
else if ($wgUser->isLoggedIn()) $sigText = $wgParser->getUserSig( $wgUser );
else $sigText = $commenterName;
# Search for insertion point, or append most recent comment.
$commentText = wfMsgForContent(
$ac.'new-comment',
wfMsgForContent($ac.'commenter-said', $commenterName),
$comment,
$sigText,
$d
);
$posAbove = stripos( $talkContent, '<!--COMMENTS_ABOVE-->' );
if ($posAbove===false) $posBelow = stripos( $talkContent, '<!--COMMENTS_BELOW-->' );
if ($posAbove!==false) {
# Insert comments above HTML marker
$talkContent = substr( $talkContent, 0, $posAbove ) . $commentText . substr( $talkContent, $posAbove );
} else if ($posBelow!==false) {
# Insert comments below HTML marker
$talkContent = substr( $talkContent, 0, $posBelow + 21 ) . $commentText . substr( $talkContent, $posBelow + 21 );
} else {
# No marker found, append to bottom (default)
$talkContent .= $commentText;
}
# Update the talkArticle with the new comment
$summary = wfMsgForContent($ac.'summary', $commenterName);
if (method_exists($talkArticle, 'doEdit')) {
$talkArticle->doEdit($talkContent, $summary);
} else {
$method = ($talkArticle->exists() ? 'updateArticle' : 'insertNewArticle' );
$talkArticle->$method($talkContent, $summary, false, false);
return;
}
$wgOut->setPageTitle(wfMsgForContent($ac.'submission-succeeded'));
$wgOut->addWikiText(wfMsgForContent($ac.'submission-success', $title->getPrefixedText()));
$wgOut->addWikiText(wfMsgForContent($ac.'submission-view-all', $talkTitle->getPrefixedText()));
}
/**
* Checks ArticleComment fields for SPAM.
* Usage: $wgHooks['ArticleCommentsSpamCheck'][] = 'defaultArticleCommentSpamCheck';
* @param String $comment The comment body submitted (passed by value)
* @param String $commenterName Name of commenter (passed by value)
* @param String $commenterURL Website URL provided for comment (passed by value)
* @param Boolean $isspam Whether the comment is spam (passed by reference)
* @return Boolean Always true to indicate other hooking methods may continue to check for spam.
*/
function defaultArticleCommentSpamCheck($comment, $commenterName, $commenterURL, $isspam) {
# Short-circuit if spam has already been determined
if ($isspam) return true;
$fields = array($comment, $commenterName, $commenterURL);
# Run everything through $wgSpamRegex if it has been specified
global $wgSpamRegex;
if ($wgSpamRegex) {
foreach ($fields as $field) {
if ( preg_match( $wgSpamRegex, $field ) ) return $isspam = true;
}
}
# Rudimentary spam protection
$spampatterns = array(
'%\\[url=(https?|ftp)://%smi',
'%<a\\s+[^>]*href\\s*=\\s*[\'"]?\\s*(https?|ftp)://%smi'
);
foreach ($spampatterns as $sp) {
foreach (array($comment, $commenterName, $commenterURL) as $field) {
if ( preg_match($sp, $field) ) return $isspam = true;
}
}
# Check for bad input for commenterName (seems to be a popular spam location)
$spampatterns = array(
'%<a\\s+%smi',
'%(https?|ftp)://%smi',
'%(\\n|\\r)%smi'
);
foreach ($spampatterns as $sp) if ( preg_match($sp, $commenterName) ) return $isspam = true;
# Fail for length violations
if ( strlen($commenterName)>255 || strlen($commenterURL)>300 ) return $isspam = true;
# We made it this far, leave $isspam alone and give other implementors a chance.
return true;
}
//
hmm i guess that was it... if there are any questions please ask! I hope i didnt forget anything ^^
Hopefully this could help anyone!
AndiRay 08:08, 20 April 2009 (UTC)