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

Intreaba-ma: Sistem de votare pentru o lista de obiecte

Intreaba-ma: Sistem de votare pentru o lista de obiecte

O sa vedem in acest articol un exemplu rapid pentru rezolvarea unei probleme cu care m-a abordat un cititor. Sa vedem despre ce este vorba.

Avem o lista de elemente, sa zicem melodii, ordonate dupa note. In dreptul fiecarei melodii utilizatorul are posibilitatea sa dea o nota pentru a o ridica in clasament. Dupa vot, trebuie sa fim redirectati inapoi la lista ordonata dupa noile note.

O sa rezolvam aceasta problema in cativa pasi simpli, pentru ca lucrurile sa fie cat mai clare. Pentru ca exemplul sa fie complet, eu am sa includ si fisierul care defineste baza de date cu care vom lucra.

Sa vedem, deci, cum arata structura bazei de date:

CREATE DATABASE music_test;

USE music_test;

CREATE TABLE song
(
	id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
	name VARCHAR(64) NOT NULL,
	rating INT NOT NULL
);

INSERT INTO song(name, rating) VALUES('Calexico - Pepita', 0);
INSERT INTO song(name, rating) VALUES('Clannad - I Will Find You', 0);
INSERT INTO song(name, rating) VALUES('Sven Van Hees - Flute Salad', 0);
INSERT INTO song(name, rating) VALUES('M.O.P. - Cold As Ice', 0);
INSERT INTO song(name, rating) VALUES('Gloria Gaynor - I Love You Baby', 0);
INSERT INTO song(name, rating) VALUES('Queen - Love of My Life', 0);
INSERT INTO song(name, rating) VALUES('Sally Oldfield - Mirror', 0);
INSERT INTO song(name, rating) VALUES('Linkin Park - Somewhere I Belong', 0);
INSERT INTO song(name, rating) VALUES('Holograf - Viata Are Gust', 0);
INSERT INTO song(name, rating) VALUES('Joey Diggs - Always Coca-Cola', 0);
INSERT INTO song(name, rating) VALUES('Mission Belle - Just What I Want', 0);
INSERT INTO song(name, rating) VALUES('Dj Bobo - Chihuahua', 0);

Dupa cum se vede, avem o tabela simpla in care tinem un id (pentru identificare unica), un nume si nota pe care a primit-o melodia. Observati ca toate melodiile pleaca de la nota zero.

Sa vedem acum fisierul index.php unde vom afisa melodiile si de unde utilizatorii vor putea vota

<!DOCTYPE html>
<html>

<head>
	<title>Lista melodii</title>
	<style type="text/css">
		body {
			font-family: sans-serif;
			font-size: 13px;
			color: #000;
		}

		table tr td {
			padding: 3px;
		}

		#wrapper {
			width: 304px;
			padding: 15px;
			border: 1px solid #CCC;
			margin: auto;
		}
	</style>
</head>

<body>
	<div id="wrapper">
		<form method="post" action="save.php">
			<?php include("table.php"); ?>
			<div style="text-align: right; margin: 0px; padding: 0px">
				<input type="submit" value="Voteaza" />
			</div>
		</form>
	</div>
</body>

</html>

Este o structura HMTL simpla, dar o scriem intr-un fisier cu extensia .php pentru a putea diviza putin codul. Astfel, observati ca includem la un moment dat fisierul table.php. Sa vedem cum arata el si ce face:

Read More

Intreaba-ma: Afisarea unei imagini in functie de ora

Intreaba-ma: Afisarea unei imagini in functie de ora

Am fost intrebat zilele trecute cum se poate afisa o imagine intr-o pagina in functie de ora la care aceasta este accesata. Sunt convins ca sunt mai multe feluri de a face acest lucru, dar unul mi-a venit in minte imediat. Sa afisam imaginea dintr-un fisier php extern in care sa decidem sursa in functie de ora, sau de orice alt parametru dorim.

Pentru asta am compus un mic exemplu (simplificat la maxim) ca sa demonstrez aceasta functionalitate. Avem nevoie pentru inceput de o pagina index.php in care sa avem un cod de felul urmator:

Vezi Demo

<!DOCTYPE html>
<html>
	<head>
		<title>Imagini la ore fixe</title>
		<style type="text/css">
			#container {
				width: 576px;
				border: 2px solid #CCC;
				margin: auto;
				padding: 10px;
			}

			#container img {
				float: left;
				margin-right: 10px;
			}
		</style>
	</head>

	<body>
		<div id="container">
			<?php include("getImage.php"); ?>
			<p>Nam vel sapien vel odio adipiscing congue ... a rutrum odio cursus. Nunc non eros orci.</p>
		</div>
	</body>
</html>

Dupa cum puteti vedea, la un moment dat includem un fisier php, denumit getImage.php. Fisierul respectiv va face echo la tag-ul <img> pe care il vom insera in pagina.

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