Extension:CustomEdit/CustomEdit.php

From MediaWiki.org
Jump to: navigation, search
<?php
 
/**
 * Extention to create a custom article editing form.
 *
 * By Barry Brannan (http://www.mediawiki.org/wiki/User:Barrylb)
 * and Florian Straub (http://www.mediawiki.org/wiki/User:Flominator)
 * 
 * This example assumes you have a set of articles named Person/John_Smith, Person/John_Brown ... etc 
 *
 * Whenever you are editing an article named Person/*, a form is shown with fields Sex, Age, Description.
 * When you first create the article, the fields are put together with a template named Person, eg:
 *   {{Person|sex=M|age=60}}My description
 *
 * When you edit an article, this form extracts the fields from a template used in the text and allows 
 * the user to edit them.  
 *
 * You also need to create a template called [[Template:Person]] to display the fields as you would like and
 * to activate the templates  this extension should use on [[MediaWiki:CustomEditTemplates]] before. 
 *
 * To enable this extension place the following in LocalSettings.php:
 *     require_once("extensions/CustomEdit.php");
 */
 
error_reporting(E_ALL ^ E_NOTICE); //deactivate notices but not other messages
 
$wgExtensionCredits['other'][] = array(
        'name' => 'CustomEdit',
        'version' => 1.1,
        'author' => array('Barry Brannan', 'Florian Straub'),
        'url' => 'http://www.mediawiki.org/wiki/Extension:CustomEdit',
        'description' => 'Example of how to create a custom article editing form',
);
 
if( defined( 'MEDIAWIKI' ) ) {
        global $wgHooks;
        $wgHooks['AlternateEdit'][] = 'fnMyCustomEdit';
} else {
        echo( "This is an extension to the MediaWiki package and cannot be run standalone.\n" );
        die( -1 );
}
 
function fnMyCustomEdit( &$editpage ) {
        global $wgOut, $wgRequest, $wgParser, $wgUser;
        $resultBoolean = true;
 
        $possibleTemplates = getCustomEditTemplates();
 
        //echo $possibleTemplates;
        if( is_array($possibleTemplates) ) {
                foreach( $possibleTemplates as $templateUsed ) {
                        $resultBoolean = tryCustomEdit($templateUsed, &$editpage);
                        if( !$resultBoolean ) {
                                break;
                        }
                }
        }
        return $resultBoolean;
}
 
/**
 * Does all the stuff Barry Brannan (http://www.mediawiki.org/wiki/User:Barrylb) introduced with
 * http://www.mediawiki.org/wiki/User:Barrylb/Custom_article_editing_form_with_fields
 * (public domain example of how to create a custom article editing form - created July 2006)
 * Problem: {{Person}} was the only template Barry's version handled.
 *
 * Improvement made by Florian Straub (http://www.mediawiki.org/wiki/User:Flominator):
 * It now uses getTemplateFields() from below to read the fields directly from the template  
 *
 * @param potential template used on this page
 * @return boolean 
 */
 
function tryCustomEdit( $templateUsed, &$editpage ) {
        global $wgOut, $wgRequest, $wgParser, $wgUser;
        $fieldsInTemplate = getTemplateFields("Template:" . $templateUsed);
 
        //echo "Templatefelder:".$fieldsInTemplate;
 
        foreach( $fieldsInTemplate as $fieldInTemplate ) {
                $templateFields[]['field'] = $fieldInTemplate;
        }
        // $templateFields[0]['field']="Age";
        // $templateFields[0]['value']="";
        // $templateFields[1]['field']="Sex";
        // $templateFields[1]['value']="";
 
        if( strpos($editpage->mTitle->getText(), $templateUsed.'/') === 0 ) {
                $wgOut->setArticleFlag(false);
                $wgOut->setArticleRelated(true);
 
                if ( !$editpage->mTitle->userCanEdit() ) {
                        $wgOut->readOnlyPage( $editpage->mArticle->getContent(), true );
                        return false;
                }
 
                if ( !$wgUser->isAllowed('edit') ) {
                        if ( $wgUser->isAnon() ) {
                                $editpage->userNotLoggedInPage();
                                return false;
                        } else {
                                $wgOut->readOnlyPage( $editpage->mArticle->getContent(), true );
                                return false;
                        }
                }
 
                if ( !$editpage->mTitle->userCan( 'create' ) && !$editpage->mTitle->exists() ) {
                        $editpage->noCreatePermission();
                        return false;
                }
 
                $wgOut->setPageTitle( wfMsg( 'editing', $editpage->mTitle->getPrefixedText() ) );
 
                if ( $wgRequest->wasPosted() ) {
                        $personDescription = rtrim ( $wgRequest->getText( 'wpDescription' ) );              
 
                        $personSex = $wgRequest->getText( 'wpSex' );
 
                        for( $i = 0; $i < count($templateFields); $i++ ) {
                                $formFieldName = 'wp' . $templateUsed . $templateFields[$i]['field'];
                                $plainFieldName = $templateFields[$i]['field'];
 
                                $templateFields[$i]['value'] = $wgRequest->getText( $formFieldName );
                                // $personAge = $wgRequest->getText( 'wpAge' );
                        }
 
                        $summary = $wgRequest->getText( 'wpSummary' );
                } else {
                        if( $editpage->mTitle->exists() ) {
                                $text = $editpage->mArticle->getContent();
                                $personDescription = preg_replace('/\{\{[^\}]*\}\}/', '', $text);
 
                                $max = count($templateFields);
                                for( $i = 0; $i < $max; $i++ ) {
 
                                        if( $i == ($max-1) ) {
                                                preg_match('/sex=(.*)\}\}/i', $text, $matches);
                                                $regExp = '/' . $templateFields[$i]['field'] .'=(.*)\n\}\}/i';
                                        } else {
                                                $regExp = '/' . $templateFields[$i]['field'] .'=(.*)\n/i';
                                        }
                                        preg_match($regExp, $text, $matches);
                                        $templateFields[$i]['value'] = $matches[1];
                                }
 
                                // preg_match('/age=(.*)\n/i', $text, $matches);
                                // $personAge = $matches[1];
                                // preg_match('/sex=(.*)\}\}/i', $text, $matches);
                                // $personSex = $matches[1];
 
                                } else {
                                        $personDescription = '';
 
                                        for( $i = 0; $i < count($templateFields); $i++ ) {
                                                $formFieldValue[$i]= ' ';
                                        }
                                        $summary = '';
                        }                                 
                }
 
                $editpage->textbox1 = "{{" . $templateUsed ."\n" ;
                for( $i = 0; $i < count($templateFields); $i++ ) {
                        $editpage->textbox1.= '|';
                        $editpage->textbox1.= $templateFields[$i]['field'];
                        $editpage->textbox1.= '=';
                        $editpage->textbox1.= $templateFields[$i]['value'];
                        $editpage->textbox1.= "\n";
                         //"|age=$personAge\n" .
                         //"|sex=$personSex
 
                }
                $editpage->textbox1 = $editpage->textbox1 . "}}\n" .
                                                $personDescription;
 
                if( $wgRequest->getCheck( 'wpSave' ) ) {
                        if( $editpage->mTitle->exists() )
                                $editpage->mArticle->updateArticle( $editpage->textbox1, $summary, false,  false, false, '' );
                        else
                                $editpage->mArticle->insertNewArticle( $editpage->textbox1, $summary, false, false, false, '');
                                return false;
                } else {
                        if( $wgRequest->getCheck( 'wpDiff' ) ) {
                                //$wgOut->addHTML( $editpage->getDiff() ); Switch those lines for MediaWiki versions prior to 1.12
                                $wgOut->addHTML( $editpage->showDiff() );
 
                        } else {                   
                                //if( $editpage->previewOnOpen() || $wgRequest->wasPosted() ) {
                                if( $wgRequest->wasPosted() ) {
                                        $parserOptions = ParserOptions::newFromUser( $wgUser );
                                        $parserOptions->setEditSection( false );
                                        $parserOptions->setTidy(true);
                                        $parserOutput = $wgParser->parse( $editpage->textbox1, $editpage->mTitle, $parserOptions );
                                        $previewHTML = $parserOutput->getText();
                                        $wgOut->addHTML('<div style="border: 2px solid #ededdd; padding: 8px; margin: 8px;">');
                                        $wgOut->addHTML($previewHTML);
                                        $wgOut->addHTML('</div>');
                                }
                                $firstFormFieldName = 'wp' . $templateUsed . $templateFields[0]['field'];
                                $wgOut->setOnloadHandler( 'document.editform.'. $firstFormFieldName .'.focus()' );
                        }
 
                        $wgOut->addHTML('<form id="editform" name="editform" method="post" action="' . $editpage->mTitle->escapeLocalURL("action=submit") . '" enctype="multipart/form-data">');
                        $wgOut->addHTML('<table border="0">');
 
                        for( $i = 0; $i < count($templateFields); $i++ ) {
                                $plainFieldName = $templateFields[$i]['field'];
                                $formFieldName = 'wp' . $templateUsed . $templateFields[$i]['field'];
                                $formFieldValue = $templateFields[$i]['value'];
 
                                $wgOut->addHTML('<tr><td>'. $plainFieldName .'</td><td><input id="'.$formFieldName.'" name="'.$formFieldName.'" type="text" size="20" value="' . $formFieldValue . '"/></td></tr>' . "\n");
                                //$wgOut->addHTML('<tr><td>Sex:</td><td><input id="wpSex" name="wpSex" type="text" size="20" value="' . $personSex . '"/></td></tr>');
 
                        }
 
                        $wgOut->addHTML('<tr><td>Description:</td><td><textarea rows="10" cols="40" name="wpDescription">' . $personDescription . '</textarea></td></tr>');
                        $wgOut->addHTML('<tr><td>Edit summary:</td><td><input id="wpSummary" name="wpSummary" type="text" size="80" value="' . $summary . '"/></td></tr>');
                        $wgOut->addHTML('</table>');
                        $wgOut->addHTML('<input id="wpSave" name="wpSave" type="submit" value="' . wfMsg('savearticle') . '"/>');
                        $wgOut->addHTML('<input id="wpPreview" name="wpPreview" type="submit" value="' . wfMsg('showpreview') . '"/> ');
                        $wgOut->addHTML('<input id="wpDiff" name="wpDiff" type="submit" value="' . wfMsg('showdiff') . '"/> ');                       
                        $wgOut->addHTML('</form>');
                }
                return false;
        }
        //else
        return true;  
 
}
 
/**
 * Retrieves text from an article
 * @param name of the article as string
 * @return text from article as string
 */
function getArticleText( $article = "Main Page" ) {
        //ialex @ #mediawiki: you shouldn't create a title object with "new Title( ... )", always une a static method you can see at the top of Title.php
        $t = Title::NewFromText($article);
        $art = Revision::newFromTitle( $t );
        if( $art != null ) {
                return $art->getText();
        } else {
                return "";
        }
}
 
/**
 * Retrieves a list of fields available at a template (text surrounded by {{{X}}} or {{{X| )
 * @param the template
 * @return Simple array with field names
 */
function getTemplateFields( $template ) {
        $templateText = getArticleText($template);
 
        $parts = explode("{{{", $templateText);
        $params = array();
        foreach( $parts as $part ) {
                $endOfBrackets = strpos($part, "}}}");
                $positionOfPipe = strpos($part, "|");
                if( ($positionOfPipe) && ($positionOfPipe < $endOfBrackets) ) {
                        $endOfBrackets = $positionOfPipe;
                }
 
                if( $endOfBrackets ) {
                        $parameterInTemplate = trim(substr($part, 0, $endOfBrackets));
 
                        if( ( $parameterInTemplate != "" ) && ( !in_array($parameterInTemplate, $params) ) ) {
                                $params[] = $parameterInTemplate;
                        }
                }
        }
        return $params;
}
 
/**
 * Retrieves a list of templates stored in [[MediaWiki:CustomEditTemplates]]
 * @return Simple array with template names
 */
function getCustomEditTemplates() {
        $templates = "";
        $templateNamespaceAlias = getArticleText('MediaWiki:Nstab-template');
 
        $templateList = getArticleText('MediaWiki:CustomEditTemplates');
        $templateList = str_replace($templateNamespaceAlias.':', 'Template:', $templateList);
 
        $parts = explode("\n", $templateList);
 
        foreach( $parts as $part ) {
                $beginnOfTemplate = strpos($part, 'Template:');
 
                if( $beginnOfTemplate != -1 ) {
                        $endOfBrackets = strpos($part, ']]', $beginnOfTemplate);
                        $pipeInString = strpos($part, '|', $beginnOfTemplate);
 
                        if(( $beginofTemplate+8 < $pipeInString) && ($pipeInString < $endOfBrackets )) {
                                $endOfBrackets = $pipeInString;
                        }
                        $templateName = substr($part, $beginnOfTemplate + 9, $endOfBrackets - ($beginnOfTemplate + 9));
                        $templates[] = $templateName;
                }
        }
 
        return $templates;
}
Personal tools
Namespaces
Variants
Actions
Site
Support
Download
Development
Communication
Print/export
Toolbox