content top

Intreaba-ma: Executarea de scripturi PHP asincron

Intreaba-ma: Executarea de scripturi PHP asincron

Am fost abordat de unul din cititorii mei cu urmatoarea situatie (am sa reproduc felul in care a pus el problema):

Avem de-a face cu o pagina simpla (un HTML, sa zicem) care contine un formular; o vom numi pagina A. Pagina A face submit catre un script PHP, pe care-l vom numi B si care dupa ce termina ce are de facut redirecteaza utilizatorul catre pagina C (un landing page).

Deci care e problema? Pai, problema e ca scriptul B ruleaza cam mult (trimite o serie de email-uri) si utilizatorul sta si asteapta ca browser-ul sa incarce “ceva”.

Gabriel a venit cu o solutie interesanta la aceasta problema. A cautat un preloader care sa ruleze in timp ce se incarca scriptul B. Nu-i rau, dar eu cred ca aici se preteaza bine un AJAX. In general pentru astfel de situatii executarea asincrona este cea mai buna solutie.

Vezi Demo

Avand in vedere noile informatii, abordarea va fi in felul urmator: Pagina A face un request AJAX catre scriptul B si asteapta un raspuns. Intre timp afisaza o imagine de loading… (sau orice altceva). Cand termina ce are de facut, scriptul B il anunta pe A ca este momentul sa faca un redirect; catre landing page-ul C.

Bun, acum ca am vauzut despre ce-i vorba, sa descuram putin itele problemei. Vom incepe prin a da nume descriptive fisierelor, ca sa nu ne mai incurcam in litere.

Fisierul care contine formularul se numeste index.php si contine urmatorul cod:

<!DOCTYPE html>
<html lang="en">

<head>
	<title>AJAX Submitter</title>
	<link rel="stylesheet" href="style.css" type="text/css" />
</head>

<body>

	<div id="wrapper">
		<form method="POST" action="submit.php">
			<p>
				<label for="name">Name</label>
				<input type="text" name="name" id="name" />
			</p>
			<p>
				<label for="email">Email</label>
				<input type="text" name="email" id="email" />
			</p>
			<p>
				<label for="message">Message</label><br />
				<textarea name="message" cols="50" rows="7"></textarea>
			</p>
			<p>
				<input type="submit" value="Send" id="submit" />
				<img id="spinner" src="loading.gif" style="display:none; float: right;" />
			</p>
		</form>
	</div>

</body>

</html>

Codul este cat se poate de simplu, ca sa nu pierdem din vedere scopul principal. Dupa cum vedeti, formularul face submit catre un fisier PHP numit sugestiv submit.php.

<?php

session_start();

$name = "No name sumbitted";
if(isset($_POST["name"]))
	$name = $_POST["name"];

$email = "No email sumbitted";
if(isset($_POST["email"]))
	$email = $_POST["email"];

$message = "No message sumbitted";
if(isset($_POST["message"]))
	$message = $_POST["message"];

$_SESSION["name"] = $name;
sleep(3);
$_SESSION["email"] = $email;
sleep(3);
$_SESSION["message"] = $message;
sleep(3);

header("Location: landing.php");

?>

Codul este irelevant. L-am pus acolo doar ca sa execute ceva in spate. Mai mult, observati folosirea functiei sleep() de cateva ori. Asta ca sa simuleze faptul ca scriptul dureaza ceva mai mult decat in mod normal.

Dupa ce se executa codul, trimitem utilizatorul la un landing.php ca sa-l anuntam ca totul s-a intamplat cu succes. Codul arata asa:

<?php session_start(); ?>
<!DOCTYPE html>
<html lang="en">

<head>
	<title>AJAX Landing</title>
	<link rel="stylesheet" href="style.css" type="text/css" />
</head>

<body>

	<div id="wrapper">
		<h3>The following data has been sumbitted</h3>
		<p>Name: <?php echo $_SESSION["name"] ?></p>
		<p>Email: <?php echo $_SESSION["email"] ?></p>
		<p>Message: <?php echo $_SESSION["message"] ?></p>
	</div>

</body>

</html>

In momentul de fata avem exact situatia despre care vorbeam mai sus. La click, user-ul este trimis la submit.php unde nu vede decat o fereastra goala pana se executa codul. Abia la final este trimis catre landing.php.

Ca sa rezolvam problema, vom executa scriptul submit.php asincron. Ca sa ne fie mai usor, vom apela la jQuery pentru partea de AJAX.

Mai intai includem libraria jQuery:

	<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>

Apoi, tot ce trebuie sa facem este sa adaugam cateva linii de cod. Explicatiile le gasiti in comentarii la fiecare linie de cod unde acest lucru este necesar. P.S. Daca vi se pare greu de citit, il aveti mai jos fara comentarii (plus arhiva de la final):

	$(document).ready(function() {
		$("#submit").click(function(event) { // Declansam la click pe Submit
			event.preventDefault(); // Avem grija sa nu mai faca submit clasic
			$.ajax({
				url: "submit.php", // Unde facem requestul AJAX
				beforeSend: function() { // Inainte de request executam:
					$("#submit").css("display", "none"); // Ascundem butonul de submit
					$("#spinner").css("display", "block"); // Incarcam un loader (un gif)
				},
				type: "POST",
				data: ({
							name: $("#name").val(), // Luam valoarea lui 'name' pentru submit
							email: $("#email").val(), // Luam valoarea lui 'email' pentru submit
							message: $("#message").val() // Luam valoarea lui 'message' pentru submit
				}),
				success: function(msg) {
					window.location.replace("landing.php"); // La final, redirectam utilizatorul la landing.php
				}
			});
		});
	});

La final, ar trebui sa obtinem un fisier index.php care arata asa:

<!DOCTYPE html>
<html lang="en">

<head>
	<title>AJAX Submitter</title>
	<link rel="stylesheet" href="style.css" type="text/css" />
	<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js"></script>
	<script type="text/javascript">
		$(document).ready(function() {
			$("#submit").click(function(event) {
				event.preventDefault();
				$.ajax({
					url: "submit.php",
					beforeSend: function() {
						$("#submit").css("display", "none");
						$("#spinner").css("display", "block");
					},
					type: "POST",
					data: ({
							name: $("#name").val(),
							email: $("#email").val(),
							message: $("#message").val()
					}),
					success: function(msg) {
						window.location.replace("landing.php");
					}
				});
			});
		});
	</script>
</head>

<body>

	<div id="wrapper">
		<form method="POST" action="submit.php">
			<p>
				<label for="name">Name</label>
				<input type="text" name="name" id="name" />
			</p>
			<p>
				<label for="email">Email</label>
				<input type="text" name="email" id="email" />
			</p>
			<p>
				<label for="message">Message</label><br />
				<textarea name="message" cols="50" rows="7"></textarea>
			</p>
			<p>
				<input type="submit" value="Send" id="submit" />
				<img id="spinner" src="loading.gif" style="display:none; float: right;" />
			</p>
		</form>
	</div>

</body>

</html>

Dupa cum vedeti, n-am schimbat nimic in fisierele submit.php si landing.php. Am schimbat numai modul in care apelam aceste fisiere.

Acestea sunt elementele de baza pe care trebuie sa le stim pentru a oferi utilizatorului o experienta mai eleganta cu ajutorul AJAX.

Descarca arhiva

Read More

S-a lansat jQuery 1.6.1

S-a lansat jQuery 1.6.1

Se pare ca echipa de dezvoltare de la jQuery nu sta nicio clipa. La mai putin de 6 luni de la lansarea lui jQuery 1.5 si a lui 1.5.1 se pare ca deja avem de-a face cu versiunea 1.6.1.

Tineti cont, nu vorbim de jQuery 1.6. Acela s-a lansat deja pe data de 3 mai. Acum deja vedem primul update, ceea ce inseamna ca ritmul de dezvoltare este foarte rapid.

Daca folositi jQuery in activitatea de dezvoltare, va sfatuiesc sa cititi articolul de pe blogul lor, intrucat acesta contine atat modificarile care au aparut in aceasta noua versiune, cat si un mic ghid de upgrade de la 1.5.2 la 1.6.1.

Aveti grija, se pare ca unele lucruri s-au schimbat destul de mult, asa ca sfatul meu este sa cititi ghidul; aviz celor ce folosesc in mod constant .attr().

Read More

Agregatorul de bloguri jQuery – jQuery Bloggers

Agregatorul de bloguri jQuery – jQuery Bloggers

Vesti bune pentru cei care folosesc sau vor sa invete jQuery. Acum exista un blog unde sunt adunate intr-un singur loc cat mai multe articole pe aceasta tema.

Blogul, sau mai degraba agregatorul de bloguri, se gaseste la previzibila adresa http://www.jquerybloggers.com/, iar eu deja m-am abonat.

Pentru cei care au experienta limitata sau deloc cu jQuery, inca nu am vazut tutoriale de incepatori. Cu toate acestea, sunt convins ca ele vor aparea, pe masura ca numarul de bloguri agregate va creste.

Vestea a venit de la Raymond Camden, care din cate imi dau eu seama, e responsabil pentru aceasta initiativa.

Read More

S-a lansat jQuery 1.5.1

S-a lansat jQuery 1.5.1

Nici nu ne-am obsinuit bine cu proaspatul lansat jQuery 1.5 ca echipa de la jQuery Project deja ne-a pregatit un mic update.

Mai mult, se pare ca versiunea 1.5.1 nu aduce numai bug fix-uri ci si ceva functionalitati in plus, dovada ca jQuery e pus pe fapte mari. O privire rapida asupra noii versiuni ne arata ca focusul se afla in continuare pe acleasi teluri ca si la v 1.5.

Mai exact, observam ca jQuery.ajax() primeste trei noi optiuni. Asta vine pe fondul unui jQuery 1.5 care a facut mare valva in comunitatea dezvoltatorilor pentru imbunatatirile aduse la functiile de AJAX.

Spre rusinea mea, trebuie sa recunosc faptul ca n-am avut timp sa experimentez cu nici macar cu jQuery 1.5 si ce aduce el, dar promit ca voi face asta si voi reveni si cu niste exemple de cod…

Read More

Suntem cu un pas mai aproape de jQuery 1.5

O veste buna pentru utilizatorii de jQuery. Se pare ca dezvoltatorii cunoscutei librarii sunt din ce in ce mai aproape de lansarea versiunii 1.5.  Tocmai au pus la dispozitie un RC (Release Candidate), care poate fi descarcat de aici.

Echipa incurajaza developerii sa incerce aceasta versiune si sa raporteze eventuale bug-uri (cu mentiunea ca testele s-au facut pe v1.5 RC), pentru ca acestea sa poata fi rezolvate pana la lansarea versiunii finale.

Pentru mai multe detalii, puteti citi intregul articol direct de la sursa.

Read More

S-a lansat jQuery 1.4.3

S-a lansat jQuery 1.4.3

Trebuia sa marchez cumva momentul, asa ca m-am decis sa scriu un articol despre asta. De ce mi se pare important? Pentru ca jQuery este, in opinia mea, cea mai buna librarie JavaScript de pe piata la ceea ce isi propune sa faca.

Vor fi, poate, unii care vor spune ca exista librarii mai capabile de atat; care stiu sa genereze componente complexe in pagina cu tot felul de optiuni. E adevarat. Una din ele este Ext JS si este intr-adevar foarte capabila. Numai ca, in opinia mea, nu este un concurent pentru jQuery. Isi propun sa faca lucruri diferite si ambele isi ating scopul foarte bine.

Mie-mi place jQuery pentru ca a fost construit cu un scop simplu. Sa faca viata mai usoara pentru designeri/developeri. Este conceput in asa fel incat sa faca din cateva linii de cod ceea ce altfel ar fi necesitat functii complexe. Mai mult, sintaxa lui este mai intuitiva si mai usor de inteles decat cea a JavaScript-ului normal. Cel putin mie asa mi se pare.

Dar sa ne intoarcem la motivul pentru care a aparut acest articol. S-a lansat jQuery 1.4.3 si a adus odata cu el cateva imbunatatiri. N-am sa trec prin toate, dar am sa mentionez cateva care mie mi-au atras atentia.

O proprietate care nu exista pana acum este jQuery.fx.interval. Cu ajutorul acesteia putem sa setam numarul de cadre pe secunda cu care sa ruleze o animatie.

Read More
content top
  • RSS
  • Twitter
  • Tumblr
  • Facebook