summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'SemanticForms/specials/SF_RunQuery.php')
-rw-r--r--SemanticForms/specials/SF_RunQuery.php181
1 files changed, 181 insertions, 0 deletions
diff --git a/SemanticForms/specials/SF_RunQuery.php b/SemanticForms/specials/SF_RunQuery.php
new file mode 100644
index 00000000..fbe103b3
--- /dev/null
+++ b/SemanticForms/specials/SF_RunQuery.php
@@ -0,0 +1,181 @@
+<?php
+/**
+ * Displays a pre-defined form that a user can run a query with.
+ *
+ * @author Yaron Koren
+ * @file
+ * @ingroup SF
+ */
+
+/**
+ * @ingroup SFSpecialPages
+ */
+class SFRunQuery extends IncludableSpecialPage {
+
+ /**
+ * Constructor
+ */
+ function __construct() {
+ parent::__construct( 'RunQuery' );
+ }
+
+ function execute( $query ) {
+ global $wgRequest;
+
+ if ( !$this->including() ) {
+ $this->setHeaders();
+ }
+ $form_name = $this->including() ? $query : $wgRequest->getVal( 'form', $query );
+
+ $this->printPage( $form_name, $this->including() );
+ }
+
+ function printPage( $form_name, $embedded = false ) {
+ global $wgOut, $wgRequest, $sfgFormPrinter, $wgParser, $sfgRunQueryFormAtTop;
+ global $wgUser;
+
+ // Get contents of form-definition page.
+ $form_title = Title::makeTitleSafe( SF_NS_FORM, $form_name );
+
+ if ( !$form_title || !$form_title->exists() ) {
+ if ( $form_name === '' ) {
+ $text = Html::element( 'p', array( 'class' => 'error' ), wfMessage( 'sf_runquery_badurl' )->text() ) . "\n";
+ } else {
+ $text = Html::rawElement( 'p', array( 'class' => 'error' ),
+ wfMessage( 'sf_formstart_badform', SFUtils::linkText( SF_NS_FORM, $form_name ) )->parse() ) . "\n";
+ }
+ $wgOut->addHTML( $text );
+ return;
+ }
+
+ // Initialize variables.
+ $form_definition = SFUtils::getPageText( $form_title );
+ if ( $embedded ) {
+ $run_query = false;
+ $content = null;
+ $raw = false;
+ } else {
+ $run_query = $wgRequest->getCheck( 'wpRunQuery' );
+ $content = $wgRequest->getVal( 'wpTextbox1' );
+ $raw = $wgRequest->getBool( 'raw', false );
+ }
+ $form_submitted = ( $run_query );
+ if ( $raw ) {
+ $wgOut->setArticleBodyOnly( true );
+ }
+ // If user already made some action, ignore the edited
+ // page and just get data from the query string.
+ if ( !$embedded && $wgRequest->getVal( 'query' ) == 'true' ) {
+ $edit_content = null;
+ $is_text_source = false;
+ } elseif ( $content != null ) {
+ $edit_content = $content;
+ $is_text_source = true;
+ } else {
+ $edit_content = null;
+ $is_text_source = true;
+ }
+ list ( $form_text, $javascript_text, $data_text, $form_page_title ) =
+ $sfgFormPrinter->formHTML( $form_definition, $form_submitted, $is_text_source, $form_title->getArticleID(), $edit_content, null, null, true, $embedded );
+ $text = "";
+
+ // Get the text of the results.
+ $resultsText = '';
+
+ if ( $form_submitted ) {
+
+ // @TODO - fix RunQuery's parsing so that this check
+ // isn't needed.
+ if ( $wgParser->getOutput() == null ) {
+ $headItems = array();
+ } else {
+ $headItems = $wgParser->getOutput()->getHeadItems();
+ }
+ foreach ( $headItems as $key => $item ) {
+ $wgOut->addHeadItem( $key, "\t\t" . $item . "\n" );
+ }
+
+ $wgParser->mOptions = ParserOptions::newFromUser( $wgUser );
+ $resultsText = $wgParser->parse( $data_text, $this->getTitle(), $wgParser->mOptions )->getText();
+ }
+
+ // Get the full text of the form.
+ $fullFormText = '';
+ $additionalQueryHeader = '';
+ $dividerText = '';
+ if ( !$raw ) {
+ // Create the "additional query" header, and the
+ // divider text - one of these (depending on whether
+ // the query form is at the top or bottom) is displayed
+ // if the form has already been submitted.
+ if ( $form_submitted ) {
+ $additionalQueryHeader = "\n" . Html::element( 'h2', null, wfMessage( 'sf_runquery_additionalquery' )->text() ) . "\n";
+ $dividerText = "\n<hr style=\"margin: 15px 0;\" />\n";
+ }
+ $action = htmlspecialchars( $this->getTitle( $form_name )->getLocalURL() );
+ $fullFormText .= <<<END
+ <form id="sfForm" name="createbox" action="$action" method="post" class="createbox">
+
+END;
+ $fullFormText .= Html::hidden( 'query', 'true' );
+ $fullFormText .= $form_text;
+ }
+
+ // Either don't display a query form at all, or display the
+ // query form at the top, and the results at the bottom, or the
+ // other way around, depending on the settings.
+ if ( $wgRequest->getVal( 'additionalquery' ) == 'false' ) {
+ $text .= $resultsText;
+ } elseif ( $sfgRunQueryFormAtTop ) {
+ $text .= Html::openElement( 'div', array( 'class' => 'sf-runquery-formcontent' ) );
+ $text .= $fullFormText;
+ $text .= $dividerText;
+ $text .= Html::closeElement( 'div' );
+ $text .= $resultsText;
+ } else {
+ $text .= $resultsText;
+ $text .= Html::openElement( 'div', array( 'class' => 'sf-runquery-formcontent' ) );
+ $text .= $additionalQueryHeader;
+ $text .= $fullFormText;
+ $text .= Html::closeElement( 'div' );
+ }
+
+ if ( $embedded ) {
+ $text = "<div class='runQueryEmbedded'>$text</div>";
+ }
+
+ // Armor against doBlockLevels()
+ $text = preg_replace( '/^ +/m', '', $text );
+
+ // Now write everything to the screen.
+ $wgOut->addHTML( $text );
+ SFUtils::addJavascriptAndCSS( $embedded ? $wgParser : null );
+ $script = "\t\t" . '<script type="text/javascript">' . "\n" . $javascript_text . '</script>' . "\n";
+ if ( $embedded ) {
+ $wgParser->getOutput()->addHeadItem( $script );
+ } else {
+ $wgOut->addScript( $script );
+ $po = $wgParser->getOutput();
+ if ( $po ) {
+ // addParserOutputMetadata was introduced in 1.24 when addParserOutputNoText was deprecated
+ if( method_exists( $wgOut, 'addParserOutputMetadata' ) ){
+ $wgOut->addParserOutputMetadata( $po );
+ } else {
+ $wgOut->addParserOutputNoText( $po );
+ }
+ }
+ }
+
+ // Finally, set the page title - previously, this had to be
+ // called after addParserOutputNoText() for it to take effect;
+ // now the order doesn't matter.
+ if ( !$embedded ) {
+ if ( $form_page_title != null ) {
+ $wgOut->setPageTitle( $form_page_title );
+ } else {
+ $s = wfMessage( 'sf_runquery_title', $form_title->getText() )->text();
+ $wgOut->setPageTitle( $s );
+ }
+ }
+ }
+}