1
I need to show my user during an Ajax request the status of the same divided into 6 steps Ex.
1° : Gerando arquiv 2° : Arquivo Gerado 3°: Conectando FTP 4º: Conexão realizada 5º: Enviando arquivo 6º : Arquivo enviado
1
I need to show my user during an Ajax request the status of the same divided into 6 steps Ex.
1° : Gerando arquiv 2° : Arquivo Gerado 3°: Conectando FTP 4º: Conexão realizada 5º: Enviando arquivo 6º : Arquivo enviado
1
Proof of Concept
It’s just an example of how it could be implemented (not for use in production)
Note: Lavarel 5.6 using Queues
Routes
//dar início a processamento
Route::get('/processar', 'ProcessarArquivoController@processar');
//obter percentagem de acabamento
Route::get('/estadoprocesso/{processo}', 'ProcessarArquivoController@estado');
Controller
It has only two methods one to start the process the second to check the state of the process (percentage)
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Processo;
use App\Jobs\ProcessarArquivo;
class ProcessarArquivoController extends Controller
{
    /**
     * Inicia um processo enviando Processo para uma Queue
     * Devolve o modelo do processo em JSON
     * @return JSON
     */
    public function processar()
    {
        $processo = new Processo();
        $processo->percentagem = 5;
        $processo->save();
        ProcessarArquivo::dispatch($processo);
        return response()->json($processo, 200);
    }
    /**
     * Devolve o modelo do processo em JSON
     * @return JSON
     */
    public function estado(Processo $processo)
    {
        return response()->json($processo, 200);
    }
}
Job
The process to be executed by Queue, does nothing Sleep is just not to run instantaneously, in case could be file conversion, upload by ftp, etc..
namespace App\Jobs;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Processo;
class ProcessarArquivo implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
    protected $processo;
    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct(Processo $processo)
    {
        $this->processo = $processo;
    }
    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {
        sleep(2);//executar algo
        $this->processo->percentagem = 20;
        $this->processo->save();
        sleep(2);//executar algo
        $this->processo->percentagem = 30;
        $this->processo->save();
        sleep(2);//executar algo
        $this->processo->percentagem = 40;
        $this->processo->save();
        sleep(2);//executar algo
        $this->processo->percentagem = 50;
        $this->processo->save();
        sleep(2);//executar algo
        $this->processo->arquivo_enviado = 100;
        $this->processo->save();
    }
}
Migration
Process execution control table, just one example
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
class Processo extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('processos', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->integer('percentagem')->default(0);
            $table->timestamps();
        });
    }
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        //
    }
}
Front-End Page Bootstrap + jQuery Just one example.
<!doctype html>
<html lang="en">
<head>
    <title>POC</title>
    <!-- Required meta tags -->
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
    <!-- Bootstrap CSS -->
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm"
        crossorigin="anonymous">
</head>
<body>
    <!-- Optional JavaScript -->
    <!-- jQuery first, then Popper.js, then Bootstrap JS -->
    <script src="https://code.jquery.com/jquery-3.3.1.min.js" integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8="
        crossorigin="anonymous"></script>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q"
        crossorigin="anonymous"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl"
        crossorigin="anonymous"></script>
    <div class="container-fluid">
        <p>Progresso</p>
        <div class="card">
            <div class="card-body">
                <h4 class="card-title">Processamento</h4>
                <div class="row">
                    <div class="col-12">
                        <div class="progress">
                            <div class="progress-bar progress-bar-striped progress-bar-animated" role="progressbar" aria-valuenow="0" aria-valuemin="0"
                                id="progresso" aria-valuemax="100" style="width: 0%"></div>
                        </div>
                    </div>
                </div>
                <div class="row mt-5">
                    <div class="col-12">
                        <a name="" id="processar" class="btn btn-success" role="button">Processar ficheiro</a>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script>
        $(document).ready(function () {
            $('#processar').click(function () {
                console.log('A iniciar processo...');
                $.getJSON('/processararquivo', function (data) {
                    var id = data.id;
                    window.progresso = setInterval(function () {
                        obterEstado(id)
                    }, 1000)
                });
            });
        });
        function obterEstado(id) {
            $.getJSON('/estadoarquivo/' + id, function (data) {
                console.log('A verificar processo: ' + data.id);
                $("#progresso").css('width', data.percentagem + '%');
                if (data.percentagem == 100) {
                    console.log('A finalizar processo: ' + data.id);
                    clearInterval(window.progresso);
                }
            })
        }
    </script>
</body>
</html>
Browser other questions tagged php jquery twitter-bootstrap
You are not signed in. Login or sign up in order to post.
Okay. What’s the problem?
– Woss
I am currently able to implement this by rendering only the final request answer. Already now I need the user to see on screen several steps of the process until the end.
– Railam Ribeiro
Here is the official documentation, divide 100% by the Steps numbers you need and change the values at the time of each request https://getbootstrap.com/docs/3.components/#Progress
– hugocsl
Here’s an example I think is closer than you need https://stackoverflow.com/questions/47301397/how-can-i-make-a-series-of-steps-for-a-progress-bar-in-a-multi-step-form
– hugocsl
I think the problem is on the server side
– Jorge Costa
This is right @Jorgecosta , how should I proceed in the Back-end? , done this how to treat this return with Jquery at runtime showing the user every step of the process ? I am getting clear ?
– Railam Ribeiro
What kind of technology are you using on the server side
– Jorge Costa
Apache Server , Laravel framework
– Railam Ribeiro
by q li, you need for each step described, an ajax function q execute q vc quer(ie, va la in the controller, access the database for example and return data to update your page, informing the user what was done and q is already available). 1º Generating File (create an ajax function q executes the precise q and change the status of Prox step (2nd generated file). so on).
– Sidclay Ataíde
Read on: https://www.binarytides.com/ajax-based-streaming-without-polling/
– Woss