Extension:DynamicFunctions

From MediaWiki.org
Jump to: navigation, search
MediaWiki extensions manualManual:Extensions
Crystal Clear action run.png
DynamicFunctions

Release status:Extension status experimental

ImplementationTemplate:Extension#type Parser function
DescriptionTemplate:Extension#description Defines an additional set of parser functions
Author(s)Template:Extension#username Ross McClure (Algorithm~mediawikiwikitalk)
Latest versionTemplate:Extension#version 1.1 (2006-11-25)
MediaWikiTemplate:Extension#mediawiki 1.8+
Database changesTemplate:Extension#needs-updatephp No
LicenseTemplate:Extension#license No license specified
Download See the code section
Hooks usedTemplate:Extension#hook
LanguageGetMagicManual:Hooks/LanguageGetMagic

Translate the DynamicFunctions extension if it is available at translatewiki.net

Check usage and version matrix.

The DynamicFunctions extension defines an additional set of parser functions that provide dynamic functionality and cannot be cached.

Usage[edit]

This module defines four functions: arg, ip, rand, and skin. All of these functions operate in constant time.

#arg:[edit]

The #arg function returns the value of the given URL argument. The syntax is:

{{#arg:parameter name|default}}.

The default parameter is optional; if defined, it is returned when the argument does not exist.

Thus, instead of including a page for given parameter values, this allows linking to a page for given parameter values. Syntax for linking: external link style with zero or more times "&parameter name=parameter value" added to the URL. The link can be to the same page with different parameter values, or to a different page. In the former case the new values can depend on the old ones.

#ip:[edit]

The #ip function returns the IP address of the current user. No arguments are required. This should correspond to the IP in the last line of Special:Version.

#rand:[edit]

The #rand function returns a random integer value. The syntax is:

{{#rand:a|b}}

#rand returns a value between a and b, inclusive. If b is omitted, #rand returns a value between 1 and a (hence, {{#rand:6}} emulates a dice roll).

The function is PHP function mt-rand.

#skin:[edit]

The #skin function returns the name of the current skin. No arguments are required.

Installation[edit]

  • Copy the code into a file and place the file(s) in a directory called DynamicFunctions in your extensions/ folder.
  • Add the following code at the bottom of your LocalSettings.php:
require_once "$IP/extensions/DynamicFunctions/DynamicFunctions.php";
  • YesY Done - Navigate to Special:Version on your wiki to verify that the extension is successfully installed.

Code[edit]

DynamicFunctions.php
<?php
/*

 Defines a subset of parser functions that must clear the cache to be useful.

 {{#arg:name}} Returns the value of the given URL argument.  Can also be called
               with a default value, which is returned if the given argument is
               undefined or blank: {{#arg:name|default}}

 {{#ip:}}      Returns the current user IP.

 {{#rand:a|b}} Returns a random value between a and b, inclusive.  Can
               also be called with a single value; {{#rand:6}} returns a
               random value between 1 and 6 (equivalent to a dice roll).

 {{#skin:}}    Returns the name of the current skin.

 Author: Algorithm [http://meta.wikimedia.org/wiki/User:Algorithm]
 Version 1.1 (11/25/06)

*/

# Not a valid entry point, skip unless MEDIAWIKI is defined
if ( !defined( 'MEDIAWIKI' ) ) {
   die( 'This file is a MediaWiki extension, it is not a valid entry point' );
}

$wgExtensionFunctions[] = 'wfDynamicFunctions';
$wgExtensionCredits['parserhook'][] = array(
	'name' => 'DynamicFunctions',
	'version' => '1.1',
	'url' => 'https://www.mediawiki.org/wiki/Extension:DynamicFunctions',
	'author' => 'Ross McClure',   
	'description' => 'Defines an additional set of parser functions.'
);

$wgHooks['LanguageGetMagic'][] = 'wfDynamicFunctionsLanguageGetMagic';

function wfDynamicFunctions() {
	global $wgParser, $wgExtDynamicFunctions;

	$wgExtDynamicFunctions = new ExtDynamicFunctions();

	$wgParser->setFunctionHook( 'arg', array( &$wgExtDynamicFunctions, 'arg' ) );
	$wgParser->setFunctionHook( 'ip', array( &$wgExtDynamicFunctions, 'ip' ) );
	$wgParser->setFunctionHook( 'rand', array( &$wgExtDynamicFunctions, 'rand' ), SFH_OBJECT_ARGS );
	$wgParser->setFunctionHook( 'skin', array( &$wgExtDynamicFunctions, 'skin' ) );
}

function wfDynamicFunctionsLanguageGetMagic( &$magicWords, $langCode ) {
	switch ( $langCode ) {
	default:
		$magicWords['arg']    = array( 0, 'arg' );
		$magicWords['ip']     = array( 0, 'ip' );
		$magicWords['rand']   = array( 0, 'rand' );
		$magicWords['skin']   = array( 0, 'skin' );
	}
	return true;
}

class ExtDynamicFunctions {

	function arg( &$parser, $name = '', $default = '' ) {
		global $wgRequest;
		$parser->disableCache();
		return $wgRequest->getVal($name, $default);
	}

	function ip( &$parser ) {
		$parser->disableCache();
		return wfGetIP();
	}

	function rand( &$parser, $frame, $args ) {
		$a = isset( $args[0] ) ? $frame->expand( $args[0] ) : 0;
		$b = isset( $args[1] ) ? $frame->expand( $args[1] ) : 1;
		$parser->disableCache();
		if ( is_callable( array( $frame, 'setVolatile' ) ) ) {
			$frame->setVolatile(); // see bug #58929
		}
		return mt_rand( intval($a), intval($b) );
	}

	function skin( &$parser ) {
		global $wgUser, $wgRequest;
		$parser->disableCache();
		return $wgRequest->getVal('useskin', $wgUser->getOption('skin'));
	}
}

See also[edit]