Difference between revisions of "Extension:SimpleForms.php"

From Organic Design wiki
(send it to speiacl page)
(add CreateArticle special page)
Line 28: Line 28:
  
 
# Process content item if in request data
 
# Process content item if in request data
if (isset($_REQUEST['content'])) {
+
if (isset($_REQUEST['sf_content'])) {
$content = $_REQUEST['content'];
+
$content = $_REQUEST['sf_content'];
 
if (isset($_REQUEST['title'])) {
 
if (isset($_REQUEST['title'])) {
 
$t = Title::newFromText($_REQUEST['title']);
 
$t = Title::newFromText($_REQUEST['title']);
Line 183: Line 183:
 
foreach ($tmp as $k => $v) {
 
foreach ($tmp as $k => $v) {
 
if (strtolower($k) == 'delete') {
 
if (strtolower($k) == 'delete') {
$actions['create'] = array(
+
$actions['sf_create'] = array(
'class' => ($action == 'create') ? 'selected' : false,
+
'class' => ($action == 'sf_create') ? 'selected' : false,
 
'text'  => 'create',
 
'text'  => 'create',
 
'href'  => Title::makeTitle(NS_SPECIAL,'CreateArticle')
 
'href'  => Title::makeTitle(NS_SPECIAL,'CreateArticle')
Line 197: Line 197:
 
function __toString() { return 'SimpleForms'; }
 
function __toString() { return 'SimpleForms'; }
  
 +
}
 +
 +
# Define a new class based on the SpecialPage class
 +
#if title is special require_once "$IP/includes/SpecialPage.php";
 +
class SpecialCreateArticle extends SpecialPage {
 +
 +
# Constructor
 +
function SpecialCreateArticle() {
 +
SpecialPage::SpecialPage('CreateArticle');
 +
}
 +
 +
# Override SpecialPage::execute()
 +
wfSpecialWikid($param,&$specialpage) {
 +
global $wgOut;
 +
$title = Title::makeTitle(NS_SPECIAL,'CreateArticle');
 +
}
 +
 
}
 
}
  
Line 202: Line 219:
 
function wfSetupSimpleForms() {
 
function wfSetupSimpleForms() {
 
global $wgHooks,$wgSimpleForms;
 
global $wgHooks,$wgSimpleForms;
 +
 +
# Add messages
 +
if ($wgLanguageCode == 'en') {
 +
$wgMessageCache->addMessages(array(
 +
'CreateArticle'  => 'CreateArticle', # The friendly page title
 +
'sf_create' => "create",            # title of create action button
 +
));
 +
}
 +
 +
# Add the specialpage to the environment
 +
SpecialPage::addPage(new SpecialCreateArticle());
 +
 +
# Instantiate a singleton for the extension
 
$wgSimpleForms = new SimpleForms();
 
$wgSimpleForms = new SimpleForms();
 
}
 
}
Line 216: Line 246:
 
# Assigns the content of the UNTITLED article with
 
# Assigns the content of the UNTITLED article with
 
function wfSimpleFormsAAFC(&$article,&$text) {
 
function wfSimpleFormsAAFC(&$article,&$text) {
$text = $_REQUEST['content'];
+
global $wgRequest;
 +
$text = $wgRequest->getText('sf_content');
 
return true;
 
return true;
 
}
 
}
 
?>
 
?>

Revision as of 01:52, 1 June 2007

<?php

  1. MediaWiki SimpleForms ExtensionTemplate:Php
Info.svg These are the MediaWiki extensions we're using and/or developing. Please refer to the information on the mediawiki.org wiki for installation and usage details. Extensions here which have no corresponding mediawiki article are either not ready for use or have been superseded. You can also browse our extension code in our local Subversion repository or our GitHub mirror.
  1. - See http://www.mediawiki.org/wiki/Extension:Simple_Forms for installation and usage details
  2. - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
  3. - Author: http://www.organicdesign.co.nz/nad
  4. - Started: 2007-04-25, see article history

if (!defined('MEDIAWIKI')) die('Not an entry point.');

define('SIMPLEFORMS_VERSION','0.0.5, 2007-06-01');

$wgSimpleFormsFormMagic = "form"; # the parser-function name for form containers $wgSimpleFormsInputMagic = "input"; # the parser-function name for form inputs $wgSimpleFormsRequestMagic = "request"; # the parser-function name for accessing the post/get variables $wgSimpleFormsRequestPrefix = "sf_"; # restricts #request and GET/POST variable names to their own namespace, set to "" to disable $wgSimpleFormsCreateAction = true; # whether or not to add an action button for article-creation

$wgExtensionFunctions[] = 'wfSetupSimpleForms'; $wgHooks['LanguageGetMagic'][] = 'wfSimpleFormsLanguageGetMagic';

$wgExtensionCredits['parserhook'][] = array( 'name' => 'Simple Forms', 'author' => 'User:Nad', 'description' => 'Functions to make and process forms.', 'url' => 'http://www.mediawiki.org/wiki/Extension:Simple_Forms', 'version' => SIMPLEFORMS_VERSION );

  1. Process content item if in request data

if (isset($_REQUEST['sf_content'])) { $content = $_REQUEST['sf_content']; if (isset($_REQUEST['title'])) { $t = Title::newFromText($_REQUEST['title']); if ($t->exists()) { # Title exists, append content $a = new Article($t); $c = $a->getContent(); $a->updateArticle("$c\n$content","Updated",false,false); } else { # No such title, create from content $a = new Article($t); $a->insertNewArticle( 'Dummy article used by Extension:SimpleForms', 'Dummy article created for Extension:SimpleForms', true, false ); } } else { # No title specified, render content with no title $t = Title::newFromText($_REQUEST['title'] = 'UNTITLED'); if (!$t->exists()) { # The UNTITLED article doesn't exist, create it now $a = new Article($t); $a->insertNewArticle( 'Dummy article used by Extension:SimpleForms', 'Dummy article created for Extension:SimpleForms', true, false ); } $wgHooks['ArticleAfterFetchContent'][] = 'wfSimpleFormsAAFC'; # Makes it seem as if the article contains the content from the request } }

  1. Define a singleton for SimpleForms operations

class SimpleForms {

var $id = 0;

# Constructor function SimpleForms() { global $wgParser,$wgHooks,$wgSimpleFormsFormMagic,$wgSimpleFormsInputMagic,$wgSimpleFormsRequestMagic; $wgParser->setFunctionHook($wgSimpleFormsFormMagic,array($this,'form')); $wgParser->setFunctionHook($wgSimpleFormsInputMagic,array($this,'input')); $wgParser->setFunctionHook($wgSimpleFormsRequestMagic,array($this,'request')); $wgHooks['SkinTemplateTabs'][] = $this; }

# Renders a form and wraps it in tags for processing by tagHook function form(&$parser) { global $wgJavaScriptFunctions; $id = $this->id++; $args = ; foreach (func_get_args() as $arg) if (!is_object($arg)) { if (preg_match('/^(.+?)\\s*=\\s*(.+)$/',$arg,$match)) $args .= " $match[1]=\"$match[2]\""; else $form = $arg; } $wgJavaScriptFunctions['SimpleFormsFunctions'] = " function sfRequest(url,target) { sfXmlHttp = null if (window.XMLHttpRequest) sfXmlHttp = new XMLHttpRequest() else if (window.ActiveXObject) sfXmlHttp = new ActiveXObject('Microsoft.XMLHTTP') if (sfXmlHttp != null) { sfXmlHttp.onreadystatechange = sfRequestEvent sfXmlHttp.open('GET',url,true) sfXmlHttp.send(null) } else alert('Your browser does not support XMLHTTP, you can only use GET or POST requests.') sfXmlHttp.target = document.getElementById(target); } function sfRequestEvent() { if (sfXmlHttp.readyState == 4) { if (sfXmlHttp.status == 200) sfXmlHttp.target.innerHTML = sfXmlHttp.responseText else alert('Problem retrieving XML data!') sfXmlHttp.readyState = 0 } } "; return array("<form $args>$form</form>",'noparse'=>true); }

# Renders a form input function input(&$parser) { global $wgSimpleFormsRequestPrefix;

               $content = ;
               $method  = ;
               $type    = ;
               $args    = ;
               $argv    = array();

# Process args foreach (func_get_args() as $arg) if (!is_object($arg)) { if (preg_match('/^([a-z0-9_]+?)\\s*=\\s*(.+)$/',$arg,$match)) $argv[strtolower(trim($match[1]))] = trim($match[2]); else $content = trim($arg); } if (isset($argv['type'])) $type = $argv['type']; else $type = ; if (isset($argv['name'])) $argv['name'] = $wgSimpleFormsRequestPrefix.$argv['name'];

# Textarea if ($type == 'textarea') { unset($argv['type']); foreach ($argv as $k => $v) $args .= " $k=\"$v\""; $input = "<textarea$args>$content</textarea>"; }

# Select list elseif ($type == 'select') {

                       unset($argv['type']);
                       if (isset($argv['value'])) {
                               $val = $argv['value'];
                               unset($argv['value']);
                               } else $val = ;
                       foreach ($argv as $k => $v) $args .= " $k=\"$v\"";
                       preg_match_all('/^\\*\\s*(.*?)\\s*$/m',$content,$m);
                       $input = "<select$args>\n";
                       foreach ($m[1] as $opt) {
                               $sel = $opt == $val ? ' selected' : ;
                               $input .= "<option$sel>$opt</option>\n";
                               }
                       $input .= "</select>\n";

}

# Submit button (changes to onClick) elseif ($type == 'submit' && $method == 'live') { unset($argv['type']); foreach ($argv as $k => $v) $args .= " $k=\"$v\""; }

# Default: render as normal input element else { foreach ($argv as $k => $v) $args .= " $k=\"$v\""; $input = "<input$args/>"; }

return array($input,'noparse'=>true); }

# Return value from the global $_REQUEST array (containing GET/POST variables) function request(&$parser,$key) { global $wgRequest,$wgSimpleFormsRequestPrefix; return $wgRequest->getText($wgSimpleFormsRequestPrefix.$key); }

# Add a "create" tab for creating new articles from creation forms function onSkinTemplateTabs(&$skin,&$actions) { global $wgRequest; $action = $wgRequest->getText('action'); $tmp = $actions; $actions = array(); foreach ($tmp as $k => $v) { if (strtolower($k) == 'delete') { $actions['sf_create'] = array( 'class' => ($action == 'sf_create') ? 'selected' : false, 'text' => 'create', 'href' => Title::makeTitle(NS_SPECIAL,'CreateArticle') ); } $actions[$k] = $v; } return true; }

# Needed in some versions to prevent Special:Version from breaking function __toString() { return 'SimpleForms'; }

}

  1. Define a new class based on the SpecialPage class
  2. if title is special require_once "$IP/includes/SpecialPage.php";

class SpecialCreateArticle extends SpecialPage {

# Constructor function SpecialCreateArticle() { SpecialPage::SpecialPage('CreateArticle'); }

# Override SpecialPage::execute() wfSpecialWikid($param,&$specialpage) { global $wgOut; $title = Title::makeTitle(NS_SPECIAL,'CreateArticle'); }

}

  1. Called from $wgExtensionFunctions array when initialising extensions

function wfSetupSimpleForms() { global $wgHooks,$wgSimpleForms;

# Add messages if ($wgLanguageCode == 'en') { $wgMessageCache->addMessages(array( 'CreateArticle' => 'CreateArticle', # The friendly page title 'sf_create' => "create", # title of create action button )); }

# Add the specialpage to the environment SpecialPage::addPage(new SpecialCreateArticle());

# Instantiate a singleton for the extension $wgSimpleForms = new SimpleForms(); }

  1. Needed in MediaWiki >1.8.0 for magic word hooks to work properly

function wfSimpleFormsLanguageGetMagic(&$magicWords,$langCode = 0) { global $wgSimpleFormsFormMagic,$wgSimpleFormsInputMagic,$wgSimpleFormsRequestMagic; $magicWords[$wgSimpleFormsFormMagic] = array(0,$wgSimpleFormsFormMagic); $magicWords[$wgSimpleFormsInputMagic] = array(0,$wgSimpleFormsInputMagic); $magicWords[$wgSimpleFormsRequestMagic] = array(0,$wgSimpleFormsRequestMagic); return true; }

  1. Assigns the content of the UNTITLED article with

function wfSimpleFormsAAFC(&$article,&$text) { global $wgRequest; $text = $wgRequest->getText('sf_content'); return true; } ?>