Extension talk:VariablesExtension

Variables and Conditional Parser Functions
It must be noted that everything in conditionals gets executed (though only one result gets displayed). Because of this, every instance of #vardefine will always get executed, regardless of to what the conditional gets evaluated.

Given the following:

gives prevvalue.

Instead you have to nest the conditional inside #vardefine:

In this case, gives nextvalue.

&mdash;Sledged 16:12, 24 October 2006 (UTC)

Multiple assignments
It would be good if this extension allowed multiple assignments. Say I have a template data that contains a=1|b=2. I call and usedata gets one template-variable, a, with value 1|b=2. If I could make data say a=1,b=2 and usedata could call variablesextension to set both variables at once, that would be useful.--201.216.136.95 18:24, 10 January 2007 (UTC)

Bugzilla request
The bug requesting this to be added for the big sites (wikipedia, etc.) is 8570. If you really want these functions, go (register and) vote for that bug. If you have an concern, that bug would also be an appropriate place to express it.--201.216.136.95 18:24, 10 January 2007 (UTC)

MediaWiki version 1.9
How is the compability with MediaWiki version 1.9?

use of undefined variables
Sometimes you want to use a variable which has not been set before and you expect it to return an empty string. I suggest to change the code of function "varf" as follows: function varf( &$parser, $expr = '' ) { if (isset($this->mVariables) && array_key_exists($expr,$this->mVariables)) return $this->mVariables[$expr]; return ''; }
 * 84.58.192.102 09:11, 28 January 2008 (UTC)

Number incrementing through page
I'm trying to write a template, two templates in fact, that will increment a number through a page, ie. @undefined @undefined @undefined

@undefined @undefined

@@ starts the counter at 1 and prints it and @ increments the number and prints it.

I expect the following to appear: 1 2 3 4 1 2 3

But I get the following: 1 2 2 2 1 2 2

I'm using the following code for the templates.

Template: @@

Template: @

Thanks.

--Wahooney 14:05, 11 April 2008 (UTC)
 * Your problem is that variables don't persist across templates, so you need to pass the value of n from @@ to @. So, your page needs to be:

@undefined @undefined @undefined

@undefined @undefined
 * --Snuck 05:31, 15 April 2008 (UTC)

@undefined @undefined @undefined
 * On a 1.12 version of MediaWiki, I get 1 2 3 4 1 5 6 which is not what was expected, but:

@undefined @undefined gives (to me): 1 2 3 4 1 2 3. --Nbrouard 14:38, 25 June 2008 (UTC)

@undefined @undefined @undefined

@undefined @undefined is also working with the new parser. --Nbrouard 15:14, 26 June 2008 (UTC)

Multiple inclusions in a template, still counting
Let funcone be the following template: @undefined @undefined @undefined @undefined Inclusion of content

Redefining n for second inclusion

@undefined @undefined Second inclusion of content

after second content

Trying on the following wiki text: Testing Funcone

@undefined

I get:
 * Testing Funcone 1 2 3 4 5 Inclusion of content 6 7 8 9 10 Redefining n for second inclusion
 * 37 38 Second inclusion of content 6 7 8 9 10 after second content 39

instead of:
 * Testing Funcone 1 2 3 4 5 Inclusion of content 6 7 8 9 10 Redefining n for second inclusion
 * 37 38 Second inclusion of content 39 40 41 42 43 after second content 44

Any idea to make substitution earlier? --Nbrouard 13:10, 30 June 2008 (UTC)


 * Mmmh, until now I thought the default behaviour is, that a variable is global (global means all over the article for all templates which are called from the article). I often use a variable with very special name like "countCalls" as "global variable" which is defined in template X. In another call of Template X or another Template Y I can see if the template was already called in this article or not.
 * Perhaps it should be possible to define local variables and global vars like  . So the default would be local variables which are only available at the current call of the template or on the article page but NOT in sub-calls of templates.
 * On the other hand, perhaps default behaviour should be global variable like it's now in the current version of MW so you would have  for local ones and   for global ones. Than you could call it with   btw.  . Global variables are also good for using them as a kind of template parameters in very complex templates which work with semantic forms arraymap function or something like that where you can call a template but can't give common template parameter values.
 * Normally I would say that local must be the default behaviour of such a variable. But the compatibility to the oder versions of these plugins should be as big as possible and it looks like currently (MW 1.13) all variables are “global”. But perhaps here should be a cut and everybody who wants to use the new version perhaps must change some templates. I hope this is going to be implemented, would be very useful and it would ensure that we could avoid such strange behaviours in the future. --Danwe 22:04, 11 February 2009 (UTC)
 * I thought about page global variables again and I just came to the conclusion that additional functions to define global/private variables would be to much functions. better would be to define a prefix in globalsettings.php (or an default prefix) which defines global or private variables. The default (private or global) could be defined in the globalsettings as well, so the compatibility to the actual version would be given to each wiki.
 * for example could define a page global var you can use it with . Each var which is defined without the prefix would be private by default.


 * An alternative would be a third parameter in #vardefine like, the default behaviour should be configurable in the localsettings.php too.


 * I prefer the first method because I already use the prefix  for variables which I use as global vars yet. But the main reason is that this method has no name conflicts like a private and a global var with same names. --Danwe 11:12, 28 March 2009 (UTC)

Complications
The wiki I work on is on the brink of updating from 1.11 to 1.13 (two days from now). We use a huge number of variables, mostly so we can get data in and out of templates. Some of our templates set many variables meanwhile other templates utilize multiple dynamic variables. We use the variables and templates to centralize information and make editing easier on the user. They can utilize a template that accesses many variables and not have to deal with the very ugly logistics of where the data is coming from.

If you need some examples:
 * http://wiki.secondlife.com/wiki/Template:LSL_Param - Variable parameters get floating text by taking the variable name and plucking the description from memory. The user need not know where the information is to have it accessible.
 * http://wiki.secondlife.com/wiki/Template:LSL_Constants/PrimitiveParams - Utilizes a huge number of templates to set the values of a huge number of variables, the end result is a table and many additional variables that have accumulated in the process.
 * http://wiki.secondlife.com/wiki/llSetPrimitiveParams utilizes the previous templates, the actual source of this articles is very light compared to what it is actually doing for the articles.

What can I do so that I literally don't have to rework 50 to 100 templates and thousands of articles? -- BlindWanderer 21:54, 21 October 2008 (UTC)

Default Value
Am I missing how to declare a default value when recalling it? Or does that need to be defined only when defining it? 68.226.0.35 16:58, 8 December 2008 (UTC)
 * It's not possible to use a default value like . I think that would be a great improvement. I really often have to use something like:   what is much more code than only  would be!


 * Please, would you add this feature into the plugin? --Danwe 21:46, 11 February 2009 (UTC)
 * Looks like there is no one left who's developing this plugin. So I decided to release a new version 1.2 which contains this feature. --Danwe 12:53, 28 March 2009 (UTC)

Use in Wikiprojects
Is it planned to install this extension in Wikipedia and other projects too? It would be extremelly useful for creating templates. Nevertheless, now it doesn't work. --Petrus Adamus 22:06, 19 February 2009 (UTC)
 * I think this is the wrong place to discuss this. Perhaps you should ask that on the wikipedia project page. But I don't think they will use it because every new extension could be a security hole and maybe they are afraid of it would be to complicated and to much for some users. --Danwe 17:01, 21 February 2009 (UTC)
 * It has been requested here, but the answer was (and still is) "no." —Sledged (talk) 23:47, 25 February 2009 (UTC)

Caching bug?
I think I've found a bug in the extension, using version 1.1 on MediaWiki 1.13.3. Assuming you have ParserFunctions installed, say you have a template called Startthevariable containing  and a template called Increasevariable containing. Let's say you then run this code in a page:

The result for this should ideally be. However, the actual result comes out as. Note the various ways Increasevariable is called, some with a |, and some actually specifying a parameter after it. Also note that it does not have any place to accept those parameters in the template itself. So, to recap, if it isn't called with a parameter, it will always return what it returned the first time it was run. If it is called with a parameter, no matter what the parameter is, it will increment it how it should have been incremented in the first place. It won't cache even if you run it with the same parameter multiple times.

Sorry if this seems a little wordy or weird, or if I haven't explained myself well enough. 98.15.203.22 23:30, 21 March 2009 (UTC)
 * This is exactly the same what we discussed above under Number incrementing through page.
 * But this is very strange it's obviously a bug!
 * My explenation for this phenomenon is that Mediawiki simply calculates the content of templates without parameter one thime and after that all the calls for this template without any parameter getting replaced. After that alle the templates with parameters are calculated one after another because they could have dynamic contents because of the parameters. Template calls without parameter normaly have the same text because there is no variable content inside them. At least untill the variables extension came.


 * Try the following code as code of increasevariable:


 * with this code:


 * the result is:

1 2 1 2 2 3 1 2 1 2 3 4 4 5 5 6 6 7 7 8 8 9 1 2 1 2 1 2
 * The first number shows the value of #var:i before the template call, the second the value after the call. Behind that you can see the exact template call.


 * This shows us that the #vardefine and #expr functions itself woriking as expected. I think actually variables only should be used inside one template or page but not as page global variables. I'd love to see such global page variables working like expected. It would be very helpful for some issues. Adding a (void) parameter to any template wich won't need a parameter should help too. --77.191.250.232 02:15, 28 March 2009 (UTC)

Implementation of variable scopes like private, public and static
I am just about to implement the above mentioned private and public variables scope. But there is a big problem and I found no possibility to get rid of it:

I am just able to add the hook Manual:Hooks/BeforeParserFetchTemplateAndtitle into the class which tells me when the parser calls a template, I also can get the name of the template so I know when I have to enter into a new private scope or something. But I still can't find a hook which tells me when the parser is thru with a template. But I need to know wich part of the template the parser handles when he found an variables parserfunction so I could take the variable from the right variables scope. Any ideas? --Danwe 23:32, 11 May 2009 (UTC)

varexists function
A function with which it's possible to check if a variable already is defined would be helpful. You can use  but it could be possible that a variable is defined but only has an void content, it's not possible to differ between void but defined and undefinet variables yet. --77.191.148.245 10:54, 28 March 2009 (UTC)
 * I just added this and released a new version 1.2 with varexists function and the possibility to add a parameter to var function which contains a string which is the output when the variable is void or undefined. --Danwe 12:50, 28 March 2009 (UTC)
 * The #varexists: function of the 1.2 version seems to have a slight bug, in that it assumes there is at least one variable already defined on your page (to have triggered creation of the mVariables array). Invoking it on a page where there are (yet) no variables defined generates a PHP error message complaining about the second argument to array_key_exists.  See  below for the code.  --Paul Lustgarten 20:45, 30 March 2009 (UTC)
 * Thanks, I just added this little change in the extension code. --Danwe 18:27, 6 April 2009 (UTC)

Accept Command Line Args
In using this extension, we find it useful to have the option of defining variables within the page's URL (e.g., tacking on "&fish=swimming&cow=moo" to define the variables "fish" & "cow" to have the values "swimming" and "moo", respectively). This is like assimilating the function of the #arg: parser function from the Extension:DynamicFunctions extension.

Also, specific to the new 1.2 version, we find some boundary conditions where the mVariables array is referenced before being defined, so propose that it be automatically defined as part of the class.

Here are the modified portions of the v1.2 Variables.php code incorporating these changes, for your consideration: This extends the #var:</tt> and #varexists:</tt> functions to pull a variable's definition from this page's URL (if a definition is present there), if that variable is not already defined in the mVariables</tt> array.

It also guarantees that the mVariables</tt> array always exists, so we can successfully call #varexists:</tt> on a wiki page in which no variables have yet been defined. --Paul Lustgarten 20:55, 30 March 2009 (UTC)
 * I'am not sure if I understood that poperly. You want to use page parameters to define vars. But what if you'd like to define a var called action which is a page parameter which already has a meaning on MW? Isn't a syntax like &var_fish=swimming&var_cow=moo a better one?


 * Your code is not working for me, I tried &fish=swimming&cow=moo in the url and added  to the page. The result was the alternative text. Shouldn't be the result swimming and moo? --Danwe 18:40, 6 April 2009 (UTC)

--Paul Lustgarten 15:00, 17 April 2009 (UTC)
 * The first character of the query portion of a URL needs to be a "?", not a "&". Try adding ?fish=swimming&cow=moo to the URL.


 * There is also still another bug in your modified code. Void variables with default values like  return a void string instead of defaultvalue. Per definition in the current version 1.2.2 the output for defined but void variables AND for undefined variables should be defaultvalue. --Danwe 14:03, 15 April 2009 (UTC)

I, likewise, had run into the collision with internally-used variable names such as "action". The solution I have implemented now works, but yours (using a "var_" prefix on each variable) is probably better. Part of the challenge (which I have now solved but hadn't when I first posted this) is how to change the core wiki code itself (in includes/Title.php) so that one can provide variables as part of an internal page link - the best syntax for which I've been able to come up with being this: (I'd love to simplify/improve on that syntax somehow - any suggestions?.) And that then motivates changing includes/parser/Parser.php to remove the suppression of selflinks, so that we can even do this: Combined with some #if:'s, we can start to craft some interestingly adaptive pages! And I hadn't noticed that refs to a void var return its default value. I'm working to meet a deadline these next couple weeks (to demo the stuff I'm building for which this is one of the building blocks, in fact), and will post a new & improved set of changes after I'm clear of that. (And I fixed my email prefs on this wiki so I'll be notified of comments; I didn't see yours until yesterday :- --Paul Lustgarten 15:00, 17 April 2009 (UTC)
 * Danwe - Those are good points you raise.

dead and unused code
I think the answer to these questions is that people forgot to remove them. -- BlindWanderer 16:03, 11 May 2009 (UTC)
 * 1) Why is "author" defined twice?
 * 2) Why is "$wgMessageCache" included twice but never used?
 * I think I forgot to remove the first one perhaps. Removing $wgMessageCache shouldn't be a problem, don't know why this was declared perhaps it was used before. --Danwe 23:23, 11 May 2009 (UTC)

Minor bug: Undefined index in Variables.php on line 33 (function varf)
Replace

function varf( &$parser, $expr = , $defaultVal =  ) { if ( $this->mVariables[$expr] != '' ) { return $this->mVariables[$expr]; } else { return $defaultVal; }   }

by

function varf( &$parser, $expr = , $defaultVal =  ) { if ( array_key_exists($expr, $this->mVariables) && $this->mVariables[$expr] != '' ) { return $this->mVariables[$expr]; } else { return $defaultVal; }   }

--F.trott 09:27, 28 August 2009 (UTC)

Toggle Variable
Just a simple solution I needed to toggle a variable between two values. Maybe someone can use it.

Usage: Toggle variable between value1 and value2. value1 will be the default value if the variable is undefined or has no matching value. If no values are specified the default values 1 and 0 will be used.

Same as #vartoggle but with output.

Examples: Toggle variable bool between 1 and 0.

Toggle variable foo between odd and even with output.

&mdash;Cbaoth 18:06, 05 December 2009 (CET)


 * Perhaps for $val2  would be a better default value because it would be like true and false than. 0 is not really like false when you ask with parser functions for  it will return true.


 * All in all I think that this is a very particular function which would be better off in a common template than as a variable function --Danwe 16:35, 18 December 2009 (UTC)

vardefineecho works, but vardefine doesn't?
I'm trying to use vardefine in a template, but it doesn't seem to work. Vardefineecho does, however. If I use the following code:

the page shows this: which seems to imply the vardefine function doesn't even get called. However, if I use this:

the page shows this: testvalue 1 which is what you would expect. I looked at the extension's source, and the only difference between the two functions is that vardefine returns an empty string and vardefineecho returns the variable's value. What is going on here? RdeRoos 09:09, 24 January 2010 (UTC)
 * Strange. It works for me both ways. The first example simply displays 1. I even tried it in a void template. --Danwe 22:52, 26 January 2010 (UTC)
 * Yeah, I'm completely baffled by this. Guess I'm going to randomly try things and hope I find a solution. If I find one, I'll post it here, should anyone else run into this problem --RdeRoos 11:21, 28 January 2010 (UTC)
 * Here is my fix for the problem. Open the Language.php, which you can find in the folder languages, search there for the row with the following content: "function getMagic( &$mw )" that you have to replace with "function getMagic( $mw )". After that edit the article and save it again and it works. --H3llGost 22:47, 28 January 2010 (UTC+1)

#varundefine suggested
This seems like a very nice extension, which would be useful for avoiding error in repeatedly coalling the approprate form of a template -- for example, in switching between showing and suppressing endnote "superscripts" in fact-checked children's books like the Wikijunior books. (https://bugzilla.wikimedia.org/show_bug.cgi?id=3264).

I think it might be useful to include #varundefine in the extension. Would something like the following be appropriate for the associative splice

--SV Resolution 15:58, 29 January 2010 (UTC)


 * Please describe what exactly this function should be good for and what the function is supposed to do. --Danwe 08:18, 1 August 2010 (UTC)

Extension breaks code
This extension is breaking the coding on my wiki here. I don't know how to make it work correctly. Any suggestions?Neo of ZW 18:01, 13 February 2010 (UTC)
 * Nevermind. I resolved the problem.Neo of ZW 07:03, 14 February 2010 (UTC)

Big Job Queue/Import bug solved in 1.3
There was a critical bug which lead to variable values being global between pages. When you import pages with Special:Import and the first page A uses a variable x, your second page B uses this variable to but doesn't define it first, the value from page A is the value which gets printed in page B when calling  function. I solved this bug in version 1.3 by using the ParserClearState hook. The bug also happened in some job queue scenarios and on Extension:Semantic MediaWiki data refreshments. I solved this bug in Extension:ArrayExtension and Extension:HashTables as well. --Danwe 12:22, 20 July 2010 (UTC)


 * Well, I'm using the VariablesExtension and ArrayExtension here. A few weeks ago I updated the MediaWiki-Software (1.16.0) and, by the way, the used extensions, too. Both extensions, VariablesExtension (1.3) as well as ArrayExtension (1.3.1), do not operate accurate. You define a variable . Followed by some template calls using this Extension:DynamicPageList (third-party). And after those calls you need the data of the before defined variable. With VariablesExtension (1.2.2) no problems, I get 12. Using the current version, I get an empty string. And it's no matter whether those templates using variables or not- --Wgkderdicke 00:44, 30 August 2010 (UTC)


 * Sounds like a bug provoked by the DynamicPageList extension. Somehow this extension seems to trigger the ParserClearState hook even before the parser has finished rendering the current article. This can cause bugs in several extensions. Somebody should look into this, I will add a topic on the DynamicPageList talk page.
 * Most interesting would be to know, did this happen with MW before 1.16 as well? --Danwe 04:30, 31 August 2010 (UTC)

Can we add this to the MW SVN?
So we can get it i18n'd properly etc?

You can apply for commit access at Commit_access_requests

Reedy 21:08, 31 July 2010 (UTC)

No ?> ending tag?
Is it correct that Variables.php</tt> and Variables.i18n.php</tt> both have the opening <?php</tt> tag, but no closing ?></tt> tag? --DragoonWraith 15:27, 2 November 2010 (UTC)
 * They're neither needed nor useful, so MediaWiki's coding standard requires them to be absent. Max Semenik 15:53, 2 November 2010 (UTC)

Substitution
Is there a way to do a substitution with variables? For example I have a variable defined, say, and now i want to do a  , in order to have only the value of the NAME-variable "Joe" edited in? --Theaitetos 09:11, 4 February 2011 (UTC)


 * I don't get the point here. subst is a function for the use with templates, not parser functions, isn't it? --Danwe 05:13, 7 February 2011 (UTC)


 * My specific problem: I generated a template with the VariablesExtension that cleans up special characters in the specified parameter (usually a page) and replaces them with normal characters, e.g. é &rarr; e, û &rarr; u, ä &rarr; a, et.al. I define the template parameter as my variable XCLEANX, then I run a replace function for every special character that needs to be replaced on that variable in succession (can't run them all nested due to expansion depth limit), i.e. ,  , ... The template works the way it should, so no problem there. Now I'm trying to figure out how to get the final cleaned up text into a page. Subst:template would just insert the entire template code itself into the page, which is completely unnecessary, since all I want is to have the value of  inserted, the purged text. I called it a "substitution" since that is pretty intuitive, although I tried coding it as a parameter inside the template, i.e. "if: , then xxx". Now I'm trying to figure out a way, so that the template, when given "subst=yes" (e.g.  , will just edit in the value of the variable like the substitution of a magic word so to speak . It's really annoying to have that depth limit around; when coded with nested replace functions, i.e.  it can be easily substituted, but only with 40 replacement calls. When coded with successive variables, I get all the calls I need, but can't substitute it... Is there a way, will I have to create such a new magic word with the MagicWordExtension or do I have to give up on it altogether? --Theaitetos 17:44, 7 February 2011 (UTC)

Determing value of a variable at a given article position when executing hook script
Before saving an article we scan in our ArticleSave hook article WikiText if there is used a special tag.

If so we have to generate additional actions depending on parameter value of this tag.

At this point parameter can be variables - so we need to determine the value of this variable.

is useful only in original WikiText context...

Any suggestions?

Baumbuwewiki 14:05, 10 February 2011 (UTC)

(Great extension BTW!)


 * I think I understand what you're asking. If you want to get the value of a variable, from within an extension, i would think that you could set a variable equal to the wikitext, such as:  $var1 = '';  Then you parse $var1, and that would give you the value.  I think this should work.  Hopefully that's what you were trying to get.  --Duke33 18:04, 17 March 2011 (UTC)

Variables Become Unset When Transcluding a Special Page
When the script was upgraded from 1.2.2 to 1.30, a new bug was introduced. If you transclude a special page, all of the defined variables will be lost. Here's an example:

It will print "123" the first time, but it won't print the 2nd time, which is after the transclusion of the special page. The culprit is the fact that the ParserClearState hook is clearing the variables. It was introduced to stop passing variables from page to page on imports and job queue jobs. However, it had this unintentional side effect. Does anyone have any ideas on how it could be fixed? --Duke33 14:08, 17 March 2011 (UTC)


 * I chatted in the MW irc about this problem, I think this bug is related to this MW bug: https://bugzilla.wikimedia.org/show_bug.cgi?id=16129
 * Transcluding a special page doesn't create a new parser instance, that seems to be the problem. I see no clean workaround right now since the parser object is the same for each call of ParserClearState which makes it impossible to find out whether the hook is called from transcluding a Special page or after finishing the parsing of the current page.
 * Just got an idea how to work around another way: Whenever accessing the variables array we've got to check whether the parser object is still the same, if so, we restore the old array. Therefore we have to make a copy of the array during ParserClearState. This could have other side effects though, I don't really know whether the parser object changes after the one ParserClearState call where we actually really want to reset that variables array (in case of page imports or job queue). Another solution would be to find other hooks where we could empty the array. For example before imports and job queue but it has to be reseted after each page within the import/job queue as well! --Danwe 14:55, 19 March 2011 (UTC)