PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : INPUT-Button beim Laden einer Seite deaktivieren?


mf_2
2008-09-15, 09:59:51
Hallo,

ich habe ein PHP Script erstellt, welches am Anfang der Ausführung sehr große Datenmengen verarbeiten muß. Nun wird immer als erstes ein "Abmelden" Button geladen. Wenn dieser geklickt wird, wird der Verarbeitungsprozess unterbrochen, was sehr schlecht ist.
Kann ich nun den Button beim Laden der Seite deaktivieren? Also quasi direkt vor dem Codeblock der Datenverarbeitung?
Danach möchte ich ihn gerne wieder aktivieren. Wie geht das?
Das blöde ist, dass der Datenverarbeitungsblock nicht immer abgearbeitet wird, sondern manchmal auch vorher verzweigt wird.
Deaktivieren mit onload im BODY Tag ist also auch nicht so der Burner.
Ich habe im Internet immer nur was gefunden wie ich einen Button nach dem Absenden eines Formulars deaktiviere um doppeltes Absenden zu vermeiden.

Kennt ihr eine Lösung für meinen Fall?
Ich habe auch mal sowas vor den Verarbeitungsblock gesetzt, es hat aber nicht gewirkt:
<DIV onload=document.input.namedesbuttons.disabled=true;>

Gruß,
mf_2

Berni
2008-09-15, 11:07:31
Du kannst den Button ja per php (mit "echo") ausgeben am Ende der Bearbeitung. Vermutlich wird das Script aber auch abgebrochen, wenn der User auf "Abbrechen" in seinem Browser klickt, oder (kann man aber glaub ich in der php.ini umändern)?
Ich weiß ja nicht was du da genau baust aber vielleicht wärs besser, wenn du die Verarbeitung per exec("php bla.php >/dev/null 2>&1 &") als Hintergrundprozess machen lässt. Dann kann niemand was unterbrechen (aber Achtung bei Userparametern, die du per Kommandozeile an das Script gibst => escapen oder anderweitig übergeben). Setzt natürlich voraus, dass du entsprechende Rechte hast.

huha
2008-09-15, 11:19:43
Du kannst den Button im HTML-Quelltext auf disabled setzen und nach dem Laden der Seite mit Javascript aktivieren.

-huha

darph
2008-09-15, 11:32:05
Hilft dir möglicherweise der Outputbuffer?

In PHP funktioniert das mit ob_start() (http://www.php.net/manual/en/function.ob-start.php) und ob_flush() (http://www.php.net/manual/en/function.ob-flush.php)

<?php
ob_start();

for($i = 0; $i < 70; $i++)
{
echo("printing...<br />");
}
ob_flush();
?>

Evtl. wäre es sinnvoll, erstmal nur ein "bitte warten" einzublenden und dann, wenn deine Seite fertig gerechnet hat, den Rest auf einen Schwung auszugeben.

mf_2
2008-09-15, 16:55:15
Das problem ist, dass der Abmelden Button bei jedem Aufruf der Seite geladen wird und immer in der Zeile direkt unter der Überschrift zu finden ist.
Erst danach wird via include() sozusagen die Datei mit Inhalt eingebunden. Und manchmal ist diese Datei eben eine, die sehr große Datenmengen verarbeiten muß. Wenn diese Datei eingebunden wird, will ich eben den Abmelden Button deaktivieren bis die Datei komplett durchlaufen ist.
Also geht das mit dem Output Buffering schonmal nicht.
Huhas Lösung scheitert an den Fällen (ca. 4 von 5), wo einfach eine normale HTML Datei eingebunden wird und nicht so eine komplexe Abarbeitung stattfindet.
Aber ich probiere es trotzdem mal, dann wird der Button eben bei allen Dateien deaktiviert, das geht denke ich auch.
Danke für eure Antworten!!

darph
2008-09-15, 22:50:24
Also geht das mit dem Output Buffering schonmal nicht.
Das ist richtig. Deaktivieren kannst du ihn damit nicht. Du kannst aber verhindern, daß er dargestellt wird, bis dein Programm sein Geraffel erledigt hat. Einfach nichts an den Browser senden, bis alles erledigt ist.

Natürlich mußt du ob_start() dann aufrufen, bevor der Code für den Button vom Server an den Client gesendet wird.

PatkIllA
2008-09-16, 19:10:02
Du kannst bei deinem include ja auch direkt zu Beginn einen Javascript Block ausgeben, der den Button deaktiviert und dann erst die Daten verarbeiten.
Da kannst du evtl auch einen "bitte Warten"-Block ausgeben, damit der Benutzer mit etwas längerer Zeit rechnet.
Evtl. musst du den Ausgabepuffer vorher flushen, damit der Code auch beim Browser ankommt.

Tommes
2008-09-16, 20:02:12
Oder den gesamten Code in eine Variable schreiben und diese wenn alles fertig ist, ausgeben.

rotalever
2008-09-16, 20:56:58
Und immer daran denken, dass böse User auch mit dem Stop-Button des Browsers alles abbrechen können. Also darf es nicht zu Fehlern kommen, wenn die include-Datei nur teilweise abgearbeitet wird.

Gast
2008-10-13, 12:43:19
php ist ziemlich stumpfsinnig.
es führt einfach blind den code von oben nach unten aus.

wenn du das ausnutzt und den "funktionsblock" einfach VOR den button im code schreibst dann kommt der button auch erst, wenn der obere block abgearbeitet ist.

rotalever
2008-10-13, 17:15:04
php ist ziemlich stumpfsinnig.
es führt einfach blind den code von oben nach unten aus.
Wie fast jede Sprache.

squall23
2008-10-13, 18:39:42
Wenn es essentiell ist, dass das Script seine Arbeit beendet musst du sowieso den PHP Interpreter so konfigurieren, dass er das Script bis zum Ende abarbeitet. (Stichwort php.ini von oben) Gibt keine andere Möglichkeit. Der User könnte immer noch den Abbrechen Knopf des Browsers drücken und das würde das Script ansonsten auch beenden.

Wenn es nur darum geht, dass er sich nicht abmelden darf während du rechnest, dann kannst du das Abmelden auch in PHP deaktivieren. Zum Beispiel mit einem Flag in der Session.