Тя е доста дълга, TLDR версия под критичната стена от текст.
Настройка: Нашата компания използваше прототип от известно време и съвсем наскоро премина към доджо. Преобразувах много и много JS и върнах всичко обратно към нормалното и тогава се сблъсках с този проблем...
Проблемът: Имам типичен формуляр, настроен с поле за качване на файл. (Не използвам dijit и опитах множество техни варианти - не ми работят може би в 1.4, ще опитам отново.) При натискане на бутона за изпращане моите намерения бяха да наблюдавам напредъка на качването на файловете, в прототипа на това беше просто извикване на ajax.PeriodicalUpdater (което основно е xhrGet/Post, което се изпълнява отново и отново и отново). В съчетание с apc.rfc1867 (пример: http://www.phpriot.com/articles/php-ajax-file-uploads/3) това става много лесно, като цяло публикувате и използвате ajax, за да извлечете текущия прогрес на файла.
Тук се натъквам на действителния проблем... xhrPost() изглежда не иска да се изпълнява, след като формулярът премине в това, което наричам „режим на изпращане“ (където страницата се спулира и качва) . APC всъщност се нуждае от файловете да бъдат в „режим на изпращане“, за да проучи текущия напредък и да върне % чрез ajax.
Какво опитах: Само едно нещо работи частично. Използване на onclick="" извикване на xhrPost() незабавно последвано от return false; Проблемът с това е, че единственият начин, по който го накарах да работи, беше да щракна върху бутона за изпращане и след това да щракна върху отделен бутон за изпращане с return false... Мисля, че защо това работи е, че започна нормално изпращане, след това по време процеса на качване изпрати xhrPost() заедно с return false;. Вероятно качванията са започнали отново, но това, което е сигурно е, че APC данните са били въвеждани в лентата за напредъка, за съжаление това не би трябвало да изисква 2 щраквания. Освен това също не завърши изпращането на страницата.
Имах малък успех с помощта на dojo.connect() към бутона или формуляра.
Имах малък успех с onclick="" освен ако return false; присъства.
Имах малък успех с помощта на dojo.io.iframe за изпращане на отделна заявка.
Постигнах малък успех с помощта на dojox.file.FileUpload и също така представя голяма сума от собствените си проблеми.
Кодови фрагменти:
Стар код:
new PeriodicalExecuter(function(pe) {
if( dojo.byId('progressbar').innerHTML == 'Processing...' ) {
pe.stop();
} else if( dojo.byId('progressbar').innerHTML != '' ) {
dojo.byId('progressbar1').setStyle({
width: dojo.byId('progressbar').innerHTML + '%'
});
}
}, 1);
Нов код:
dojo.xhrPost({
url: 'ajax/apcProgressBar.php',
content: { progress_key: dojo.byId( 'progress_key' ).value },
load: function( data ) {
dojo.byId( 'progressbar' ).innerHTML = data;
if( dojo.byId( 'progressbar' ).innerHTML != '' ) {
dojo.style( 'progressbar1', 'width', dojo.byId( 'progressbar' ).innerHTML + '%' );
window.setTimeout(this, 2000);
}
}
});
}
APC работа:
if( isset( $_POST[ 'progress_key' ] ) ) {
if( $status = apc_fetch( 'upload_' . $_POST[ 'progress_key' ] ) ) {
$progress = ceil( $status[ 'current' ] / $status[ 'total' ] * 100 );
if ( $progress >= 100 ) {
echo 'Processing...';
} else {
echo $progress;
}
}
echo '...';
}
TLDR версия: Имам нужда от начин да изпратя формуляр с файлове за качване и да изпратя xhrPost() едновременно и нищо, което опитвам, не работи. Единствената друга променлива е, че APC трябва да знае за файла, който се опитва да бъде качен, и спирането на събитието изглежда възпрепятства това напълно.