content top

CodeIgniter TV – o intiativa excelenta pentru incepatori si nu numai

CodeIgniter TV – o intiativa excelenta pentru incepatori si nu numai

Am aflat azi de pe Twitter ca se pregateste un proiect foarte util, sub numele de CodeIgniter TV.

Desi numele este cat se poate de sugestiv, am sa explic in cateva cuvinte ce inseamna acest lucru. Echipa din spatele proiectului isi propune sa prezinte tutoriale video de 10 pana la 15 minute care se concentreaza pe realizarea unui singur task.

Desi nu este o initiativa Ellis Lab, ma bucur ca exista un astfel de proiect in desfasurare, mai ales ca Adobe (de exemplu) a inteles de foarte mult timp utilitatea unui astfel de site (vezi tv.adobe.com).

Am descoperit din proprie exeperienta, ca vazand astfel de tutoriale video (chiar si pe teme pe care le cunosti), poti afla lucruri “colaterale” pe care nu le stiai. Si intr-un framework atat de versatil si dinamic, asa cum este CodeIgniter, sunt convins ca vor exista mereu lucruri de vazut.

Se pare ca in acest moment nu exista continut, dar daca mergeti la codeigniter.tv puteti sa le lasati datele de contact si ei promit ca va vor anunta cand sunt gata.

Eu le-am lasat deja si astept cu nerabdare aparitia primelor episoade.

Read More

Concurs – castiga o carte de PHP de la libris.ro

Concurs – castiga o carte de PHP de la libris.ro

Va spuneam in urma cu ceva vreme, ca am inceput o colaborare cu libris.ro. Eu sunt prins cu cartile pe care pe care deja le-am primit, asa ca m-am gandit ca ar fi momentul sa dau un cadou unuia dintre cititorii mei. Si pentru ca partenerul meu este o librarie online, ce altceva puteam sa pun la bataie, decat o carte.

In ultima vreme, am fost intrebat de mai multe persoane de unde ar putea sa inceapa sa invete PHP? Pentru cei ce nu ma stiu, eu sunt puternic infipt in era digitala. Daca-mi dai de ales intre a citi si a privi un tutorial video, aleg clar tutorialul video.

Cu toate astea, de cand am inceput sa citesc cartea de Algoritmi Fundamentali in Java, mi-am dat seama cat este de important sa ai in fata o pagina tiparita pe care sa poti sa studiezi o bucata de cod pana intelegi ce se intampla acolo. Da, poti sa dai pauza si la un tutorial video, dar nu faci asta; esti prins in ceea ce vezi acolo, vrei sa afli ce face mai departe.

Pe scurt, au si cartile rolul lor. De aceea pun la bataie cartea Initiere in PHP 5 scrisa de Steven Holzner. Astfel, cei care vor sa invete un limbaj de programare web, dar nu stiu de unde sa inceapa vor avea un punct de plecare foarte bun.

Mai mult, cartea nu se adreseaza numai neinitiatilor. Cei care lucreaza de putin timp cu PHP s-ar putea sa o gaseasca foarte utila.

Ce trebuie sa faceti pentru ca castiga? Lasati un comentariu (sau un link/trackback daca va simtiti inspirati) in care sa-mi spuneti de ce va doriti cartea.

Castigatorul nu va fi ales prin tragere la sorti, ci prin “jurizare” din partea mea, asa ca nu e suficient sa spuneti “vreau cartea”.

Nu trebuie sa fie neaparat o poveste care sa ma impresioneze pana la lacrimi. Vreau sa aflu ce va motiveaza sa invatati PHP.

Concursul incepe din momentul in care a fost publicat articolul si se va terminta Vineri 8 Iulie 2011. Imi rezerv dreptul de a anunta castigatorul intr-un articol publicat Luni, dupa finalizarea concursului. De asemenea, va rog sa folositi o adresa de email reala pentru comentariu, pentru ca aceea va fi modalitatea de contactare a castigatorului.

Spor la comentat si mult succes.

Read More

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

E ultima data cand mai instalez CodeIgniter

E ultima data cand mai instalez CodeIgniter

Nu va panicati. Situatia nu este atat de grava cum lasa sa se inteleaga titlul. Este adevarat, ca de azi incolo mi-am propus sa nu mai instalez CodeIgniter. Asta pentru ca am de gand sa fac upgrade de acum.

Sa va explic. Pana acum, de cate ori aparea o versiune noua de CodeIgniter, ma duceam repede si o descarcam. Din comoditate, faceam un backup la ce aveam pana acum si puneam noua versiune pentru a lucra pe ea. Cu alte cuvinte, niciodata nu faceam upgrade la o noua versiune. De fiecare data plecam de la zero.

Dupa ce la ultima lansare EllisLab ne-a pus la dispozitie un ghid de upgrade, mi-am dat seama ca abordarea mea este profund gresita din doua motive.

Unul este faptul ca pierd un pas important in experienta cu framework-ul. Partea de upgrade. O componenta importanta a unui framework bun este usurinta in utilizare, iar upgrade-ul de la o versiune ar trebui sa fie un criteriu important de masurare a acesteia.

Cel de-al doi-lea motiv si cel mai important, este simularea mediului de productie. In development e simplu. Stergi tot si o iei de la capat. Dar ce te faci cand ai o aplicatie care ruleaza deja in productie. Ai putea sa o lasi la versiunea pe care ai construit-o, dar mai sunt update-uri de securitate pe care nu e bine sa le eviti.

Astfel, experienta upgrade-ului in mediul de development ne poate scuti de multa bataie de cap la upgrade-ul pe server. Asa ca m-am hotarat. De azi incolo nu mai instalez CodeIgniter; il upgradez.

Read More

Update de securitate pentru CodeIgniter 2.0.x

Update de securitate pentru CodeIgniter 2.0.x

EllisLab tocmai a anuntat ca au fost lansate versiunile 2.0.2 si 2.0.1 pentru CodeIgniter Reactor, respectiv CodeIgniter Core.

Update-ul contine in principal repararea unei vulnerabilitati in filtrul XSS (Cross Site Scripting). Cu aceasta ocazie, se pare ca toata libraria de securitate a fost reorganizata.

Deci, pentru cei dintre voi care au trecut deja la CodeIgniter 2.0 recomand acest upgrade, iar cei care inca sunt pe 1.7.x, ce mai asteptati?

Cei de la EllisLab ne-au pus la dispozitie si un Ghid pentru upgrade, pe care va sfatuiesc sa-l cititi. Este scurt, dar de mare ajutor pentru ca nu prea aveti cum sa intuiti ce s-a schimbat pe acolo.

Read More

Tipuri de variabile in PHP

Tipuri de variabile in PHP

Vom vorbi in acest articol despre un aspect de care programatorii PHP tin cont destul de rar: tipul variabilei cu care lucreaza. Este adevarat ca PHP nu este foarte pretentios din acest punct de vedere, asa ca de ce ne-am bate capul cu asa ceva?

Pai, depinde foarte mult de situatiile in care ne gasim. Sa zicem ca avem de-a face cu un API care intoarce printre altele TRUE si FALSE. Ati crede ca sunt valori de tip BOOLEAN dar nu este mereu asa. Am avut de-a face cu astfel de interfete care desi intorceau success => TRUE nu era o valoarea booleana, ci sirul de caractere “TRUE”.

Mi-a luat ceva timp sa-mi dau seama ce se intampla de fapt, pentru ca daca printezi valoarea la ecran, vezi doar TRUE, ceea ce poate sa insemne orice. Asa ca am cautat putin si am descoperit ca exista o functie foarte utila in PHP. Se numeste gettype() si intoarce tipul variabilei evaluate.

Sa vedem o bucata de cod care sa exemplifice ceea ce spun:

<?php
$var_string = "5";
$var_int = 5;

$first_eval = gettype($var_string);
$second_eval = gettype($var_int);

echo $first_eval; // rezultat: 'string'
echo $second_eval; // rezultat: 'integer'
?>

De asemenea, pentru cei carora le place sa specifice tipul variabilelor cu care lucreaza (daca au background de Java sau AS3 de exemplu) exista si un settype(). Acesta ia doi parametri: primul este variabila pe care vrem sa o setam si al doi-lea este tipul pe care dorim sa-l “imprimam”.

<?php
settype($var_string, "integer");
$eval = gettype($var_string);

echo $eval; // rezultat: 'integer'
?>

* Observati ca nu am mai definit variabile $var_string. Asta pentru ca am folosit-o pe cea din exemplul de mai sus.

Atentie, functia settype() nu intoarce variabila setata. Nu fiti tentati sa scrieti codul in felul urmator:

<?php
$new_var = settype($var_string, "integer");
$eval = gettype($new_var);

echo $eval; // rezultat: 'boolean'
?>

Codul scris in acest fel va intoarce boolean in loc de integer pentru ca functia settype() intoarce TRUE atunci cand setarea se face cu succes si FALSE cand nu.

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