User:Lilyuserin/Affenformular
Diese Erweiterung definiert ein sogenanntes Affenformular. Die Erweiterung ist ziemlich einfach gehalten, sie definiert ein einzelnes Eingabefeld für Text mit einer Vorgabe. Weiters ist ein Reset-Button enthalten. Die Erweiterung ist als Klasse definiert und darf aus Sicherheitsgründen nur auf gesperrten Seiten verwendet werden.
In der LocalSettings.php folgende Zeile eintragen:
$AFFEN_AUTH = utf8_encode("Hier Name und evtl. Kontaktdaten eintragen");
Definition der Erweiterung[edit]
<?php
/**
* MediaWiki extension: AffenForm
* =============================
*
* To activate, edit your LocalSettings.php,
* save this code as 'AffenForm.php' and copy the file into the subdirectory Affen of your extensions-directory and add
* require_once("$IP/extensions/Affen/AffenForm.php");
*/
# User Settings
# The following variables can be set in LocalSettings.php
# before the line:
# require_once("$IP/extensions/Affen/AffenForm.php");
# Parameter
# default ... Standardbelegung für Eingabefeld
# End User Settings
define("AFFEN_NAME", "affen"); # Name of tag
define("AFFEN_EXT_NAME", "AffenForm"); # Name of extension
define("AFFEN_IDENTIFIER", "sendAffen"); # Name of POST identifier flag
define("AFFEN_HOOK", "hookAffen"); # Name of hook
if ( !defined( 'MEDIAWIKI' ) ) {
die( "This is not a valid entry point.\n" );
}
$wgExtensionCredits['parserhooks'][] = array(
'path' => __FILE__,
'name' => AFFEN_NAME,
'version' => '0.0.1',
'author' =>$AFFEN_AUTH,
'url' => "$wgServer$wgScriptPath/index.php/Extension:" . AFFEN_EXT_NAME,
'description' => 'erzeugt ein Affenformular'
);
$wgExtensionFunctions[] = 'wfAffenFormExtension';
/*
* Setup AffenForm extension.
* Sets a parser hook for <AFFEN_NAME></AFFEN_NAME>.
*/
function wfAffenFormExtension()
{
new AffenForm();
}
Klassendefinition[edit]
Als Input (der Text zwischen den Tags) wird der Name einer Vorlage (plus öffnender geschweifter Klammern) vorausgesetzt, das Eingabefeld des Formulars wird als Parameter für die Vorlage eingesetzt.
Es gibt zwei Absendebuttons, einer führt die Aktion im gleichen Fenster durch. Wenn die Aktion in einem neuen Fenster durchgeführt wird, wird das Eingabeformular in diesem nicht angezeigt.
class AffenForm
{
public function __construct()
{
global $wgParser;
$wgParser->setHook(AFFEN_NAME, array(&$this, AFFEN_HOOK));
}
public function hookAffen($input, $argv, $parser)
{
global $IP, $wgServer, $wgScriptPath, $wgUploadPath, $wgHooks, $wgParser, $wgHtml5, $wgScript, $wgOut;
$sent = !empty($_POST); # check form status first call/alread sent
$reset = ($sent and $_POST["tuwas"] == 1);; # if sent: do or reset
$neu = ($sent and $_POST["tuwas"] == 2);
$myparm = $wgParser->recursiveTagParse( '{{#time:j.n.Y|-1 months}}' ); # first input field is date
foreach ( $argv as $arg => $val )
{
$$arg = $val; # die Variablen erhalten den Namen der Parameter
}
$feld1 = $feld2 = $feld3 = '';
if (!empty($argv['default']))
$myparm = $argv['default']; # enter default Text as default="..."
if ($sent)
{
if ($reset)
{
$feld1 = $feld2 = $feld3 = '';
}
else
{
#if (!empty($_POST['feld1']))
$feld1 = $this->check_input($this->clear_input($_POST['feld1']), 'd');
if (!empty($_POST['feld2']))
$feld2 = $this->clear_input($_POST['feld2']);
if (!empty($_POST['feld3']))
$feld3 = $this->clear_input($_POST['feld3']);
}
}
$button_style = 'border-radius: 1em; background-image: linear-gradient(90deg, #8f8,#cfc); padding: 0.5em 1.5em;'
. ' box-shadow: inset -2px -2px 5px #080; color: #080; font-weight: bold; font-size: 110%' ;
$div_beg = '<div style="margin-bottom: 0"><div style="width: 15em; display: inline-block; padding-right: 0.5em; text-align: right">';
$formid = str_shuffle('abcdefghijklmnopqrst'); # zufällige Sequenz erzeugen um eindeutige IDs zu erhalten falls mehrere Formulare auf einer Seite verwendet werden
# die Wahrscheinlichkeit mit 20 Zeichen die gleiche Sequenz zu erzeugen liegt bei 1:2.432.902.008.176.640.000
# wenn man 77.1 Milliarden Jahren jede Sekunde eine Sequenz durchprobiert, erhält man eine Sequenz doppelt
$myForm = "<form id='$formid' method='post'>";
$myForm .= '<input type="hidden" name="action" value="view" >' ;
$myForm .= '<input type="hidden" name="' . AFFEN_IDENTIFIER . '" value="send" >';
$myForm .= $div_beg . 'Feld1:</div><input name="feld1" size="10" maxlength="10" placeholder="1.1.2019" value="' . $feld1 . '"></div><br>';
$myForm .= $div_beg . 'Feld2:</div><input type="text" name="feld2" placeholder="inhalt2" size="40" value="' . $feld2 . '"></div><br>';
$myForm .= $div_beg . 'Feld3:</div><input type="text" name="feld3" placeholder="inhalt3" size="40" value="' . $feld3 . '"></div><br>';
$myForm .= $div_beg . '<button style="' . $button_style . '" type="submit" name="tuwas" value="0" formmethod="post">Aktion durchführen</button></div>';
$myForm .= '<div style="display: inline-block; padding-right: 0.5em;"><button style="' . $button_style . '" type="submit" name="tuwas" value="1" formtarget="_blank" formmethod="post">Aktion in neuem Fenster durchführen</button></div>';
$myForm .= '<button style="' . $button_style . '" type="submit" name="tuwas" value="2" formmethod="post">Eingabe zurücksetzen</button></div>';
$myForm .= '</form>';
if ($sent and !$reset)
{
if (empty($feld1))
{
return $myForm . '<div style="font-weight: bold; color: #00f">Feld 1 fehlt, bitte eingeben</div>';
}
$content = array("feld1"=>$feld1, "feld2"=> $feld2, "feld3"=>$feld3, "input"=>$input );
$seite = $this->DoSomething($content);
if ($neu)
$myForm = $seite . '<p>******************<p>' . $this->render_wikitext($seite);
else
$myForm .= $seite;
}
return $myForm;
}
Funktionen[edit]
Die Eingabe kann als Wikitext interpretiert werden.
private function clear_input($data)
{
return htmlspecialchars(stripslashes(trim($data)));
}
private function render_wikitext($input)
{
global $wgParser;
$output = $wgParser->recursiveTagParse( $input );
return '<div class="wonderful">' . $output . '</div>';
}
private function check_input($data, $typ = 'int')
{
global $IP, $wgServer, $wgScriptPath, $wgUploadPath, $wgHooks, $wgParser, $wgHtml5, $wgScript, $wgTitle;
switch($typ)
{
case 'int':
case 'i':
default:
return intval($data );
break;
case 'date':
case 'd':
case 'datum':
$test = $wgParser->recursiveTagParse( '{{#time:j.n.Y{{!}}' . $data . '}}' );
if (strpos($test, 'error'))
return $wgParser->recursiveTagParse( '{{#time:j.n.Y{{!}}-1 months}}' ) ;
else
return $test;
}
}
private function DoSomething($params)
{
global $IP, $wgServer, $wgScriptPath, $wgUploadPath, $wgHooks, $wgParser, $wgHtml5, $wgScript, $wgTitle;
return $wgParser->recursiveTagParse($params["input"] . "{{!}}1=" . $params["feld1"]. "}}");
return "insert a useful action here";
}