it-swarm.com.de

Abrufen / Festlegen von Benutzerzustands- und Sitzungsvariablen, die in der for-Schleife nicht funktionieren

Ich habe eine lange Ladezeit für Schleife in einer Funktion in einem meiner Modelle in meiner Joomla-Komponente. Um den Fortschritt zu messen, wollte ich einen Fortschrittsbalken mit Ajax und Javascript erstellen, während die Anfrage bearbeitet wird.

Zunächst habe ich einen einfachen Ajax-Aufruf einer Funktion eines der Controller durchgeführt, die den folgenden Code enthält:

   $mainframe =JFactory::getSession();
   $i=$mainframe->get('component.progress', 0);
   $echo($i);

Hier verwende ich getSession, aber soweit ich verstanden habe, Session und userstate oder fast das gleiche, außer dass userstate einige andere Dinge zulässt und die Variablen in der Registrierung speichert. Ich habe beide ausprobiert und die Ergebnisse sind die gleichen.

Das Get kommt aus der Foor-Schleife meiner Funktion innerhalb des Modells, die die schwere Berechnung durchführt, und sieht ungefähr so ​​aus:

for ($i = 1; $i < min(600, count($this->dati)); $i++) {
        $mainframe = JFactory::getSession();
        $mainframe->set('component.progress', $i);
        heavy computation...
}

beim Ausführen des PHP-Skripts rufe ich einfach diese Javascript-Funktion mit set_interval auf, die regelmäßig den Inhalt der Site ausgibt, der beim Aufrufen der Funktion auf der vorhandenen Site angezeigt wird:

function loadXMLDoc()
{
    var xmlhttp;
    if (window.XMLHttpRequest)
    {// code for IE7+, Firefox, Chrome, Opera, Safari
        xmlhttp = new XMLHttpRequest();
    }
    else
    {// code for IE6, IE5
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
    }
    xmlhttp.onreadystatechange = function ()
    {
        if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
        {
            document.getElementById("myDiv").innerHTML = xmlhttp.responseText;
        }
    }
    xmlhttp.open("GET", "index.php?option=com_contentimporter&task=contentimporter.test", true);
    xmlhttp.send();
}

Das Problem ist, dass der Benutzerstatus beim Ausführen des Skripts nicht aktualisiert wird. Es scheint, als würde es erst aktualisiert, wenn es fertig ist. Was ich jetzt vermute ist, dass Joomla diese Werte in einen Puffer legt, den es nur setzt, wenn eine ausstehende Anfrage erledigt ist.

Das ist leider nicht gut für das, was ich versuche zu tun.

Hat jemand einen Vorschlag, was ich stattdessen tun könnte? Es wäre am besten, wenn ich dies tun könnte, ohne die Standardeinstellungen in Joomla zu ändern.

edit : Ok, ich habe etwas Neues bemerkt, wenn die PHP-Funktion fertig ist, gebe ich ein Feedback aus, dass ich erhalten Sie vom userstate, das ich am Ende der Methode in meinem Modell einstellte, das die schwere Berechnung tut. Mir ist aufgefallen, dass dieses Feedback korrekt angezeigt wird, aber nur manchmal.

Das heißt, es werden manchmal die Rückmeldungen der vorherigen Verarbeitung und manchmal die Rückmeldungen der aktuellen Verarbeitung angezeigt. Manchmal kann ich das Fenster nach ein paar Sekunden aktualisieren und das richtige Feedback wird angezeigt (jedes Mal, wenn ich es aktualisiere, wird getUserstate für das Feedback aufgerufen), manchmal muss ich das Skript n Mal erneut ausführen, bevor das richtige Feedback angezeigt wird.

Es scheint sich unberechenbar und zufällig zu verhalten. Vielleicht habe ich versehentlich einige Tabellenwerte gelöscht oder einige Einstellungen in Joomla geändert, die dies verursachen könnten? Hat jemand eine Idee?

Außerdem habe ich gelesen, dass ich Folgendes tun könnte, wenn die Registrierung aus irgendeinem Grund nicht festgelegt wurde (setUserstat wird in diesem Fall nichts tun):

    $session = JFactory::getSession();
    $registry=$session->get('registry',null);
    if(is_null($registry)) {
        $session->set('registry', new JRegistry('session'));
    }

Ich habe es versucht, aber es scheint das Problem nicht zu beheben.

Auch sollte ich nicht, dass ich J! Dump gelegentlich benutze, um Informationen über einige Variablen anzuzeigen, und ich habe auch genau das gleiche Problem mit dieser Komponente, das Fenster mit dem Dump erscheint nur gelegentlich.

3
user1306192

Nun, ich glaube, ich hatte einmal ein ähnliches Problem, bei dem ich zufällige Ergebnisse bekam. Für mich verwendete die Lösung eine synchrone Anforderung (anstelle der asynchronen, die Sie auch verwenden, wenn ich mich nicht irre). Dies verringert die Leistung etwas, erzwingt jedoch die ordnungsgemäße Ausführung der Anforderung.

Ich fand gerade dieses Seite , das einige Beispiele erklärt und gibt. Versuchen Sie es einfach zu ändern

 xmlhttp.open("GET", "index.php?option=com_contentimporter&task=contentimporter.test", true);

zu

 xmlhttp.open("GET", "index.php?option=com_contentimporter&task=contentimporter.test", false);

Das "false" sollte die Anforderung synchronisieren.

1
elk