Visualizzazione dei risultati da 1 a 4 su 4
  1. #1

    Progressbar php ajax pdf

    Ciao a tutti ragazzi, sono giorni che ci sbatto la testa e spero che qualcuno mi dia una mano o almeno che mi dica che non si possa fare anche se per me si può sicuramente.

    Premetto che sto usando zend framework per la prima volta mi trovo bene, ho capito e tutto funziona perfettamente.

    Problema:

    Ho la necessità di creare delle bolle in pdf prelevando i dati dal database, però dal momento che potrebbero essere anche 30-40 bolle devo poter far vedere all'utente che sta accadendo qualcosa ed avevo in mente di mostrare una progressbar che mostra quindi l'avanzamento del processo di creazione dei pdf.

    lato client ho creato una funzione che ogni secondo e mezzo và a verificare l'avanzamento del processo.

    ed in php ho creato due funzioni, una che crea effettivamente il pdf ed aggiorna delle variabili di sessione che tengono in memoria la pagina corrente in modo da poter sapere a che punto sono.

    L'altra funzione invece non deve fare altro che fare echo in formato json della pagina corrente che mi sono salvato nella sessione e che quindi sarà richiamata dallo script ajax definito in precedenza.

    Posto un pò di codice che almeno capite anche perchè non è facile da spiegare a parole:


    lato client:

    function makeRequest(url)
    {
    var httpRequest;

    if (window.XMLHttpRequest) {
    httpRequest = new XMLHttpRequest();
    if (httpRequest.overrideMimeType) {
    httpRequest.overrideMimeType('text/xml');
    }
    } else if (window.ActiveXObject) {
    try {
    httpRequest = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
    try {
    httpRequest = new ActiveXObject("Microsoft.XMLHTTP");
    } catch (e) {}
    }
    }

    if (!httpRequest) {
    alert('Giving up Cannot create an XMLHTTP instance');
    return false;
    }

    httpRequest.onreadystatechange = function() { evalProgress(httpRequest); };
    httpRequest.open('GET', url, true);
    httpRequest.send('');

    }

    function observeProgress()
    {
    setTimeout('getProgress()', 1500);
    }

    function getProgress()
    {

    makeRequest('/test/progressbar');


    }

    function evalProgress(httpRequest)
    {
    try {
    if (httpRequest.readyState == 4) {
    if (httpRequest.status == 200) {
    eval('var data = ' + httpRequest.responseText);

    if (data.finished) {
    finish();
    } else {
    update(data);
    setTimeout("getProgress()", 1000);
    }
    } else {
    alert('There was a problem with the request.');
    }
    }
    } catch(e) {
    //finish();
    }
    }


    //aundo premo sul link parte il controllo
    $('a.stampa_bolla').click(function(){
    var id=$(this).attr("id");//prendo l'id che mi serve per fare la quaery
    $.get("/consegne/createpdf/id/"+id); lancio il processo che mi crea i pdf
    observeProgress();osservo l'avanzamento del processo da un altra pagina che legge le varibili di sessione

    });



    Lato server (php):

    public function createpdfAction(){
    $Bollapdf = new Zend_Session_Namespace('Bollapdf');// roba di zend cmq è la sessione
    for($i = 0; $i<20;$i++){
    $Bollapdf->Corrente=$i;//aggiorno la pagina corrente della bolla e la salvo nella sesisone
    }

    }


    public function progressbarAction(){
    $Bollapdf = new Zend_Session_Namespace('Bollapdf');// roba di zend cmq è la sessione
    $Bolla=array('corrente'=>$Bollapdf->Corrente);
    echo Zend_Json_Encoder::encode($Bolla); //restituisco in formato json la pagina corrente salvata prima dalla sessione
    }


    Il PROBELEMA sostanzialmente è che fino a che il pdf non è stato creato la chiamata ajax non mi torna niente, quando il pdf è stato creato mi torna 20, cioè l'ultimo valore.

    E' come se la chiamata ajax non risponde finchè la creazione della bolla non è terminata!

    Io invece vorrei che mi rispondesse ogni secondo e mezzo con una cosa del tipo:

    {"current":11}

    {"current":15}

    {"current":20}

    così che io possa monitorare l'avanzamento!

    Detto in breve non riseco ad eseguire i due processi separatamente e a leggere le variabili di sessione condivise da questi due processi!

    Grazie a tutti anche se non rispondete, la cosa è al quanto complicata credo...

  2. #2

    Re: Progressbar php ajax pdf

    Originariamente inviato da ringhio_8


    Il PROBELEMA sostanzialmente è che fino a che il pdf non è stato creato la chiamata ajax non mi torna niente, quando il pdf è stato creato mi torna 20, cioè l'ultimo valore.

    E' come se la chiamata ajax non risponde finchè la creazione della bolla non è terminata!
    Non conosco ZendFramework ma per quanto riguarda ajax la questione a naso è proprio quella...
    che finchè lo script lato server non è terminato la funzione di callback ajax non viene chiamata...

    una maniera per fare quello che vuoi potrebbe essere:
    mentre crei la bolla fai scrivere ogni tot secondi in una tabella del DB il valore
    'corrente'=>$Bollapdf->Corrente

    poi con ajax non chiami lo script della bolla ma chiami un script ad hoc che legge il dato presente in quella tabella

    ...non so se mi sono spiegato...

  3. #3
    Grazie per la risposta!!!

    Ci avevo pensato a fare così, però non volevo utilizzare una tabella temporaneamente per questa cosa!

    Però visto che sicuramente in ajax sei più esperto di me e mi dici di fare così farò così grazie!!!

    Ti faccio sapere se fila tutto liscio, ma sono sicuro anche io che così funzionerà!!!

    Grazie ancora!

  4. #4
    Niente da fare la cosa non funziona e sempre per lo stesso motivo, lo script cheato ad hoc che mi restituisce i dati in formato json resta in attesa dell' esecuzione dell'altro script che m,i crea la bolla e dopo mi risponde!!!

    Supponendo che io abbia una cosa del tipo crea

    <script type="text/javascript>

    $.(a#bolla).click(function(){
    $.get('progressbar.php',function(data){
    console.log(data); //questo mi restituisce roba del tipo {"current":20}
    },'json');
    });
    </script>

    Il fatto è che prima di rispondermi con i dati json mi produce il pdf e solo alla fine dell'escuzione mi risponde con i dati richiesti, mentre io vorrei che la chiamata mi rispondesse non appena ha i risultati (letti dal db) in modo tale da poter aggiornare la progressbar.

    Sostenzialmente a me viene da chiedere: Mentre attraverso il link richiamo la pagina per la creazione della bolla è possibile lanciare anche la richiesta ajax ogni 1,5 secondi ??

    Oppue, è possibile eseguire due chiamate get conntemporanemente??

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.