【问题标题】:Cannot Access Global PHP Variable in jQuery.ajax call in MediaWiki无法在 MediaWiki 中的 jQuery.ajax 调用中访问全局 PHP 变量
【发布时间】:2012-03-27 15:33:50
【问题描述】:

当我对 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);
}
?>

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

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

我不知道在进行 AJAX 调用时如何进行 parse 调用和定义全局变量?

更新

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

更多信息在这里:http://www.mediawiki.org/wiki/Manual:$wgOut

更新 2

@Juhana 我将我的函数更改为如下所示,这会导致与以前相同的错误。每个回显输出“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);
}
?>

【问题讨论】:

  • 那么$wgOut到底是什么?
  • 什么样的对象?向我们展示更多代码。
  • 从 var_dump($wgOut) 发布输出;
  • 您不会凭空自动获得 MediaWiki 变量。您必须包含定义它们的文件。您在 GeneralFunctions.php 文件中包含了哪些文件?
  • 另外,虽然 OutputPage.php 定义了 OutputPage 类,但 $wgOut 变量实际上是在 /includes/Setup.php 中使用 $wgOut = RequestContext::getMain()-&gt;getOutput(); 行初始化的

标签: php jquery ajax global mediawiki


【解决方案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;
}

【讨论】:

    【解决方案2】:

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

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

    与其他钩子一样,如果您不想在类中执行,则可以去掉数组而只使用函数名。

    【讨论】:

      猜你喜欢
      • 2016-11-12
      • 2012-03-06
      • 1970-01-01
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-03-21
      • 2014-01-17
      相关资源
      最近更新 更多