Difference between revisions of "Extension:EmailPage"
(wrap in #bodyContent div) |
|||
| Line 34: | Line 34: | ||
require_once("$IP/includes/SpecialPage.php"); | require_once("$IP/includes/SpecialPage.php"); | ||
class SpecialEmailArticle extends SpecialPage { | class SpecialEmailArticle extends SpecialPage { | ||
| + | |||
| + | var $recipients = array(); | ||
# Constructor | # Constructor | ||
| Line 43: | Line 45: | ||
# Override SpecialPage::execute($param = '') | # Override SpecialPage::execute($param = '') | ||
function execute($param) { | function execute($param) { | ||
| − | global $wgOut,$wgUser,$wgEmailArticleContactsCat; | + | global $wgOut,$wgUser,$wgEmailArticleContactsCat,$wgGroupPermissions; |
$title = Title::makeTitle(NS_SPECIAL,'EmailArticle'); | $title = Title::makeTitle(NS_SPECIAL,'EmailArticle'); | ||
| Line 57: | Line 59: | ||
$db =& wfGetDB(DB_SLAVE); | $db =& wfGetDB(DB_SLAVE); | ||
$cl = $db->tableName('categorylinks'); | $cl = $db->tableName('categorylinks'); | ||
| − | $cats = ''; | + | $cats = '<option/>'; |
$result = $db->query("SELECT cl_from FROM $cl WHERE cl_to = '$wgEmailArticleContactsCat' ORDER BY cl_sortkey"); | $result = $db->query("SELECT cl_from FROM $cl WHERE cl_to = '$wgEmailArticleContactsCat' ORDER BY cl_sortkey"); | ||
while ($row = mysql_fetch_row($result)) { | while ($row = mysql_fetch_row($result)) { | ||
| Line 63: | Line 65: | ||
if ($t->getNamespace() == NS_CATEGORY) $cats .= "<option>{$t->getText()}</option>"; | if ($t->getNamespace() == NS_CATEGORY) $cats .= "<option>{$t->getText()}</option>"; | ||
} | } | ||
| − | if ($cats) $wgOut->addHTML("From category: <select name=\"sf_cat\">$cats</select>"); | + | if ($cats) $wgOut->addHTML("From category: <select name=\"sf_cat\">$cats</select><br>\n"); |
} | } | ||
| − | $wgOut->addHTML( | + | # Allow selection of a group |
| − | + | $groups = '<option/><option>'.join('</option><option>',array_keys($wgGroupPermissions)).'</option>'; | |
| − | + | $wgOut->addHTML("From group: <select name=\"sf_group\">$groups</select><br>\n"); | |
| − | + | ||
| − | + | # Addition of named list | |
| + | $wgOut->addWikiText(wfMsg('ea_selectlist')); | ||
| + | $wgOut->addHTML(<textarea name="sf_list" cols=25 rows=10></textarea>'.wfElement('input',array('type' => 'submit')); | ||
| + | |||
| + | $wgOut->addHTML('</form>'); | ||
} | } | ||
| Line 76: | Line 82: | ||
function send($title) { | function send($title) { | ||
global $wgOut,$wgUser,$wgServer,$wgScript,$wgEmailArticleCss; | global $wgOut,$wgUser,$wgServer,$wgScript,$wgEmailArticleCss; | ||
| + | $subject = $_REQUEST['sf_subject']; | ||
| + | $header = $_REQUEST['sf_header']; | ||
| + | $cat = $_REQUEST['sf_cat']; | ||
| + | $group = $_REQUEST['sf_group']; | ||
| + | $list = $_REQUEST['sf_list']; | ||
| + | $textonly = $_REQUEST['sf_textonly']; | ||
| + | |||
| + | # Recipients from cat | ||
| − | # | + | # Recipients from group |
| − | + | ||
| − | + | # Recipients from list | |
| − | + | foreach (preg_split("/[\\x00-\\x1f,;*]+/",$list) as $item) $this->addRecipient(); | |
| − | |||
| − | |||
| − | |||
# get the wikitext content of the article to send | # get the wikitext content of the article to send | ||
| Line 112: | Line 123: | ||
# Set up new mailer instance | # Set up new mailer instance | ||
| − | $mail = new PHPMailer(); | + | $mail = new PHPMailer(); |
| − | $mail->From = $wgUser->isValidEmailAddr() ? $wgUser->getEmail() : "wiki@$wgServer"; | + | $mail->From = $wgUser->isValidEmailAddr() ? $wgUser->getEmail() : "wiki@$wgServer"; |
| − | $mail->FromName = $ | + | $mail->FromName = $wgUser->getName(); |
| + | $mail->Subject = $subject; | ||
| + | $mail->Body = $message; | ||
$mail->IsHTML(!$textonly); | $mail->IsHTML(!$textonly); | ||
| − | foreach ( $ | + | foreach ($this->recipients as $recipient) $mail->AddAddress($recipient); |
| − | |||
| − | |||
# Send message and redirect client back to article or raise error | # Send message and redirect client back to article or raise error | ||
| − | $ | + | if ($state = $mail->Send()) $msg = wfMsg('ea_sent',$title,count($this->recipients),$mail->FromName); |
| − | + | else $msg = wfMsg('ea_error',$title,$mail->ErrorInfo); | |
| − | + | $wgOut->addWikiText($msg); | |
| − | + | return $state; | |
| − | |||
| − | |||
} | } | ||
| Line 138: | Line 147: | ||
if ($wgLanguageCode == 'en') { | if ($wgLanguageCode == 'en') { | ||
$wgMessageCache->addMessages(array( | $wgMessageCache->addMessages(array( | ||
| − | 'emailarticle' => | + | 'emailarticle' => "EmailArticle", |
'ea_noarticle' => "Please specify an article to send, for example [[Special:EmailArticle/Main Page]].", | 'ea_noarticle' => "Please specify an article to send, for example [[Special:EmailArticle/Main Page]].", | ||
| − | 'ea_error' => "Error: '''$1 | + | 'ea_error' => "'''Error sending [[$1]]:''' ''$1''", |
| − | ' | + | 'ea_sent' => "Article [[$1]] sent successfully to '''$2''' {{PLURAL:recipient|recipients}} by [[User:$3|$3]].", |
| − | |||
'ea_selectrecipients' => "Select the recipients" | 'ea_selectrecipients' => "Select the recipients" | ||
| + | 'ea_selectlist' => "Additional recipients as article titles or email addresses<br>''commas, semicolons, asterisks and newlines all act as separators''" | ||
)); | )); | ||
} | } | ||
Revision as of 01:01, 5 June 2007
<?php
- Extension:EmailArticle
- - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
- - Author: User:NadCategory:Extensions created with Template:SpecialPage
- - See http://www.mediawiki.org/wiki/Extension:EmailArticle for installation and usage details
$wgShowExceptionDetails = true;
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('EMAILARTICLE_VERSION','0.0.0, 2007-05-25');
$wgEmailArticleGroup = 'postmaster'; # Users must belong to this group to send emails (empty string means anyone can send) $wgEmailArticleContactsCat = 'Contacts'; # This specifies the name of a category containing categories of contact articles $wgEmailArticleCss = 'EmailArticle.css'; # A minimal CSS article to embed in the email (eg. monobook/main.css without portlets, actions etc) $wgPhpMailerClass = dirname(__FILE__).'/phpmailer/class.phpmailer.php'; # From http://phpmailer.sourceforge.net/
if ($wgEmailArticleGroup) $wgGroupPermissions['sysop'][$wgEmailArticleGroup] = true;
$wgExtensionFunctions[] = 'wfSetupEmailArticle';
$wgExtensionCredits['specialpage'][] = array( 'name' => 'Special:EmailArticle', 'author' => 'User:Nad', 'description' => 'Send rendered article to an email address or list of addresses', 'url' => 'http://www.mediawiki.org/wiki/Extension:EmailArticle', 'version' => EMAILARTICLE_VERSION );
- If form has been posted, include the phpmailer class
if (isset($_REQUEST['sf_cat'])) require_once($wgPhpMailerClass);
- Define a new class based on the SpecialPage class
require_once("$IP/includes/SpecialPage.php"); class SpecialEmailArticle extends SpecialPage {
var $recipients = array();
# Constructor function SpecialEmailArticle() { global $wgEmailArticleGroup; SpecialPage::SpecialPage('EmailArticle',$wgEmailArticleGroup); }
# Override SpecialPage::execute($param = ) function execute($param) { global $wgOut,$wgUser,$wgEmailArticleContactsCat,$wgGroupPermissions; $title = Title::makeTitle(NS_SPECIAL,'EmailArticle');
# If the form has been posted, attempt to send the message if (isset($_REQUEST['sf_cat'])) $this->send($param); elseif ($param == ) return $wgOut->addWikiText(wfMsg('ea_noarticle'));
$wgOut->addWikiText(wfMsg('ea_selectrecipients')); $wgOut->addHTML(wfElement('form',array('action' => $title->getLocalURL('action=submit'),'method' => 'POST'),null));
# If $wgEmailArticleContactsCat is set, create a select list of all categories
if ($wgEmailArticleContactsCat) {
$db =& wfGetDB(DB_SLAVE);
$cl = $db->tableName('categorylinks');
$cats = '<option/>';
$result = $db->query("SELECT cl_from FROM $cl WHERE cl_to = '$wgEmailArticleContactsCat' ORDER BY cl_sortkey");
while ($row = mysql_fetch_row($result)) {
$t = Title::newFromID($row[0]);
if ($t->getNamespace() == NS_CATEGORY) $cats .= "<option>{$t->getText()}</option>";
}
if ($cats) $wgOut->addHTML("From category: <select name=\"sf_cat\">$cats</select>
\n");
}
# Allow selection of a group
$groups = '<option/><option>'.join('</option><option>',array_keys($wgGroupPermissions)).'</option>';
$wgOut->addHTML("From group: <select name=\"sf_group\">$groups</select>
\n");
# Addition of named list $wgOut->addWikiText(wfMsg('ea_selectlist')); $wgOut->addHTML(<textarea name="sf_list" cols=25 rows=10></textarea>'.wfElement('input',array('type' => 'submit'));
$wgOut->addHTML('</form>'); }
# Send the message to the recipients function send($title) { global $wgOut,$wgUser,$wgServer,$wgScript,$wgEmailArticleCss; $subject = $_REQUEST['sf_subject']; $header = $_REQUEST['sf_header']; $cat = $_REQUEST['sf_cat']; $group = $_REQUEST['sf_group']; $list = $_REQUEST['sf_list']; $textonly = $_REQUEST['sf_textonly'];
# Recipients from cat
# Recipients from group
# Recipients from list foreach (preg_split("/[\\x00-\\x1f,;*]+/",$list) as $item) $this->addRecipient();
# get the wikitext content of the article to send $title = Title::newFromText($title); $article = new Article($title); $message = $article->getContent();
if ($header) $message = "$header\n\n$message";
# Convert the message text to html unless textonly if ($textonly == ) {
# Parse the wikitext $parser = new Parser; $opt = new ParserOptions; $message = $parser->parse($message,$title,$opt,true,true)->getText();
# Convert any relative URL's to absolute $message = preg_replace("|\\W$wgScript|i",$wgServer.$wgScript,$message);
# Create a simple html wrapper with embedded CSS for the message content $article = new Article(Title::newFromText($wgEmailArticleCss)); $css = $article->getContent(); $head = "<head><style type=\"text/css\">$css</style></head>"; $message = "$head
";
}
# Set up new mailer instance $mail = new PHPMailer(); $mail->From = $wgUser->isValidEmailAddr() ? $wgUser->getEmail() : "wiki@$wgServer"; $mail->FromName = $wgUser->getName(); $mail->Subject = $subject; $mail->Body = $message; $mail->IsHTML(!$textonly); foreach ($this->recipients as $recipient) $mail->AddAddress($recipient);
# Send message and redirect client back to article or raise error if ($state = $mail->Send()) $msg = wfMsg('ea_sent',$title,count($this->recipients),$mail->FromName); else $msg = wfMsg('ea_error',$title,$mail->ErrorInfo); $wgOut->addWikiText($msg); return $state; }
}
- Called from $wgExtensionFunctions array when initialising extensions
function wfSetupEmailArticle() { global $wgLanguageCode,$wgMessageCache;
# Add the messages used by the specialpage
if ($wgLanguageCode == 'en') {
$wgMessageCache->addMessages(array(
'emailarticle' => "EmailArticle",
'ea_noarticle' => "Please specify an article to send, for example Special:EmailArticle/Main Page.",
'ea_error' => "Error sending $1: $1",
'ea_sent' => "Article $1 sent successfully to $2 recipients by $3.",
'ea_selectrecipients' => "Select the recipients"
'ea_selectlist' => "Additional recipients as article titles or email addresses
commas, semicolons, asterisks and newlines all act as separators"
));
}
# Add the specialpage to the environment SpecialPage::addPage(new SpecialEmailArticle()); } ?>



