Difference between revisions of "Extension:AWCmod"
(current state) |
(get the new prefs into the db from prefs or create-account forms) |
||
| Line 19: | Line 19: | ||
'url' => 'http://www.organicdesign.co.nz/Extension:AWCmod', | 'url' => 'http://www.organicdesign.co.nz/Extension:AWCmod', | ||
'version' => AWCMOD_VERSION | 'version' => AWCMOD_VERSION | ||
| − | + | ); | |
| + | # SearchEngine is based on $wgDBtype so must be set before it gets changed to DatabaseAWC | ||
| + | # - this may be paranoid now since $wgDBtype is changed back after LoadBalancer has initialised | ||
AWCmod::fixSearchType(); | AWCmod::fixSearchType(); | ||
$awcDBHook = true; | $awcDBHook = true; | ||
| + | $wgOldDBtype = $wgDBtype; | ||
if (class_exists('Database')) wfAWCmodDBHook(); | if (class_exists('Database')) wfAWCmodDBHook(); | ||
class AWCmod { | class AWCmod { | ||
| + | |||
| + | var $patch = false; | ||
| + | var $oldtag = ''; | ||
function __construct() { | function __construct() { | ||
| − | global $wgHooks, $wgMessageCache, $wgParser; | + | global $wgHooks, $wgMessageCache, $wgParser, $wgTitle; |
$wgHooks['RenderPreferencesForm'][] = $this; | $wgHooks['RenderPreferencesForm'][] = $this; | ||
| − | $wgHooks['UserCreateForm'][] = $this; | + | $wgHooks['UserCreateForm'][] = $this; |
| + | $wgHooks['SavePreferences'][] = $this; | ||
| + | $wgHooks['AbortNewAccount'][] = $this; | ||
# Override the existing AWC tag | # Override the existing AWC tag | ||
| Line 40: | Line 48: | ||
$wgMessageCache->addMessages(array('prefs-help-email' => '<div class="error">Required</div>')); | $wgMessageCache->addMessages(array('prefs-help-email' => '<div class="error">Required</div>')); | ||
$wgMessageCache->addMessages(array('prefs-help-realname' => '<div class="error">Required</div>')); | $wgMessageCache->addMessages(array('prefs-help-realname' => '<div class="error">Required</div>')); | ||
| − | |||
} | } | ||
| Line 56: | Line 63: | ||
function onUserCreateForm(&$template) { | function onUserCreateForm(&$template) { | ||
$template->data['header'] = $this->renderAWCprefs(); | $template->data['header'] = $this->renderAWCprefs(); | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Update the user object when the prefs from the form are saved | ||
| + | */ | ||
| + | function onSavePreferences(&$form, &$user, &$error, &$options) { | ||
| + | $user->setOption('foo', 'onSavePreferences'); | ||
| + | return true; | ||
| + | } | ||
| + | |||
| + | /** | ||
| + | * Update the user object with extra prefs in the account-creation form | ||
| + | */ | ||
| + | function onAbortNewAccount(&$user, &$error) { | ||
| + | $user->setOption('foo', 'onAbortNewAccount'); | ||
return true; | return true; | ||
} | } | ||
| Line 103: | Line 126: | ||
function forum_info($input, $argv) { | function forum_info($input, $argv) { | ||
$this->tagargs = $input; | $this->tagargs = $input; | ||
| + | $this->patch = true; | ||
return call_user_func($this->oldtag, $input, $argv); | return call_user_func($this->oldtag, $input, $argv); | ||
} | } | ||
| Line 110: | Line 134: | ||
*/ | */ | ||
function patchSQL(&$sql) { | function patchSQL(&$sql) { | ||
| − | + | $this->patch = false; | |
| + | |||
| + | # Perform the original query first - a bit of a lame way but not enought time to do better :-/ | ||
| + | $dbr =& wfGetDB(DB_SLAVE); | ||
| + | $res = $dbr->query($sql); | ||
| + | |||
| + | # Scan the results and create a list of exclusions based on user properties | ||
| + | $exc = ''; | ||
| + | while ($row = $dbr->fetchObject($res)) { | ||
| + | $user = User::newFromName($row->t_lastuser == '' ? $row->p_user : $row->t_lastuser); | ||
| + | } | ||
| + | $dbr->freeResult($res); | ||
} | } | ||
| Line 118: | Line 153: | ||
static function updateLB(&$lb) { | static function updateLB(&$lb) { | ||
$lb->closeAll(); | $lb->closeAll(); | ||
| − | foreach ($lb->mServers as $i => $server) $lb->mServers[$i]['type'] = ' | + | foreach ($lb->mServers as $i => $server) $lb->mServers[$i]['type'] = 'AWC'; |
} | } | ||
| Line 141: | Line 176: | ||
function wfAWCmodDBHook() { | function wfAWCmodDBHook() { | ||
global $wgDBtype, $awcDBHook, $wgOldDBtype; | global $wgDBtype, $awcDBHook, $wgOldDBtype; | ||
| − | |||
$oldClass = ucfirst($wgDBtype); | $oldClass = ucfirst($wgDBtype); | ||
$wgDBtype = 'AWC'; | $wgDBtype = 'AWC'; | ||
| Line 147: | Line 181: | ||
public function query($sql, $fname = "", $tempIgnore = false) { | public function query($sql, $fname = "", $tempIgnore = false) { | ||
global $wgAWCmod; | global $wgAWCmod; | ||
| − | if (ereg("^SELECT",$sql) | + | if (is_object($wgAWCmod) && $wgAWCmod->patch |
| + | && ereg("^SELECT",$sql) | ||
&& ereg("awc_f_threads", $sql) | && ereg("awc_f_threads", $sql) | ||
&& ereg("awc_f_forums",$sql) | && ereg("awc_f_forums",$sql) | ||
&& ereg("awc_f_cats",$sql) | && ereg("awc_f_cats",$sql) | ||
&& ereg("awc_f_posts",$sql) | && ereg("awc_f_posts",$sql) | ||
| − | ) | + | ) $wgAWCmod->patchSQL($sql); |
| − | |||
| − | |||
return parent::query($sql, $fname, $tempIgnore); | return parent::query($sql, $fname, $tempIgnore); | ||
} | } | ||
Revision as of 11:53, 16 September 2008
<?php /**
* AWC extension *Template:Php
* @package MediaWiki * @subpackage Extensions * @author Aran Dunkley User:Nad * @licence GNU General Public Licence 2.0 or later */
if (!defined('MEDIAWIKI')) die('Not an entry point.');
define('AWCMOD_VERSION', '0.0.0, 2008-09-13');
$wgExtensionFunctions[] = 'wfSetupAWCmod'; $wgExtensionCredits['other'][] = array( 'name' => 'AWCmod', 'author' => 'User:Nad', 'description' => 'Custom extension for Adeft', 'url' => 'http://www.organicdesign.co.nz/Extension:AWCmod', 'version' => AWCMOD_VERSION );
- SearchEngine is based on $wgDBtype so must be set before it gets changed to DatabaseAWC
- - this may be paranoid now since $wgDBtype is changed back after LoadBalancer has initialised
AWCmod::fixSearchType();
$awcDBHook = true; $wgOldDBtype = $wgDBtype; if (class_exists('Database')) wfAWCmodDBHook();
class AWCmod {
var $patch = false; var $oldtag = ;
function __construct() { global $wgHooks, $wgMessageCache, $wgParser, $wgTitle; $wgHooks['RenderPreferencesForm'][] = $this; $wgHooks['UserCreateForm'][] = $this; $wgHooks['SavePreferences'][] = $this; $wgHooks['AbortNewAccount'][] = $this;
# Override the existing AWC tag $this->oldtag = $wgParser->mTagHooks['forum_info']; $wgParser->mTagHooks['forum_info'] = array($this, 'forum_info');
# Modify login form messages to say email and name compulsory
$wgMessageCache->addMessages(array('prefs-help-email' => '
')); $wgMessageCache->addMessages(array('prefs-help-realname' => '
'));
}
/** * Add the new prefs to a new tab in the preferences form */ function onRenderPreferencesForm(&$form, &$out) { $out->addHTML('<fieldset><legend>Contact details</legend>'.$this->renderAWCprefs().'</fieldset>'); return true; }
/** * Add the new prefs to the "create new account" form */ function onUserCreateForm(&$template) { $template->data['header'] = $this->renderAWCprefs(); return true; }
/** * Update the user object when the prefs from the form are saved */ function onSavePreferences(&$form, &$user, &$error, &$options) { $user->setOption('foo', 'onSavePreferences'); return true; }
/** * Update the user object with extra prefs in the account-creation form */ function onAbortNewAccount(&$user, &$error) { $user->setOption('foo', 'onAbortNewAccount'); return true; }
/** * Return the HTML for the AWC preference inputs */ function renderAWCprefs() {
$html = '
$this->addRow( wfLabel('Phone', 'wpPhone'), wfInput('wpPhone', 20, , array('id' => 'wpPhone')), 'Required' ) . $this->addRow( wfLabel('Mobile', 'wpMobile'), wfInput('wpMobile', 20, , array('id' => 'wpMobile')) ) . $this->addRow( wfLabel('Business', 'wpBusiness'), wfInput('wpBusiness', 20, , array('id' => 'wpBusiness')), 'Can be "none"' ) . $this->addRow( wfLabel('Website', 'wpWebsite'), wfInput('wpWebsite', 20, , array('id' => 'wpWebsite')) ) . $this->addRow( wfLabel('Zip Code', 'wpZipCode'), wfInput('wpZipCode', 10, , array('id' => 'wpZipCode')), 'Required'
) . '';
return $html; }
function addRow($td1, $td2, $td3 = ) {
return " $td1: $td2
"; } /** * AWC forum_info tag is overridden with this one to catch the tag parameters */ function forum_info($input, $argv) { $this->tagargs = $input; $this->patch = true; return call_user_func($this->oldtag, $input, $argv); } /** * Patch the SQL used by the forum_info tag to filter by user properties */ function patchSQL(&$sql) { $this->patch = false; # Perform the original query first - a bit of a lame way but not enought time to do better :-/ $dbr =& wfGetDB(DB_SLAVE); $res = $dbr->query($sql); # Scan the results and create a list of exclusions based on user properties $exc = ; while ($row = $dbr->fetchObject($res)) { $user = User::newFromName($row->t_lastuser == ? $row->p_user : $row->t_lastuser); } $dbr->freeResult($res); } /** * Updates passed LoadBalancer's DB servers to secure class */ static function updateLB(&$lb) { $lb->closeAll(); foreach ($lb->mServers as $i => $server) $lb->mServers[$i]['type'] = 'AWC'; } /** * Hack to ensure proper search class is used * - $wgDBtype determines search class unless already defined in $wgSearchType * - just copied method from SearchEngine::create() */ static function fixSearchType() { global $wgDBtype, $wgSearchType; if ($wgSearchType) return; elseif ($wgDBtype == 'mysql') $wgSearchType = 'SearchMySQL4'; elseif ($wgDBtype == 'postgres') $wgSearchType = 'SearchPostgres'; elseif ($wgDBtype == 'oracle') $wgSearchType = 'SearchOracle'; else $wgSearchType = 'SearchEngineDummy'; } } /** * Hook in to DB class to allow overriding the AWC query (based on SimpleSecurity method) */ function wfAWCmodDBHook() { global $wgDBtype, $awcDBHook, $wgOldDBtype; $oldClass = ucfirst($wgDBtype); $wgDBtype = 'AWC'; eval("class Database{$wgDBtype} extends Database{$oldClass}".' { public function query($sql, $fname = "", $tempIgnore = false) { global $wgAWCmod; if (is_object($wgAWCmod) && $wgAWCmod->patch && ereg("^SELECT",$sql) && ereg("awc_f_threads", $sql) && ereg("awc_f_forums",$sql) && ereg("awc_f_cats",$sql) && ereg("awc_f_posts",$sql) ) $wgAWCmod->patchSQL($sql); return parent::query($sql, $fname, $tempIgnore); } }'); $awcDBHook = false; } function wfSetupAWCmod() { global $wgAWCmod, $awcDBHook, $wgLanguageCode, $wgMessageCache, $wgLoadBalancer, $wgDBtype, $wgOldDBtype; # Instantiate the AWC singleton now that the environment is prepared $wgAWCmod = new AWCmod(); # If the DB hook couldn't be set up early, do it now # - but now the LoadBalancer exists and must have its DB types changed if ($awcDBHook) { wfAWCmodDBHook(); if (function_exists('wfGetLBFactory')) wfGetLBFactory()->forEachLB(array('AWCmod', 'updateLB')); elseif (is_object($wgLoadBalancer)) AWCmod::updateLB($wgLoadBalancer); else die("Can't hook in to Database class!"); } # Request a DB connection to ensure the LoadBalancer is initialised, # then change back to old DBtype since it won't be used for making connections again but can affect other operations # such as $wgContLang->stripForSearch which is called by SearchMySQL::parseQuery wfGetDB(); $wgDBtype = $wgOldDBtype; # Add messages if ($wgLanguageCode == 'en') { $wgMessageCache->addMessages(array( 'awc-prefhead' => "AWC" )); } }



