User:Lilyuserin/CalcForm

From Wikimedia Commons, the free media repository
Jump to navigation Jump to search

Diese Erweiterung erzeugt ein Formular, mit dem einfache Berechnungen durchgeführt werden können.

Definition der Erweiterung

[edit]
<?php
	/**
	 * MediaWiki extension: CalcForm
	 * =============================
	 *
	 * To activate, edit your LocalSettings.php,
	 * save this code as 'OraForm.php' and copy the file into the subdirectory CalcForm of your extensions-directory and add
	 * require_once("$IP/extensions/CalcForm/CalcForm.php");
	 */

	# User Settings

	# require_once("$IP/extensions/CalcForm/CalcForm.php");

	# Parameter

	# inlabels  ...  Beschriftung der Eingabefelder
	# inids     ...  eindeutige IDs für die Eingabefelder (muss je Seite eindeutig sein)
	# ivalues   ...  Vorbelegung der Eingabefelder
	# outlabels ...  Beschriftung der Ausgabefelder
	# outids    ...  eindeutige IDs für die Ausgabefelder (muss je Seite eindeutig sein)
	# onclick   ...  Berechnungsvorschrift, was bei Mausklick passieren soll
	# oninput   ...  Berechnungsvorschrift, was bei Dateneingabe passieren soll
	#                zumindest eine der beiden Eingaben muss vorhanden sein
	#                die fehlende wird automatisch durch die andere ergänzt
	# *********************************************************************************************
	#                Formatierung
	# marginright ...  Abstand zwischen Beschriftung und Ein/Ausgabefeld
	# marginleft  ...  Abstand links
	# fontsize    ...  Schriftgröße
	# lwidth      ...  Breite der Beschriftungsfelder
	# nwidth      ...  Breite der numerischen Felder
	# End User Settings

	# Diese Erweiterung erzeugt ein Formular zur Durchführung einfacher Berechnungen.
	# Damit sollen gewisse Überprüfungen einfacher gemacht werden.
	# Durch eine Extension wird die Aktivierung von RawHTML im Wiki überflüssig,
	# somit werden viele Bearbeitungsschritte wieder einfacher
	# es wird ein Formular erzeugt, dieses besitzt jedoch keinen Submit-Button
	# jedes Formular erhält eine zufällige ID, dadurch können mehrere Formulare auf einer Seite 
	# verwendet werden
	# JavaScript muss aktiviert sein, sonst funktioniert die Berechnung nicht
	# im IE funktioniert die Berechnung ebenfalls nicht

define("CALC_NAME",  "calc");				    # Name of tag
define("CALC_IDENTIFIER", "sendCalc");	# Name of POST identifier flag
define("CALC_HOOK", "hookCalc");			  # Name of hook

	if ( !defined( 'MEDIAWIKI' ) ) {
		die( "This is not a valid entry point.\n" );
	}

	$wgExtensionCredits['parserhooks'][] = array(
		'path' => __FILE__,
		'name' => 'CalcForm',
    'version' => '0.0.1',
    'author' =>'Ich selber',
		'url' => 'https://commons.wikimedia.org/wiki/User:Lilyuserin/CalcForm',
		'description' => 'erzeugt Eingabeformulare zum Rechnen'
	);
	$wgExtensionFunctions[] = 'wfCalcFormExtension';

	/*
 	* Setup CalcForm extension.
 	* Sets a parser hook for <CALC_NAME></CALC_NAME>.
 	*/
	function wfCalcFormExtension()
	{
		new CalcForm();
	}

	class CalcForm
	{
		public function __construct()
		{
			global $wgParser;
			$wgParser->setHook(CALC_NAME, array(&$this, CALC_HOOK));
		}
		public function hookCalc($input, $argv, $parser)
		{
			global $IP, $wgServer, $wgScriptPath, $wgUploadPath, $wgHooks, $wgParser, $wgHtml5, $wgScript, $wgTitle, $wgOut;

			#return debug_zval_dump($_POST);
			$input = trim($input);
			$br = '<br>';
			$onclick = $oninput = $inlabels = $outlabels = $inids = $outids = $ivalues = '' ;
			$lwidth = '10em'; $nwidth = '5em';
			$owidth = $iwidth = $lwidth;
			$marginright = '0.5em'; $marginleft = '0'; $marginbottom = '0.5em'; $oright='0';
			$fontsize = '1em'; $addstyle= '';

			foreach ( $argv as $arg => $val )
			{
				$$arg = $val; # die Variablen erhalten den Namen der Parameter
			}

			if (empty($onclick) and empty($oninput)) return "irgendeine Berechnungsvorschrift sollte schon vorhanden sein";
			else {
				if (empty($onclick)) $onclick=$oninput;
				if (empty($oninput)) $oninput=$onclick;
			}

			# Ein- und Ausgabebeschriftungen werden als Text übergeben, der durch ? getrennt ist
			$ilabels = preg_split("/[\?\t\r\n\f\x0B]/", $inlabels);
			$olabels = preg_split("/[\?\t\r\n\f\x0B]/", $outlabels);

			# Ids für In- und Out-Felder
			# deswegen erforderlich, damit mehrere Formulare auf einer Seite verwendet werden können
			# automatische Generierung ist mir derzeit zu kompliziert
			# da ich die Berechnungsergebnisse dann irgendwie auf diese Id's hintrimmen müsste
			$iids = preg_split("/[\?\t\r\n\f\x0B]/", $inids);
			$oids = preg_split("/[\?\t\r\n\f\x0B]/", $outids);

			$istyle = "width: $iwidth; display: inline-block; font-size: $fontsize; font-weight: bold; padding: 0 0.5em;" .
								"background-image: linear-gradient(#eaeaea, #f9f9f9, #eaeaea); margin-right: $marginright; margin-bottom: $marginbottom;";
			$ostyle = "width: $owidth; display: inline-block; font-size: $fontsize; font-weight: bold; padding: 0 0.5em;" .
								"background-image: linear-gradient(#eaeaea, #f9f9f9, #eaeaea); margin-right: $marginright; margin-bottom: $marginbottom;";

			$nstyle = "width: $nwidth; font-size: $fontsize; display: inline-block; background-image: linear-gradient(#f9f9f9, #eaeaea); " .
								"padding: 0 0.2em 0 0; margin-bottom: $marginbottom; margin-right: $oright;";
			#return $style . $lstyle;
			if (empty($class)) $class = "mono";

			$izahl = count($iids);
			$ozahl = count($oids);

			$ivals  = array_fill(0, $izahl, '');
			$ivals  = !empty($ivalues) ? preg_split("/[\?\t\r\n\f\x0B]/", $ivalues) : array_fill(0, $izahl, '');

			$iput = "<div style='margin-left: $marginleft;$addstyle'>";
			for ($x = 0; $x < $izahl; $x++)
			{
				$iput .= 	"<div style='$addstyle'><div style='$istyle' class='$class'>$ilabels[$x]</div><input " .
									"style='$nstyle' id='$iids[$x]' type='number' value='$ivals[$x]' min='0'></input></div>
";
			}
			$iput .= '</div>';
			
			$oput = '';
			for ($x = 0; $x < $ozahl; $x++)
			{
				$oput .= 	"<div style='$ostyle' class='$class'>$olabels[$x]</div><output " .
									"style='$nstyle' class='$class' id='$oids[$x]' type='number'></output>";
			}
			
			$formid = str_shuffle('abcdefghijklm');
			$myform = "<form id='$formid' oninput='$oninput' onclick='$onclick'>" . $iput . $oput . "</form>";
			return $myform;

		}
	}