无法在MediaWiki中的jQuery.ajax调用中访问全局PHP变量

时间:2012-03-27 15:33:51

标签: php jquery ajax global mediawiki

当我在MediaWiki框架中对php函数进行AJAX调用时,我遇到了访问全局变量的麻烦。

我的jQuery AJAX调用如下所示:

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

我的GeneralFunctions.php文件如下所示:

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

当我通过click事件运行jQuery调用时,我得到了parseInline()函数。全局变量从未在范围中定义,我得到错误:

致命错误:在行 /path/to/file/GeneralFunctions.php 中的非对象上调用成员函数parseInline() b> 54

我不确定如何进行解析调用并在进行AJAX调用时定义全局变量?

更新

$ wgOut是与MediaWiki关联的OutputPage对象。它包含页面的所有HTML,并在整个MediaWiki框架中用于向页面或文章添加内容。它在服务器端用于为Wiki文章创建自定义输出。我用它来创建表单或在我们的许多wiki上添加HTML。

此处有更多信息:http://www.mediawiki.org/wiki/Manual:$ wgOut

更新2

@Juhana我将我的功能改为看起来像这样,导致与以前相同的错误。每个echo输出“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);
}
?>

2 个答案:

答案 0 :(得分:1)

在遇到全局变量问题后,我采取了不同的方法。我改变了我正在制作的AJAX调用,下面的代码对我来说效果很好。我正在使用您可以找到here的可编辑jquery表。

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;
}

答案 1 :(得分:0)

无论出于何种原因,扩展程序似乎无法访问$wgOut。我通过使用钩子OutputPageParserOutput为我需要输出的代码解决了这个问题(我需要注入一些脚本和样式表以及使用另一个钩子来修改链接而不想使用Resource_Loader打扰它很有用并且推荐):

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

与其他钩子一样,如果你不想在一个类中执行,你可以摆脱数组而只支持一个函数名。