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";
    }