http://www.mediawiki.org/wiki/Special:Code/MediaWiki/90918
Revision: 90918
Author: salvatoreingala
Date: 2011-06-27 22:52:59 +0000 (Mon, 27 Jun 2011)
Log Message:
-----------
Added delivering of user-defined messages with proper prefix.
Messages for preferences of gadget 'foo' are stored as MediaWiki:Gadget-foo-*.
Modified Paths:
--------------
branches/salvatoreingala/Gadgets/Gadgets.php
branches/salvatoreingala/Gadgets/backend/GadgetHooks.php
branches/salvatoreingala/Gadgets/backend/GadgetPrefs.php
branches/salvatoreingala/Gadgets/ui/resources/ext.gadgets.preferences.js
branches/salvatoreingala/Gadgets/ui/resources/jquery.formBuilder.js
Modified: branches/salvatoreingala/Gadgets/Gadgets.php
===================================================================
--- branches/salvatoreingala/Gadgets/Gadgets.php 2011-06-27 22:43:27 UTC
(rev 90917)
+++ branches/salvatoreingala/Gadgets/Gadgets.php 2011-06-27 22:52:59 UTC
(rev 90918)
@@ -82,18 +82,3 @@
'localBasePath' => $dir . 'ui/resources/',
'remoteExtPath' => 'Gadgets/ui/resources'
);
-
-$wgResourceModules['ext.gadgets.preferences'] = array(
- 'scripts' => array( 'ext.gadgets.preferences.js' ),
- 'styles' => array( 'ext.gadgets.preferences.css' ),
- 'dependencies' => array(
- 'jquery', 'jquery.json', 'jquery.ui.dialog',
'jquery.formBuilder',
- 'mediawiki.htmlform', 'ext.gadgets'
- ),
- 'messages' => array(
- 'gadgets-configure', 'gadgets-configuration-of',
'gadgets-prefs-save', 'gadgets-prefs-cancel',
- 'gadgets-unexpected-error', 'gadgets-save-success',
'gadgets-save-failed'
- ),
- 'localBasePath' => $dir . 'ui/resources/',
- 'remoteExtPath' => 'Gadgets/ui/resources'
-);
Modified: branches/salvatoreingala/Gadgets/backend/GadgetHooks.php
===================================================================
--- branches/salvatoreingala/Gadgets/backend/GadgetHooks.php 2011-06-27
22:43:27 UTC (rev 90917)
+++ branches/salvatoreingala/Gadgets/backend/GadgetHooks.php 2011-06-27
22:52:59 UTC (rev 90918)
@@ -102,12 +102,50 @@
if ( !$gadgets ) {
return true;
}
+
+ wfProfileIn( __METHOD__ );
+
+ //Recover messages for gadget preferences
+ $messages = array();
+ foreach ( $gadgets as $gadget ) {
+ $prefsDescription = $gadget->getPrefsDescription();
+ if ( $prefsDescription !== null ) {
+ $msgs = GadgetPrefs::getMessages(
$prefsDescription );
+
+ //Adds a prefix to messages of each gadget
+ foreach( $msgs as $idx => $val ) {
+ $messages[] =
"Gadget-{$gadget->getName()}-" . $msgs[$idx];
+ }
+ }
+ }
+
+ //Register the ext.gadgets.preferences module
+ //TODO: fix caching issues for user-defined messages
+ $resourceLoader->register( 'ext.gadgets.preferences', array(
+ 'scripts' => array(
'ext.gadgets.preferences.js' ),
+ 'styles' => array( 'ext.gadgets.preferences.css'
),
+ 'dependencies' => array(
+ 'jquery', 'jquery.json', 'jquery.ui.dialog',
'jquery.formBuilder',
+ 'mediawiki.htmlform', 'ext.gadgets'
+ ),
+ 'messages' => array_merge( $messages, array(
+ 'gadgets-configure',
'gadgets-configuration-of', 'gadgets-prefs-save', 'gadgets-prefs-cancel',
+ 'gadgets-unexpected-error',
'gadgets-save-success', 'gadgets-save-failed'
+ ) ),
+ 'localBasePath' => dirname( dirname( __FILE__ ) ) .
'/ui/resources/',
+ 'remoteExtPath' => 'Gadgets/ui/resources'
+ ) );
+
+ //Register gadgets modules
foreach ( $gadgets as $g ) {
$module = $g->getModule();
if ( $module ) {
$resourceLoader->register( $g->getModuleName(),
$module );
}
}
+
+ wfProfileOut( __METHOD__ );
+
return true;
}
@@ -120,17 +158,17 @@
wfProfileIn( __METHOD__ );
- //tweaks in Special:Preferences
- if ( $out->getTitle()->isSpecial( 'Preferences' ) ) {
- $out->addModules( 'ext.gadgets.preferences' );
- }
-
$gadgets = Gadget::loadList();
if ( !$gadgets ) {
wfProfileOut( __METHOD__ );
return true;
}
+ //tweaks in Special:Preferences
+ if ( $out->getTitle()->isSpecial( 'Preferences' ) ) {
+ $out->addModules( 'ext.gadgets.preferences' );
+ }
+
$lb = new LinkBatch();
$lb->setCaller( __METHOD__ );
$pages = array();
@@ -155,6 +193,7 @@
$done[$page] = true;
self::applyScript( $page, $out );
}
+
wfProfileOut( __METHOD__ );
return true;
Modified: branches/salvatoreingala/Gadgets/backend/GadgetPrefs.php
===================================================================
--- branches/salvatoreingala/Gadgets/backend/GadgetPrefs.php 2011-06-27
22:43:27 UTC (rev 90917)
+++ branches/salvatoreingala/Gadgets/backend/GadgetPrefs.php 2011-06-27
22:52:59 UTC (rev 90918)
@@ -376,4 +376,49 @@
}
}
+ /**
+ * Returns true if $str should be interpreted as a message, false
otherwise.
+ *
+ * @param $str String
+ * @return Mixed
+ *
+ */
+ private static function isMessage( $str ) {
+ return strlen( $str ) >= 2
+ && $str[0] == '@'
+ && $str[1] != '@';
+ }
+
+ /**
+ * Returns a list of (unprefixed) messages mentioned by
$prefsDescription. It is assumed that
+ * $prefsDescription is valid (i.e.:
GadgetPrefs::isPrefsDescriptionValid( $prefsDescription ) === true).
+ *
+ * @param $prefsDescription Array: the preferences description to use.
+ * @return Array: the messages needed by $prefsDescription.
+ */
+ public static function getMessages( $prefsDescription ) {
+ $maybeMsgs = array();
+
+ if ( isset( $prefsDescription['intro'] ) ) {
+ $maybeMsgs[] = $prefsDescription['intro'];
+ }
+
+ foreach ( $prefsDescription['fields'] as $prefName => $prefDesc
) {
+ $maybeMsgs[] = $prefDesc['label'];
+
+ if ( $prefDesc['type'] == 'select' ) {
+ foreach ( $prefDesc['options'] as $optName =>
$value ) {
+ $maybeMsgs[] = $optName;
+ }
+ }
+ }
+
+ $msgs = array();
+ foreach ( $maybeMsgs as $msg ) {
+ if ( self::isMessage( $msg ) ) {
+ $msgs[] = substr( $msg, 1 );
+ }
+ }
+ return array_unique( $msgs );
+ }
}
Modified:
branches/salvatoreingala/Gadgets/ui/resources/ext.gadgets.preferences.js
===================================================================
--- branches/salvatoreingala/Gadgets/ui/resources/ext.gadgets.preferences.js
2011-06-27 22:43:27 UTC (rev 90917)
+++ branches/salvatoreingala/Gadgets/ui/resources/ext.gadgets.preferences.js
2011-06-27 22:52:59 UTC (rev 90918)
@@ -66,7 +66,9 @@
var prefs =
response.getgadgetprefs;
- var dialogBody = $(
prefs ).formBuilder();
+ var dialogBody = $(
prefs ).formBuilder( {
+ gadget: gadget
+ } );
$( dialogBody ).submit(
function() {
return false;
//prevent form submission
Modified: branches/salvatoreingala/Gadgets/ui/resources/jquery.formBuilder.js
===================================================================
--- branches/salvatoreingala/Gadgets/ui/resources/jquery.formBuilder.js
2011-06-27 22:43:27 UTC (rev 90917)
+++ branches/salvatoreingala/Gadgets/ui/resources/jquery.formBuilder.js
2011-06-27 22:52:59 UTC (rev 90918)
@@ -12,14 +12,14 @@
//If str starts with "@" the rest of the string is assumed to be
//a message, and the result of mw.msg is returned.
//Two "@@" at the beginning escape for a single "@".
- function preproc( str ) {
+ function preproc( $form, str ) {
if ( str.length <= 1 || str[0] !== '@' ) {
return str;
} else if ( str.substr( 0, 2 ) == '@@' ) {
return str.substr( 1 );
} else {
//TODO: better validation
- return mw.msg( str.substring( 1 ) );
+ return mw.message( $form.data( 'formBuilder' ).prefix +
str.substring( 1 ) ).plain();
}
}
@@ -63,12 +63,14 @@
}
//A field with no content
- function EmptyField( name, desc ) {
+ function EmptyField( $form, name, desc ) {
//Check existence of compulsory fields
if ( typeof name == 'undefined' || !desc.type || !desc.label ) {
$.error( "Missing arguments" );
}
+ this.$form = $form;
+
this.$p = $( '<p/>' );
this.name = name;
@@ -103,11 +105,11 @@
//A field with just a label
LabelField.prototype = object( EmptyField.prototype );
LabelField.prototype.constructor = LabelField;
- function LabelField( name, desc ) {
- EmptyField.call( this, name, desc );
+ function LabelField( $form, name, desc ) {
+ EmptyField.call( this, $form, name, desc );
var $label = $( '<label/>' )
- .text( preproc( this.desc.label ) )
+ .text( preproc( this.$form, this.desc.label ) )
.attr('for', idPrefix + this.name );
this.$p.append( $label );
@@ -116,8 +118,8 @@
//A field with a label and a checkbox
BooleanField.prototype = object( LabelField.prototype );
BooleanField.prototype.constructor = BooleanField;
- function BooleanField( name, desc ){
- LabelField.call( this, name, desc );
+ function BooleanField( $form, name, desc ){
+ LabelField.call( this, $form, name, desc );
if ( typeof desc.value != 'boolean' ) {
$.error( "desc.value is invalid" );
@@ -140,8 +142,8 @@
StringField.prototype = object( LabelField.prototype );
StringField.prototype.constructor = StringField;
- function StringField( name, desc ){
- LabelField.call( this, name, desc );
+ function StringField( $form, name, desc ){
+ LabelField.call( this, $form, name, desc );
if ( typeof desc.value != 'string' ) {
$.error( "desc.value is invalid" );
@@ -192,8 +194,8 @@
NumberField.prototype = object( LabelField.prototype );
NumberField.prototype.constructor = NumberField;
- function NumberField( name, desc ){
- LabelField.call( this, name, desc );
+ function NumberField( $form, name, desc ){
+ LabelField.call( this, $form, name, desc );
if ( desc.value !== null && typeof desc.value != 'number' ) {
$.error( "desc.value is invalid" );
@@ -251,18 +253,19 @@
SelectField.prototype = object( LabelField.prototype );
SelectField.prototype.constructor = SelectField;
- function SelectField( name, desc ){
- LabelField.call( this, name, desc );
+ function SelectField( $form, name, desc ){
+ LabelField.call( this, $form, name, desc );
var $select = this.$select = $( '<select/>' )
.attr( 'id', idPrefix + this.name )
.attr( 'name', idPrefix + this.name );
var values = [];
+ var self = this;
$.each( desc.options, function( optName, optVal ) {
var i = values.length;
$( '<option/>' )
- .text( preproc( optName ) )
+ .text( preproc( self.$form, optName ) )
.val( i )
.appendTo( $select );
values.push( optVal );
@@ -299,9 +302,10 @@
* Main method; takes the given preferences description object and
builds
* the body of the form with the requested fields.
*
+ * @param {Object} options
* @return {Element} the object with the requested form body.
*/
- function buildFormBody() {
+ function buildFormBody( options ) {
var description = this.get( 0 );
if ( typeof description != 'object' ) {
mw.log( "description should be an object, instead of a
" + typeof description );
@@ -313,7 +317,7 @@
//If there is an "intro", adds it to the form as a label
if ( typeof description.intro == 'string' ) {
$( '<p/>' )
- .text( preproc( description.intro ) )
+ .text( preproc( this.$form, description.intro )
)
.addClass( 'formBuilder-intro' )
.appendTo( $form );
}
@@ -323,6 +327,11 @@
return null;
}
+ var prefix = options.gadget === undefined ? '' : ( 'Gadget-' +
options.gadget + '-' );
+ $form.data( 'formBuilder', {
+ prefix: prefix, //prefix for messages
+ } );
+
var fields = [];
var settings = {}; //validator settings
@@ -341,7 +350,7 @@
var f;
try {
- f = new FieldConstructor( fieldName,
field );
+ f = new FieldConstructor( $form,
fieldName, field );
} catch ( e ) {
mw.log( e );
return null; //constructor failed,
wrong syntax in field description
@@ -362,10 +371,9 @@
var validator = $form.validate( settings );
- $form.data( 'formBuilder', {
- fields: fields,
- validator: validator
- } );
+ var data = $form.data( 'formBuilder' );
+ data.fields = fields,
+ data.validator = validator
return $form;
}
_______________________________________________
MediaWiki-CVS mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-cvs