简体   繁体   中英

Cannot Access Global PHP Variable in jQuery.ajax call in MediaWiki

I'm running into trouble accessing global variables when I make an AJAX call to a php function in the MediaWiki framework.

My jQuery AJAX call looks like this:

jQuery.ajax({
    url: 'GeneralFunctions.php',
    type: 'GET',
    dataType: 'json',
    data: {
        text: anchorText
    },
    success: function (data) {
        alert("data: " + data);
    }
});

My GeneralFunctions.php file looks like this:

<?php
if (isset($_GET['text'])) {
    jsonInlineParse((string) $_GET['text']);
}
function jsonInlineParse($wikiText)
{
    global $wgOut;
    $return = $wgOut->parseInline($wikiText); //fails here
    echo json_encode($return);
}
?>

When I run the jQuery call through a click event I get as far as the parseInline() function. The global variable is never defined in the scope and I get the error:

: Call to a member function parseInline() on a non-object in on line :在第行的的非对象上调用成员函数parseInline()

I'm not sure how to make the parse call and define the global variable when the AJAX call is made?

UPDATE

$wgOut is the OutputPage object associated with MediaWiki. It holds all the HTML of the page and is used throughout the MediaWiki framework to add content to a page or article. It is used on the server side to create customized output for wiki articles. I use it to create forms or add HTML on many of our wikis.

More info here: http://www.mediawiki.org/wiki/Manual :$wgOut

UPDATE 2

@Juhana I changed my function to look like this which results in the same error as before. Each echo outputs "NULL".

<?php
function jsonInlineParse($wikiText)
{
    include_once '/path/to/file/includes/OutputPage.php';
    include_once '/path/to/file/includes/parser/Parser.php';
    echo var_dump($wgOut);
    global $wgOut;
    echo var_dump($wgOut);

    $return = $wgOut->parseInline($wikiText);
    echo $return;
    echo json_encode($return);
}
?>

I took a different approach after running into global variable problems. I changed the AJAX call I was making and the code below works very well for me. I'm using the editable jquery table you can find here .

PHP

function ajax_parse(){
        global $wgRequest;
        if($wgRequest->wasPosted()){
            $text = $wgRequest->getVal("text");
            wfDebug("Recieving::::".$text);
            if(!strpos($text, "href")){
                $text = myInlineParse($text);
                $text = str_replace("<pre>", "", $text);
                $text = str_replace("</pre>", "", $text);
            }
            wfDebug("Returning::::".$text);
            echo $text;
        }
        exit;
    }

function myInlineParse( $wikiText ) {
    global $wgOut;
    return $wgOut->parseInline( $wikiText );
}

JavaScript

// inject wikitext after hitting save
function postSave(o) {
var response = new Array("");
for(var i=0;i<o.row.length;i++){
     new Ajax.Request(wgScript +'/Special:EditClass/ajax_parse',
    {
        asynchronous: false,
        parameters: {'text': o.row[i].innerHTML},
        onSuccess: function(text){
            response.push(text.responseText);
        }
    }            
    );
}

return response;
}

For whatever reasons, extensions don't seem to have access to $wgOut . I solved this for my extension by using the hook: OutputPageParserOutput for the code I needed output (I needed to inject some scripts and stylesheets as well as using another hook to modify links and didn't want to bother with Resource_Loader though it is useful and recommended):

$wgHooks['OutputPageParserOutput'][] = array($this, 'doOutputPageParserOutput'); // 'doOutputPageParserOutput' defined as method in my class

As with other hooks, you can get rid of the array in favor of just a function name if you don't want to execute within a class.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM