2012-03-27 9 views
0

Ich bekomme Probleme beim Zugriff auf globale Variablen, wenn ich einen AJAX-Aufruf an eine PHP-Funktion im MediaWiki-Framework.Zugriff auf globale PHP-Variable in jQuery.ajax Aufruf in MediaWiki

Meine jQuery AJAX-Aufruf sieht wie folgt aus:

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

Meine GeneralFunctions.php Datei sieht wie folgt aus:

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

Wenn ich die jQuery Aufruf durch ein Click-Ereignis betreibe ich so weit wie die Funktion parseInline(). Die globale Variable wird nie in dem Bereich definiert, und ich bekomme die Fehlermeldung:

Fatal error: Call auf eine Elementfunktion parseInline() auf einem Nicht-Objekt in /path/to/file/GeneralFunctions.php on line

ich bin nicht sicher, wie den Parse-Anruf zu tätigen und die globale Variable definieren, wenn der AJAX-Aufruf gemacht wird?

UPDATE

$ wgOut ist das Outputpage Objekt mit MediaWiki verbunden. Es enthält den gesamten HTML-Code der Seite und wird im gesamten MediaWiki-Framework verwendet, um Inhalte zu einer Seite oder einem Artikel hinzuzufügen. Es wird auf der Serverseite verwendet, um angepasste Ausgaben für Wiki-Artikel zu erstellen. Ich benutze es, um Formulare zu erstellen oder HTML auf vielen unserer Wikis hinzuzufügen.

Mehr Infos hier: http://www.mediawiki.org/wiki/Manual: $ wgOut

UPDATE 2

@Juhana änderte ich meine Funktion wie folgt aussehen, die nach wie vor in den gleichen Fehler führt. Jedes Echo gibt "NULL" aus.

<?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); 
} 
?> 
+1

Also was genau ist '$ wgOut'? –

+0

Welche Art von Objekt? Zeige uns mehr Code. – Pete

+0

poste die Ausgabe von var_dump ($ wgOut); –

Antwort

1

Ich habe einen anderen Ansatz nach dem Ausführen in globalen Variablen Probleme. Ich änderte den AJAX-Anruf, den ich machte, und der folgende Code funktioniert sehr gut für mich. Ich verwende die bearbeitbare jquery-Tabelle, die Sie finden können 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; 
} 
0

Aus welchen Gründen auch immer, Erweiterungen scheinen keinen Zugriff auf $wgOut zu haben. Ich löste dies für meine Erweiterung mit dem Haken: OutputPageParserOutput für den Code, den ich brauchte Ausgabe (Ich brauchte einige Skripte und Stylesheets injizieren sowie einen anderen Haken, um Links zu ändern und wollte nicht mit Resource_Loader kümmern, obwohl es nützlich ist und empfohlen):

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

Wie bei anderen Haken, Sie loszuwerden des Arrays für nur einen Funktionsnamen, wenn Sie nicht innerhalb einer Klasse ausführen wollen, erhalten zu.