Difference between revisions of "Extension:Workflow.php"

From Organic Design wiki
(in OD repo now)
 
(44 intermediate revisions by 3 users not shown)
Line 1: Line 1:
<?php
+
{{svn|extensions|Workflow/Workflow.php}}
# Extension:Workflow{{Category:Extensions|Workflow}}{{Category:Code that uses voodoo|Workflow}}{{php}}
 
# - Licenced under LGPL (http://www.gnu.org/copyleft/lesser.html)
 
# - Author: [http://www.organicdesign.co.nz/nad User:Nad]{{Category:Extensions created with Template:Extension}}
 
# - Started: 2007-10-06
 
 
 
if (!defined('MEDIAWIKI')) die('Not an entry point.');
 
 
 
define('WORKFLOW_VERSION','0.0.1, 2007-10-23');
 
 
 
$wgWorkflowMagic              = "workflow";
 
$wgExtensionFunctions[]        = 'wfSetupWorkflow';
 
$wgHooks['LanguageGetMagic'][] = 'wfWorkflowLanguageGetMagic';
 
 
 
$wgExtensionCredits['parserhook'][] = array(
 
'name'        => 'Workflow',
 
'author'      => '[http://www.organicdesign.co.nz/nad User:Nad]',
 
'description' => 'Adds the ability for articles to be part of workflow sequences and easily moved dynamically between phases in the sequence using AJAX.',
 
'url'        => 'http://www.mediawiki.org/wiki/Extension:Workflow',
 
'version'    => WORKFLOW_VERSION
 
);
 
 
 
# If it's a workflow-related ajax call, don't use dispatcher (because we need the catlinks generated by normal page render)
 
if ($wgUseAjax && $_REQUEST['action'] == 'ajax' && $_REQUEST['rs'] == 'wfWorkflowUpdateState' && is_array($_REQUEST['rsargs'])) {
 
list($_REQUEST['title'],$wgWorkflowName,$wgWorkflowState) = $_REQUEST['rsargs'];
 
$wgHooks['OutputPageBeforeHTML'][] = 'wfWorkflowReturnCatlinks';
 
$wgWorkflowUpdateState = true;
 
$_REQUEST['action'] = 'render';
 
} else $wgWorkflowUpdateState = false;
 
 
 
# Expand the #tags to reveal the current state and hide the others and add javascript
 
# - note the hidden states mustn't be rendered because they contain categorisation links which shouldn't be processed
 
function wfWorkflowExpand() {
 
 
 
# Extend catlinks information to include workflows
 
wfWorkflowExtendCatlinks();
 
 
 
# Populate $argv with both named and numeric parameters
 
$argv  = array();
 
$items = array();
 
foreach (func_get_args() as $arg) if (!is_object($arg)) {
 
if (preg_match('/^(.+?)\\s*=\\s*(.+)$/',$arg,$match)) $argv[$match[1]] = $match[2]; else $argv[] = $arg;
 
}
 
 
 
# Render the visible item
 
# - could also render all non-visible items here too, but with a cloned parser object so that the categorisation doesn't occur
 
# - that way the JS can instantly cycle through all rendered states, then set new state and get updated catlinks via ajax
 
$text = 'done';
 
foreach ($argv as $k => $v) {
 
if ($format == 'tag') {
 
$text = "<div class='$class' id='$id'>\n$text</div>";
 
}
 
elseif ($format == 'list') {
 
$text .= "<div class='$class item' id='$k'>$v</div>\n";
 
$text = "<div class='$class' id='$id'>\n$text</div>";
 
}
 
}
 
 
 
return $text;
 
}
 
 
 
# Update a tag state in an article
 
function wfWorkflowUpdateState($pagename,$name,$state) {
 
global $wgWorkflowMagic,$wgWorkflowState;
 
$title = Title::newFromtext($pagename);
 
if (is_object($title) && $title->exists()) {
 
$article = new Article($title);
 
$text = $article->getContent();
 
$wgWorkflowState = $state;
 
preg_replace_callback("/\\{\\{#$wgWorkflowMagic:.*?id\\s*=\\s*['\"]?$id\\W.*?\\}\\}/s",'wfWorkflowUpdateStateCB',$text,1,$count);
 
if ($count) $article->updateArticle($text,"summary",false,false);
 
}
 
}
 
 
 
# Replacement callback for updating tag state
 
function wfWorkflowUpdateStateCB($m) {
 
global $wgWorkflowMagic,$wgWorkflowState;
 
$m[0] = preg_replace("/(state\\s*=\\s*['\"]?)\\w+/","$1$wgWorkflowState",$m[0],1,$count);
 
if ($count < 1) $m[0] = preg_replace("/(\\{\\{#$wgWorkflowMagic:/","$0state=$wgWorkflowState|",$m[0]);
 
return $m[0];
 
}
 
 
 
# Extend catlinks information to include workflows
 
function wfWorkflowExtendCatlinks() {
 
static $done = 0;
 
if ($done++) return;
 
global $wgUser;
 
$skin = $wgUser->getSkin();
 
 
 
# Create a new Skin class (WorkflowSkin) by extending the existing one with overridden getCategoryLinks method
 
$class = get_class($skin);
 
eval("class WorkflowSkin extends {$class} ".'{
 
function getCategoryLinks() {
 
$catlinks = parent::getCategoryLinks();
 
$catlinks .= "<br>foo";
 
return $catlinks;
 
}
 
}');
 
 
 
# Replace user's skin with a WorkflowSkin replica
 
$wgUser->mSkin = new WorkflowSkin();
 
foreach (array_keys(get_class_vars($class)) as $k) $wgUser->mSkin->$k = $skin->$k;
 
}
 
 
 
# Return just the catlinks to the client after updating a tag state
 
function wfWorkflowReturnCatlinks() {
 
global $wgUser,$wgOut;
 
$skin = $wgUser->getSkin();
 
$catlinks = is_object($skin) ? $skin->getCategoryLinks() : 'Error: no skin!';
 
$wgOut->disable();
 
while(@ob_end_clean());
 
if (in_array('Content-Encoding: gzip',headers_list())) $catlinks = gzencode($catlinks);
 
echo($catlinks);
 
return false;
 
}
 
 
 
# Called from $wgExtensionFunctions array when initialising extensions
 
function wfSetupWorkflow() {
 
global $wgParser,$wgWorkflowMagic,$wgWorkflowUpdateState;
 
$wgParser->setFunctionHook($wgWorkflowMagic,'wfWorkflowExpand');
 
if ($wgWorkflowUpdateState) wfWorkflowUpdateState($_REQUEST['title'],$wgWorkflowName,$wgWorkflowState);
 
}
 
 
 
# Needed in MediaWiki >1.8.0 for magic word hooks to work properly
 
function wfWorkflowLanguageGetMagic(&$magicWords,$langCode = 0) {
 
global $wgWorkflowMagic;
 
$magicWords[$wgWorkflowMagic] = array(0,$wgWorkflowMagic);
 
return true;
 
}
 
?>
 

Latest revision as of 23:25, 3 August 2010

Info.svg This code is in our Git repository here.

Note: If there is no information in this page about this code and it's a MediaWiki extension, there may be something at mediawiki.org.