Elemente nivel mai avansat 12

PHP Functii Anonime – Closures

Incepand cu versiunea 5.3, PHP a introdus Functii Anonime, cunoscute si cu denumirea Closures.
Acest tip de functii sunt fara nume. Sunt utile mai ales in retuenarea unor valori la apeluri in cadrul altor functii.

1. Exemplu, functie anonima folosita pentru returnarea unei valori intr-o functie PHP.

<?php

$arr = array(‘ hello word ‘, ‘ Have <b>good day</b>’);

// sterge tag-urile si spatiile exterioare din fin fiecare element din array

// Face majuscula prima litera a fiecarui cuvant

$arr = array_map(function($elm){

 return ucwords(trim(strip_tags($elm)));

}, $arr);

var_export($arr);            // array ( 0 => ‘Hello Word’, 1 => ‘Have Good Day’ )

?>


2. Closures pot fi utilizate si ca valori ale variabilelor (observati cum e apelata functia, folosind numele variabilei, inclusiv caracterul $).

<?php

$website = function($name) {

  return ‘http://www.’. $name. ‘.net’;

};

echo $website(‘PHPCursWeb’);           // http://www.PHPCursWeb.net

echo $website(‘CursPHP’);               // http://www.CursPHP.net

?>


3. Closures pot fi create si in interiorul altor functii. In urmatorul exemplu se foloseste closures pt creare liste HTML, <li>.

<?php

// primeste un array cu elementele ce vor forma liste <li>

function ulList($ar_items) {

  $li = function($item) {

    return ‘<li>’. $item. ‘</li>’;

  };

  // parcurge array-ul din parametru, apeleaza $li() ca sa creeze <ul><li>

  $ul = ‘<ul>’;

  foreach($ar_items as $item) {

    $ul .= $li($item);

  }

  $ul .= ‘<ul>’;

  return $ul;

}

$ar_items = array(‘li 1’, ‘li 2’, ‘li 3’);

echo ulList($ar_items);         // <ul><li>li 1</li><li>li 2</li><li>li 3</li><ul>

?>


– Un alt exemplu cu functie anonima in interiorul altei functii. Observati utilizarea lui use() , pentru a putea folosi variabile din afara functiei anonime in interiorul ei.

<?php

function test($a) {

  $b = $a / 2;

  $c = function($a) use($b) {

    return $a + $b;

  };

  return $c($a);

}

echo test(10);         // 15

?>


4. Closures pot fi un instrument util si in programarea orientata pe obiecte. Incepand cu PHP 5.4 , expresia $this poate fi utilizata in functii anonime.

<?php

class A {

  private $value = 1;

  public function getVal() {

    return function() { return $this->value * 2; };

  }

}

$a = new A;

echo $a->getVal();        // 2

?>

Trimitere date la o adresa de e-mail

  • Invatati sa trimiteti mesaje si date dintr-un formular la o casuta de e-mail.

Este util sa avem pe o pagina din site un formular prin care vizitatorii sa poata trimite mesaje la o adresa de e-mail.
Am putea lasa pe pagina doar adresa de e-mail la care vizitatorii sa ne poata contacta, dar aceasta metoda (comoda pt. webmaster) nu este indicata. In primul rand din cauza programelor bot care circula pe net si colecteaza adresele de e-mail de pe site-uri pentru ca mai tarziu sa transmita mail-uri spam. In al doilea rand este mai simplu si mai rapid pentru vizitator sa trimita mesajul direct de pe site.

In cadrul acestei lectii este explicat un mod simplu de utilizare a limbajului PHP pentru a expedia la o adresa de e-mail date sub forma de text, preluate de la un formular HTML.
Pentru a putea expedia datele la adresa de mail, scripturile PHP trebuie sa fie capabile de a obtine accesul la serviciile SMTP (Simple Mail Transfer Protocol).
Daca folositi serviciile oferite de un „web hosting”, majoritatea au implementate aceste functii.
Daca folositi propriul sistem pentru gazduirea site-ului, sau pentru teste, este nevoie sa aveti instalat si un server SMTP, acesta preia datele prelucrate de modulul PHP si le trimite la adresa de e-mail.

Expedierea mesajelor de e-mail

Configuratia PHP standard accepta expedierea mesajelor de e-mail prin intermediul SMTP (abreviere de la Simple Mail Transfer Protocol). Acesta este protocolul standard folosit pentru transferul mesajelor de e-mail, prin intermediul Internetului.
Mesajele de e-mail sunt alcatuite din doua parti: o serie de antete de mesaj si un corp.

  • – Antetele de mesaj indica adresa destinatarului si subiectul mail-ului, precum si alte informatii.
  • – Corpul contine mesajul in sine.

Pentru a trimite datele la o adresa de e-mail, se foloseste functia mail(), care preia 3 argumente principale, avand urmatoarea forma:

  • mail($to, $subject, $message)

Unde, in ordinea argumentelor:

  • – primul argument, aici variabila „$to„, va contine adresa de e-mail a destinatarului (unde va fi trimis mesajul)
  • – al doilea argument, aici variabila „$subject„, va contine subiect-ul mail-ului
  • – al treilea argument, aici variabila „$message” va contine mesajul

Functia „mail()” poate contine si alte adrese de e-mail optionale, astfel un al patrulea argument poate fi „From„, care indica adresa de e-mail a expeditorului (cel care trimite mesajul).
Functia ar avea astfel urmatoarea forma:

  • mail($to, $subject, $message, $from )

– Variabila „$from” trebuie sa contina in sir cuvantul „From: ” inaintea adresei de e-mail, adica asa:
            $from=”From: adresa@de.mail”;
– Daca argumentul „$from” nu este specificat, serverul va transmite automat aceasta adresa (in functie de cum este configurat). Astfel, cand primim mail-ul, pe langa subiect vom avea adresa expeditorului, si daca nu este specificata, putem vedea ceva de genul „nobody@localhost.ro”

Datele pentru aceste argumente, in special al treilea (aici „$message”), pot fi preluate dintr-un formular HTML, folosind functia „$_POST„.
Functia „mail()” returneaza TRUE daca mail-ul a fost acceptat pentru expediere, in caz contrar returneaza FALSE.

Iata un script PHP simplu care va trimite mesaje la o adresa de e-mail:

<?php
// Verifica daca au fost trimise datele de la formular
if (isset($_POST[‘email’]) && isset($_POST[‘mesaj’])) {
    $to = ‘adresa_ta@de.mail’;                 // Adresa unde va fi trimis mesajul
    $subiect = ‘Mesaj de pe site’;
    $mesaj = $_POST[‘mesaj’];
    $from = ‘From: ‘. $_POST[‘email’];

    // PHP trimite datele la serverul de e-mail
    if (mail($to, $subiect, $mesaj, $from)) {
              echo ‘Mesajul a fost trimis cu succes.’;
    }
    else {
              echo ‘Eroare, mesajul nu a putut fi expediat.’;
    }
}
?>

– Intai se verifica (cu isset()) daca au fost trimise date de la formularul HTML. Fara aceasta verificare, s-ar expedia mesaje de e-mail ori de cate ori cineva (intentionat) acceseaza direct fisierul php cu scriptul.
– Variabilele „$mesaj” si „$from” preiau datele adaugate de vizitator in campurile unui formular HTML care au atributele ‘name=”mesaj”‘ si ‘name=”email”‘.
Daca functia „mail()” este executata cu succes, va apare mesajul „Mesajul a fost trimis cu succes.„, in caz contrar va afisa „Eroare, mesajul nu a putut fi expediat.„.
Un model de cod HTML pentru crearea formularului care trimite datele la scriptul php de mai sus este urmatoru:

<h3>Trimiteti mesaj</h3>
<form name=”form” method=”post” action=”nume_script.php”>
<label>E-mail : </label>
<input type=”text” name=”email” size=”20″ /> <br />
<label>Scrie mesajul : </label> <br />
<textarea name=”mesaj” cols=”35″ rows=”6″></textarea> <br />
<input type=”submit” value=”Trimite” />
</form>

– „nume_script.php” este calea si numele fisierului in care se afla scriptul php de mai sus.
In browser va apare:

Trimiteti mesaj

E-mail :
Scrie mesajul :

Trimitere e-mail cu tag-uri si atasament

Pentru a expedia mesaje la o adresa de e-mail cu PHP, trebuie in primul rand ca serverul folosit sa ruleze PHP si, pentru a aplica exemplele de aici, sa aibe activata functia mail().

1. Expedierea mesajelor de e-mail ce contin tag-uri HTML

Procedeul este simplu, se aplica functia „mail()”, dupa cum e explicat in prima parte (Lectia 31), folosind sintaxa:
                mail($to, $subiect, $mesaj, $from)
Pentru ca tag-urile HTML sa fie recunoscute si afisate corespunsator, trebuie adaugate header-ele specifice in corpul datelor ce contin adresa „From:” (din variabila $from). Aceste headere trebuie sa spuna receptorului sa recunoasca datele trimise ca fiind de tip text/html, si in general puteti folosi pe urmatoarele doua, impreuna:
                „MIME-Version: 1.0”
                „Content-type: text/html; charset=iso-8859-1”

Ca sa intelegeti mai bine, iata un exemplu simplu, cu o functie pe care o puteti folosi in script-urile dv. Explicatiile necesare sunt in cod.

<?php
// De la www.CursPHP.net
/*** Functia de trimitre mail-uri ***/
function send_mail($to, $from, $from_name, $sub, $msg){
  $eol = "\r\n";             // Pt. adaugare linie noua
  // Adauga corect adresa $from si headers
  $headers = "From: " . $from_name . "<" . $from . ">".$eol;
  $headers .= "MIME-Version: 1.0" . $eol;
  $headers .= "Content-type: text/html; charset=iso-8859-1" . $eol;
  // Executa expedierea datelor la serverul de mail
  // Daca au fost trimise cu succes returneaza mesaj de confirmare, in caz contrar, de eroare
  if (mail($to, stripslashes($sub), stripslashes($msg), $headers))
    return 'Mesajul a fost trimis cu succes';
  else return 'Eroare: mesajul nu a putut fi expediat';
}
// Cand vreti sa trimiteti un e-mail, apelati functia, cu cei cinci parametri
// Dupa cum e in continuare
$to = 'destinatar@mail.com';            // Adresa de mail a destinatarului
$from = 'expeditor@adresa.mail';        // Adresa de e-mail a expeditorului
$nume = 'Numele_Expeditorului';
$subiect = 'Un subiect pt. e-mail';
$mesaj = '<h3>Mesajul transmis</h3><div style="color:blue;">Poate contine <b>tags HTML</b>,<br />
    Si stiluri CSS adaugate in interiorul acestora, cu style="..."</div>.';
// Acum se apeleaza functia, cu aceste date pe care le va trimite la serverul de mail
$go_mail = send_mail($to, $from, $nume, $subiect, $mesaj);
echo $go_mail;               // Afiseaza rezultatul
?>


– Daca doriti sa formatati textul folosind cod CSS, acesta trebuie adaugat prin atributul style=””. Nu functioneaza cu tag <style>.
– Pentru aranjamente speciale este indicat sa utilizati tabele si coloane HTML

2. Trimitere e-mail-uri ce contin si atasamente

Pentru a include unul sau mai multe atasamente (fisiere, arhive) intr-un e-mail trimis cu PHP, procedeul e ceva mai complicat. Pe scurt, trebuie ca datele din acel fisier sa fie preluate (citite) de PHP, codate cu MIME base64 si impartite cu functia „chunk_split()”. Apoi aceste date, impreuna cu tipul fisierului atasat, se adauga in corpul mesajului, alaturi de celelalte headere.
Puteti intelege cum se face daca studiati script-ul de mai jos, de asemenea, il puteti folosi in aplicatiile dv.. Este facut ca model pentru a trimite doua atasamente, poate fi modificat usor daca doriti sa trimiteti doar unul sau mai multe, gasiti explicatii in documentatia din script.
Important este sa specificati calea corecta catre fisierul atasat, astfel incat acesta sa poata fi deschis cu functia „fopen()”, in cazul acestui model, cele doua fisiere se afla in acelasi director cu scriptul. Pentru fisiere de tip arhiva .rar si .zip nu e nevoie sa modificati tipul.
Vedeti detaliile din cod despre cum se adauga fisierele pt. atasament.

<?php
// Script PHP - Trimitere e-mail cu attasamente si tag-uri HTML
// De la www.CursPHP.net ( adaptat de la: http://www.codewalkers.com/c/b/Email-Code/ )
$attach = array();              // Defineste variabila ce va contine datele pt. atasamente
// Functia care trebuie apelata pt. a include mesajul si atasamentele in e-mail
function mail_att($to, $from, $sub, $msg, $attach) {
  // In continuare se definesc header-ele pt. e-mail
  $headers = "From: ".$from;
  $rand_hash = md5(time());
  $mime_boundary = "==Multipart_Boundary_x".$rand_hash."x";
  $headers .= "\nMIME-Version: 1.0\n".
    "Content-Type: multipart/mixed;\n".
    ' boundary="'.$mime_boundary.'"';
  $msg .= "Un multi-part mesaj in MIME format.\n\n".
    '--'.$mime_boundary."\n".
    "Content-Type:text/html; charset=\"iso-8859-1\"\n".
    "Content-Transfer-Encoding: 7bit\n\n".$msg."\n\n";
  // Aici se seteaza includerea atasamentelor (daca exista fisiere adaugate)
  if (count($attach)>=1) {
        // Parcurge matricea cu datele fisierelor
        for($i=0; $i<count($attach); $i++) {
    // Deschide fisierul si preia datele din el
          if ($file = fopen($attach[$i][0],'rb')) {
               $data = fread($file, filesize($attach[$i][0]));
               fclose($file);
          }
          // Codeaza date preluate cu MIME base64 si le separa in parti mai mici
          $data = chunk_split(base64_encode($data));
          // Adauga datele fisierului in mesajul mail-ului
          $msg .= '--'.$mime_boundary."\n".
               'Content-Type: '.$attach[$i][2].";\n".
               ' name="'.$attach[$i][1]."\"\n".
               "Content-Transfer-Encoding: base64\n\n".$data ."\n\n".
               '--'.$mime_boundary."\n";
        }
  }
  // Se apeleaza functia pt. trimiterea datelor la serverul de mail
  if (mail($to, $sub, $msg, $headers)) return "E-mail-ul a fost trimis";
  else return 'Eroare: mesajul nu a putut fi expediat';
}
// Aici se seteaza datele principale (sau pot fi preluate din formulare)
$to = 'destinatar@mail.com';            // Adresa de mail a destinatarului
$from = 'expeditor@adresa.mail';        // Adresa de e-mail a expeditorului
$subiect = 'Un subiect pt. e-mail';
$mesaj = '<h3>Mesajul transmis</h3><div style="color:blue;">Poate contine <b>tags HTML</b>,<br />
  Si stiluri CSS adaugate in interiorul acestora, cu style="..."</div> Precum si atasamente.';
// Se adauga datele pt. fisierele ce vor fi atasate
$attach[] = array('fisier.rar', 'Fisier1', 'application/octet-stream');
$attach[] = array('arhiva2.zip', 'Arhiva2', 'application/octet-stream');
// Daca doriti sa trimiteti doar un atasament, stergeti codul ce adauga pe al doilea
/* Daca doriti sa adaugati mai multe atasamente, repetati formula, sub celelalte: 
    $attach[] = array('cale/fisier', 'Nume_fisier', 'tip_fisier');
 - 'cale/fisier' e calea si numele fisierului pe server, ce trebuie atasat
 - 'Nume_fisier' e numele cu care va apare atassamentul in mail
 - 'tip_fisier' e tipul fisierului atasat, pt. arhive RAR, ZIP lasati 'application/octet-stream'  */
// Acum e apelata functia ce prelucreaza datele si le trimite la serverul de mail
$go_mail = mail_att($to, $from, $subiect, $mesaj, $attach);
echo $go_mail;
?>


– Cu functia din acest script pot fi trimise si e-mail-uri fara atasament, doar cu continut text si cod HTML in mesaj, pt. asta trebuie sterse variabilele de tip „$attach[]„.
Scriptul a fost testat cu succes pe serverul acestui site. Pt. a functiona corect depinde si de setarile, permisiunile serverului, in principal sa aibe functia mail() activa.

Creare imagini cu PHP

  • Invatati sa creati si sa afisati imagini cu PHP
  • Invatati sa afisati mai multe imagini generate de PHP in aceeasi pagina

Pe langa crearea de cod de tip text (HTML, XML, …), PHP poate fi folosit si pentru crearea si manipularea de imagini cu diferite formate (GIF, PNG, JPEG, WBMP si XPM).
PHP are implemetat cateva functii pentru lucru cu informatii legate de imagini, cum ar fi lungimea, latimea sau extensia imaginii. Pentru crearea de noi imagini sau manipularea celor existente este necesar sa aveti instalat in PHP o librarii GD cu functii pentru imagini. Pentru mai multe informatii despre cerinte si instalare librarie GD, vizitati GD library.
– Daca folositi WampServer sau Xampp, acestea au deja incluse librarii GD.
Puteti afla informatii despre libraria GD instalata folosind functia gd_info(), aceasta returneaza o matrice cu informatii despre libraria GD inclusa.

Exemplu:

<?php
var_dump(gd_info());
?>

1. Crearea imaginilor

Pentru crearea unei imagini cu PHP sunt esentiali urmatorii pasi:

  • – Definirea identificatorului de imagine si suprafata de baza a imaginii.
  • – Stabilirea culorilor fundalului, formei sau a textului din imagine.
  • – Trimiterea datelor de iesire cu imaginea creata.
  • – Eliberarea memoriei asociata creeri imaginii.

Cam asta e, pe scurt, partea teoretica, acum sa trecem la practica, voi prezenta pas cu pas un script PHP simplu care va afisa in browser o imagine PNG formata dintr-un dreptunghi cu fundal albastru si in interior un text.
Scriptul este urmatorul:

<?php
$text = ‘Textul din imagine’;

// setare dimensiuni suprafetei de baza
$height = 40;
$width = 170;
// definirea imaginii
$im = imagecreate($width, $height);

// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$text_color = imagecolorallocate($im, 255, 255, 255);

// finalizarea imaginii
imagefill($im, 0, 0, $fundal);
imagestring($im, 4, 10, 15, $text, $text_color);

// trimiterea datelor de iesire
header(‘Content-type: image/png’);
imagepng($im);

// curatarea memoriei
imagedestroy($im);
?>

– Acest script va afisa urmatorul rezultat

Sa studiem acest script
        – Pentru inceput am setat variabila „$text” ce contine textul care va fi adaugat in imagine, si variabilele „$height” si „$width” care reprezinta dimensiunile imaginii.
        – In continuare avem „$im = imagecreate($width, $height)„, functia imagecreate() returneaza un identificator de imagine ce creaza suprafata de baza a imaginii, prelund ca argumente dimensiunile acesteia (in pixeli).

  • – Ca alternativa se poate folosi o imagine deja existenta, peste care sa adaugati testul, pentru aceasta se foloseste functia imagecreatefrompng(„nume.png”) (sau „imagecreatefromjpeg()”, „imagecreatefromgif()”; in functie de tipul imaginii), exemplu: $im = imagecreatefrompng(„img.png”)

        – Urmatorul pas este definirea culorii pentru fundal si pentru text, pentru aceasta se foloseste functia imagecolorallocate(), aceasta returneaza un identificator de culoare care va fi folosit pentru accesarea culorii si preia 4 argumente: primul argument este identificatorul de imagine creat cu „imagecreate()” (in script este in variabila „$im”), urmatoarele trei argumente reprezinta valorile RGB (Red, Green, Blue) pentru stabilirea culorii.
        – Pentru adaugarea culorii de fundal se foloseste functia imagefill(), care preia 4 argumente (in script avem „imagefill($im, 0, 0, $fundal);”), argumentele sunt:

  • – identificatorul de imagine
  • – urmatoarele doua argumente definesc coordonatele X si Y de start pentru umplerea culorii (0, 0)
  • – ultimul argument reprezinta identificatorul de culoare folosit (aici cel din variabila $fundal)

        – Pentru adaugarea textului in cadrul imaginii se foloseste functia imagestring(), aceasta preia 6 argumente:

  • 1. – identificatorul de imagine
  • 2. – tipul fondului folosit, care poate fi un numar intre 1 si 5, reprezentand fonturi prestabilite
    • – ca alternativa se poate folosi functia imageloadfont(), pentru includerea de alte fonturi
  • 3. – al treilea argument reprezinta distanta, in pixeli, fata de marginea din stanga a imaginii
  • 4. – al patrulea argument reprezinta distanta, in pixeli, fata de marginea de sus a imaginii
  • 5. – al cincilea argument reprezinta sirul introdus
  • 6. – ultimul argument este culoarea textului

        – Urmatotul pas este trimiterea datelor de iesire pentru afisarea in browser.

  • – Pentru aceasta intai scriptul spune browser-ului ca trimite o imagine si nu test sau HTML, se face acest lucru folosind functia header() cu tipul MIME al imaginii „header(‘Content-type: image/png’)„. Daca doriti ca imaginea sa fie de tip JPEG (sau GIF) inlocuiti „png” cu „jpeg” (sau „gif”), astfel ‘Content-type: image/jpeg‘.
  • – dupa ce s-au trimis datele pentru „header”, se trimit datele imaginii utilizand functia imagepng() (sau „imagejpeg()”, „imagegif(); in functie de tipul imaginii”) care preia ca argument identificatorul de imagine (in script avem „imagepng($im)„)
    • Ca alternativa, imaginea poate fi scrisa intr-un fisier, in loc sa fie afisata in browser o salvati pe server, pentru aceasta se adauga un al doilea parametru la „imagepng()” reprezentand numele fisierului, exemplu „imagepng($im, „img.png”)” si nu se mai scrie functia „header()”. (trebuie sa aveti permisiuni de scriere pe server)

        – In final s-a folosit functia imagedestroy() (care foloseste ca argument identificatorul de imagine) pentru eliberarea resurselor de memorie folosite la crearea imaginii.

2. Utilizarea imaginilor create cu PHP

Deoarece un header poate fi trimis numai o data pentru o pagina, si asta este singura cale de a spune browser-ului ca sunt trimise date de imagine, poate deveni mai dificil cand se doreste crearea si afisarea mai multor imagini cu PHP.
In acest caz:

a) Puteti folosi scriptul pentru a salva imaginea pe server (dupa cum a fost explicat mai sus) si apoi folositi etichete <img> pentru afisarea imaginii
– Exemplu:

<?php
$text = ‘Textul din imagine’;

// setare dimensiuni
$height = 50;
$width = 170;
$im = imagecreate($width, $height);

// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$text_color = imagecolorallocate($im, 255, 255, 255);

// finalizarea imaginii
imagestring($im, 4, 10, 15, $text, $text_color);

// salvarea imaginii pe server
imagepng($im, „img.png”);

// curatarea memoriei
imagedestroy($im);
?>

<img src=”img.png” alt=”Afisare 1″ />
– <img src=”img.png” alt=”Afisare 2″ />

– Acest script va afisa urmatorul rezultat

Afisare 1Afisare 2


b) O alta metoda este scrierea intr-un fisier php extern a scriptului care genereaza si afiseaza imaginea, apoi apelati scriptul PHP in atributul src, ca in exemplul urmator:

<img src=”script_img.php” alt=”Afisare 1″ />
– <img src=”script_img.php” alt=”Afisare 2″ />

– Unde „script_img.php” este fisierul PHP care genereaza si afiseaza imaginea

In urmatoarea lectie, sunt prezentate mai multe functii utile in lucrul cu imagini generate de PHP.

Functii utile pentru lucrul cu imagini

  • Invatati si exersati diferite functii pentru crearea si manipularea imaginilor
  • Invatati sa copiati si sa redimensionati suprafete din imagini

In aceasta lectie sunt prezentate, cu exemple, cateva functii utile pentru lucrul cu imagini generate de PHP.

1. Functia imageline()

– Aceasta functie deseneaza o linie in cadrul imaginii, sintaxa generala este urmatoarea:

  • imageline(„identificator_im”, „x1”, „y1”, „x2”, „y2”, „id_culoare”)

Unde

  • – „identificator_im” reprezinta identificatorul de imagine returnat de o functie pentru crearea imaginii, cum e „imagecreate„, „imagecreatetruecolor” sau „imagecreatefrompng” (pt. imagine PNG)
  • – „x1” si „y1” reprezinta coordonatele de start (x, y) pentru punctul de incepere a liniei (in pixeli, in raport cu marginea din stanga si de sus)
  • – „x2” si „y2” reprezinta coordonatele de final (x, y) pentru punctul de terminare a liniei (in pixeli, in raport cu marginea din stanga si de sus)
  • – „id_culoare” reprezinta identificatorul de culoare folosit pentru culoarea liniei (returnat de functia „imagecolorallocate„)

Iata un exemplu:

<?php
// setare dimensiuni
$height = 40;
$width = 170;
// definirea cadrului de baza a imaginii
$im = imagecreate($width, $height);

// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$line_color = imagecolorallocate($im, 200, 220, 8);

// crearea imaginii
imagefill($im, 0, 0, $fundal);
imageline($im, 50, 10, 120, 10, $line_color);     // prima linie
imageline($im, 40, 20, 130, 20, $line_color);     // a doua linie

// trimiterea datelor de iesire
header(‘Content-type: image/jpeg’);
imagejpeg($im);

// curatarea memoriei
imagedestroy($im);
?>

– Comentariile necesare sunt deja in codul scriptului.
– Functia „imageline()”, folosita de 2 ori, va crea doua linii dupa coordonatele dintre paranteze.
– Rezultatul accestui script este imaginea de mai jos

2. Functia imagearc()

– Aceasta functie deseneaza un arc de cerc centrat pe anumite coordonate date. Sintaxa generala este urmatoarea:

  • imagearc(„identificator_im”, „x1”, „y1”, „width”, „height”, „start”, „end”, „id_culoare”)

Unde

  • – „identificator_im” reprezinta identificatorul de imagine returnat de o functie pentru crearea imaginii, cum e „imagecreate„, „imagecreatetruecolor” sau „imagecreatefrompng” (pt. imagine PNG)
  • – „x1” si „y1” reprezinta coordonatele de start (x, y) pentru centrul arcului de cerc (in pixeli, in raport cu marginea din stanga si de sus)
  • – „width” si „height” reprezinta lungimea, respectiv inaltimea, arcului de cerc.
  • – „start” reprezinta unghiul de inceput al arcului de cerc, in grade
  • – „end” reprezinta unghiul de sfarsit al arcului de cerc, in grade. 0o este localizat la pozitia orei 3, arcul de cerc fiind desenat in sensul acelor ceasornicului.
  • – „id_culoare” reprezinta identificatorul de culoare folosit pentru culoarea liniei arcului de cerc (returnat de functia „imagecolorallocate„)

Iata un exemplu:

<?php
// setare dimensiuni
$height = 100;
$width = 100;
// definirea imaginii
$im = imagecreate($width, $height);

// setare culori
$fundal = imagecolorallocate($im, 10, 10, 250);
$cerc_color = imagecolorallocate($im, 220, 220, 8);
$arc_color = imagecolorallocate($im, 250, 2, 2);


// crearea imaginii
imagefill($im, 0, 0, $fundal);
imagearc($im, 30, 25, 20, 20, 0, 360, $cerc_color);     // primul cerc
imagearc($im, 70, 25, 20, 20, 0, 360, $cerc_color);     // al doilea cerc
imagearc($im, 50, 44, 70, 70, 25, 150, $arc_color);     // ultimul arc de cerc

// trimiterea datelor de iesire
header(‘Content-type: image/jpeg’);
imagejpeg($im);

// curatarea memoriei
imagedestroy($im);
?>

– Comentariile necesare sunt deja in codul scriptului.
– Functia „imagearc()”, folosita de 3 ori, va crea arce de cerc dupa coordonatele dintre paranteze. (Testati singuri scriptul, modificand valorile argumentelor)
– Rezultatul accestui script este imaginea de mai jos

Observati ca pot fi create cercuri complete sau arce de cerc, in functie de valoarea in grade a argumentului sapte („end”).
Pentru a desena un arc de cerc (sau cerc) cu suprafata colorata, nu doar linia de margine, folositi functia „imagefilledarc()”.

3. Functia getimagesize()

– Aceasta functie returneaza o matrice cu mai multe elemente ce contin date despre tipul si dimensiunile imagini.
Mai importante sunt primele 2 elemente din matrice (index 0 si 1) care reprezinta lungimea, respectiv inaltimea imaginii; si al patrulea element (index 3) care este un sir cu dimensiunile imaginii.

Iata un exemplu:

<?php
$img = ‘imagini/image.png’;     // calea catre fisierul cu imaginea
$size = getimagesize($img);
echo „$size[0] – $size[1] <br /> $size[3]”;
?>

– „getimagesize()” preia ca argument imaginea si stocheaza datele (matricea) in variabila „$size”.
– acest script va afisa un rezultat similar cu cel de mai jos (depinde de imaginea folosita)

270 – 100
width=”270″ height=”100″

4. Functia imagecopy()

– Aceasta functie copie o portiune dintr-o imagine data. Sintaxa generala este urmatoarea:

  • imagecopy(„identificator_im2”, „identificator_im1”, „x2”, „y2”, „x1”, „y1”, „width”, „height”)

Unde

  • – „identificator_im2” reprezinta identificatorul celei dea doua imagini, rezultata prin suprafata copiata
  • – „identificator_im1” reprezinta identificatorul primei imagini (sursa), din care va fi copiata portiunea
  • – „x2” si „y2” reprezinta coordonatele de start (x, y) din cadrul celei dea doua imagini, punctul de unde va incepe adaugarea imaginii rezultata prin suprafata copiata
  • – „x1” si „y1” reprezinta coordonatele de start (x, y) din prima imagine, de unde va incepe copierea (in pixeli, in raport cu marginea din stanga si de sus)
  • – „width” si „height” reprezinta lungimea, respectiv inaltimea, suprafetei copiate.

Iata un exemplu:

  • – Avem initial aceasta imagine
  • – In continuare urmatorul script va copia si afisa o portiune din imagine

<?php
// preluarea imaginii sursa
$im1 = imagecreatefrompng(‘imgs/CursPHP.png’);

// definirea identificatorului si a cadrului pt. imaginea 2
// care va rezulta cu suprafata copiata
$im2 = imagecreatetruecolor(170, 50);

// Copierea suprafetei
imagecopy($im2, $im1, 10, 0, 30, 10, 170, 50);

// datele de iesire
header(‘Content-Type: image/png’);
imagepng($im2);

// eliberarea memoriei
imagedestroy($im2);
imagedestroy($im1);
?>

– „imagecopy()” va copia o suprafata din prima imagine, reprezentata prin „$im1” si o va incadra in cea dea doua imagine, reprezentata prin „$im2” (conform coordonatelor date).
– Acest script va returna urmatorul rezultat:

5. Functia imagecopyresized()

– Aceasta functie copie si redimensioneaza o portiune dintr-o imagine data. Sintaxa generala este urmatoarea:

  • imagecopyresized(„identificator_im2”, „identificator_im1”, „x2”, „y2”, „x1”, „y1”, „width2”, „height2”, „width1”, „height1”)

Unde

  • – „identificator_im2” reprezinta identificatorul celei dea doua imagini, rezultata cu suprafata copiata si redimensionata
  • – „identificator_im1” reprezinta identificatorul primei imagini (sursa), din care va fi copiata portiunea
  • – „x2” si „y2” reprezinta coordonatele de start (x, y) din cadrul celei dea doua imagini, punctul de unde va incepe adaugarea imaginii rezultata prin suprafata copiata si redimensionata
  • – „x1” si „y1” reprezinta coordonatele de start (x, y) din prima imagine, de unde va incepe copierea suprafetei (in pixeli, in raport cu marginea din stanga si de sus)
  • – „width2” si „height2” reprezinta lungimea, respectiv inaltimea, suprafetei rezultata dupa redimensionare.
  • – „width1” si „height1” reprezinta lungimea, respectiv inaltimea, suprafetei copiate.

Iata un exemplu:

  • – Avem initial aceasta imagine
  • – In continuare urmatorul script va copia, redimensiona si afisa o portiune din imagine

<?php
// preluarea imaginii sursa
$im1 = imagecreatefrompng(‘imgs/CursPHP.png’);

// definirea identificatorului si a cadrului pt. imaginea 2
// care va rezulta cu suprafata copiata si redimensionata
$im2 = imagecreatetruecolor(80, 20);

// Copierea si redimensionarea suprafetei
imagecopyresized($im2, $im1, 0, 0, 10, 10, 80, 20, 170, 50);

// datele de iesire
header(‘Content-Type: image/png’);
imagepng($im2);

// eliberarea memoriei
imagedestroy($im2);
imagedestroy($im1);
?>

– „imagecopyresized()” va copia o suprafata din prima imagine =, reprezentata prin „$im1” si o va redimensiona si incadra in cea dea doua imagine, reprezentata prin „$im2” (conform coordonatelor date).
– Acest script va returna urmatorul rezultat:

Pentru copierea si redimensionarea imaginii cu „resambling”, puteti folosi functia imagecopyresampled().

O lista completa cu functiile care pot fi folosite pentru lucrul cu imagini in PHP gasiti aici Functii pentru imagini

Creare PDF cu PHP

  • In aceasta lectie veti invata cum sa creati documente PDF cu PHP

Pe langa date de tip text sau imagini, cu PHP puteti crea si documente in format PDF (care pot fi citite cu Adobe Acrobat Reader), utile in special cand se doreste scoaterea la imprimanta a paginilor.
Pentru crearea documentelor de tip PDF pot fi utilizate functii care folosesc libraria PDFlib. Pentru a folosi functiile specifice acestei librarii trebuie sa aveti PDFlib instalat si activat in modulul PHP. Incepand cu versiunea PHP 5 si PDFlib 6 functiile acesteia sunt apelate ca metodele unei clase. Pe langa faptul ca unele sisteme nu au instalata sau activata aceasta librarie de functii, trebuie sa tineti cont la scrierea programului si de versiunile PHP si PDFlib pe care le folositi, acest lucru poate fi mai dificil pentru incepatori. Totusi, daca sunteti interesati gasiti documentatia pentru crearea documentelor PDF cu PDFlib la pagina creare PDF cu PHP si PDFlib.

O alta modalitate mai simpla de a crea documente PDF cu PHP este folosirea unei clase numite FDPF. Avantajul este ca aceasta clasa nu necesita instalarea PDFlib si este gratuita. Aveti nevoie doar de fisierul PHP care contine clasa FPDF si un director cu fonturile pe care le puteti folosi in documentul PDF, acestea le puteti descarca de pe site-ul oficial www.fpdf.org.

Aceasta lectie are doua parti, in prima parte, aici, voi explica lucrile de baza (pentru incepatori) in crearea documente PDF folosind class FPDF, iar in partea a doua sunt prezentate cateva metode mai avansate.

1. Primul document PDF

Primul pas e sa copiati pe server fisierul PHP cu clasa FPDF si directorul cu fonturile, apoi in fisierul dv. php includeti aceasta clasa dupa care urmeaza datele necesare creari documentului PDF.
Aceste date trebuie sa fie in principal urmatoarele:

  • 1. Se creaza obiectul ce va reprezenta documentul PDF. Pentru aceasta se foloseste expresia new FPDF(), aceasta poate prelua 3 argumente, exemplu: new FPDF(‘P’,’mm’,’A4′); primul argument defineste orientarea paginii (P – Portrait sau L – Landscape), al doilea argument e pentru unitatea de masura (mm – milimetri, cm – centimetri, pt – point), iar ultimul argument este pt. formatul paginii (A3, A4, A5, Letter). Daca nu sunt specificate argumente, documentul va avea valorile implicite: Portrait, milimetri, A4.
  • 2. Se adauga elemente ce definesc fontul, grafica, textul, imagini si altele. Pentru aceasta se folosesc metodele (functiile) clasei FPDF.
                                    – Aici, inainte de a adauga text, apelati metoda pentru initializarea paginii, functia AddPage(), si metoda pentru definirea fontului SetFont().
  • 3. La urma se trimit datele de iesire cu metoda Output(), aceasta poate prelua 2 argumente, avand forma generala.
                                    Output(‘file’, ‘action’)
                      – unde ‘file’ este numele documentului PDF creat, exemplu ‘doc.pdf
                      – iar ‘action’ poate fi unul din literele: ‘I‘, ‘D‘, ‘F‘ sau ‘S‘ care reprezinta actiunea ce se va efectua
                                – I trimite fisierul pdf sa fie afisat in browser
                                – D deschide optiunea de download a documentului PDF
                                – F salveaza fisierul pdf pe server, cu numele (si calea) adaugat in primul atribut
                                – S returneaza documentul ca string (sir), numele este ignorat.
        Daca metoda Output() este apelata fara atribute, documentul PDF va fi afisat direct in browser.

Pentru ca documentul PDF creat sa poata fi vizualizat de browser sau descarcat, browser-ul clientului trebuie sa aibe instalat plug-in-ul pentru Adobe Reader.
Cand continutul pe care doriti sa-l afisati in pagina PDF depsaseste inaltimea acesteia, se va genera automat o pagina noua.
Iata un exemplu simplu in care este creata o pagina PDF si in ea un text.

<?php
include(‘fpdf.php’);
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont(‘Arial’,”,16);
$pdf->Text(25,40,’Prima pagina PDF.’);
$pdf->Output();
?>

– Dupa includerea fisierului cu clasa FPDF ‘fpdf.php’ am definit obiectul FPDF() stocat in variabila „$pdf”, cu aceasta se va apela metodele clasei.
– Odata obiectul creat, am initializat crearea paginii cu „$pdf->AddPage()„, apoi am setat fontul apeland metoda specifica „$pdf->SetFont(‘Arial’,’B’,16)” – primul argument este numele fontului, al doilea este pentru stil (B-bold, I-italic, U-underline, null-normal).
– In continuare am apelat metoda Text() pentru crearea textului, aceasta preia 3 argumente: primul argument reprezinta distanta X fata de marginea din stanga (aici 25), al doilea argument reprezinta distanta Y fata de marginea de sus (aici 40) si ultimul este textul care va apare in pagina PDF.
– Dupa ce am definit toate aceste elemente, apelam metoda Output(), fara atribute, care trimite datele de iesire pentru afisarea documentului PDF.
– Daca doriti salvarea acestuia pe server, apelati aceasta metoda astfel   $pdf->Output(‘fisier.pdf’, ‘F’);   (in acest caz, PHP trebuie sa aibe permisiuni de creare fisiere pe server). Daca doriti ca utilizatorului sa-i apara optiunea de download, apelati aceasta metoda asa:   $pdf->Output(‘fisier.pdf’, ‘D’);   (fisierul nu va fi salvat si pe server).
– Puteti vedea rezultatele acestui exemplu aici -> Demo 1.

In documentatia FPDF gasiti metodele pe care aceasta clasa le poate folosi, rolul lor si argumentele pe care le preia fiecare.

2. Adaugarea unei celule cu text

Pe langa text simplu, puteti adauga si celule (cadre) in care sa fie adaugat textul. Aceste celule le puteti crea cu metoda Cell(); sunt similare cu DIV-ul din HTML, le putem defini suprafata, fondul, bordura sau alinierea datelor.
Iata un exemplu care va crea o pagina PDF in care avem o celula cu un text centrat in ea.

<?php
include(‘fpdf.php’);
$pdf=new FPDF();
$pdf->AddPage();
$pdf->SetFont(‘Arial’,”,16);
$pdf->Cell(36,10,’Text in celula.’,1,1,’C’);
$pdf->Output();
?>

– Ca si in primul exemplu, dupa ce am inclus fisierul cu clasa FPDF am definit obiectul de lucru si am setat initializarea paginii si fontul.
– Functia cell() defineste cadrul celulei si textul din ea, aceasta preia mai multe argumente:

  • – primele doua reprezinta lungimea si inaltimea celulei
  • – urmatorul argument este textul afisat in celula
  • – celelalte argumente sunt pentru bordura, pozitia pointer-ului in pagina in raport cu celula si alinierea textului din ea
  • – in afara de acestea, functia cell() mai poate prelua 2 argumente: pentru fundal (true) si pentru link.

– La urma am apelat metoda Output() care trimite datele de iesire pentru afisare.
Rezultatul acestui exemplu il puteti vedea aici -> Demo 2.

3. Linie noua, culori si fond

In urmatorul exemplu puteti vedea cum sa adaugati o linie noua in pagina, sa setati o culoare pentru text si pt. fondul unei celule si sa definiti culoarea si grosimea bordurii celulei.
Pentru a adauga o linie noua intr-o pagina PDF construita cu clasa FPDF se apeleaza metoda Ln(), aceasta poate prelua un argument numeric ce reprezinta inaltimea noii linii.
Pentru definirea unei culori pentru text se foloseste metoda SetTextColor(), aceasta preia 3 argumente numerice cu valoarea intre 0 si 255 reprezentand culorile RGB (Red, Green, Blue). Similar, pentru culoarea de fundal (background) se foloseste metoda SetFillColor() cu cele 3 argumente reprezentand culorile RGB, iar pentru culoarea bordurii se foloseste metoda SetDrawColor().
Grosimea liniei se poate defini cu metoda SetLineWidth(nr), unde „nr” e un numar ce reprezinta grosimea in unitatea de masura data, de obicei milimetri. Daca aceasta metoda nu e specificata, grosimea liniei este 0.2 mm.
Iata un exemplu care va crea o pagina PDF cu 2 linii de text (a doua cu text albastru) si o alta linie in care avem o celula cu fond galben, bordura definita si text verde.

<?php
include(‘fpdf.php’);             // Include clasa FPDF

// Creaza documentul de lucru
$pdf=new FPDF();

$pdf->AddPage();                                 // Initializeaza pagina
$pdf->SetFont(‘Arial’,”,16);
$pdf->Text(20,10,”Prima linie”);             // Adauga prima linie de text
$pdf->SetTextColor(1,1,250);               // Seteaza culoarea pentru textul care va apare in continuare
$pdf->Text(20,16,”Alta linie de text”);         // Adauga o alta linie cu text albastru
$pdf->ln(10);                                     // Adauga rand nou cu inaltimea 10 mm
$pdf->SetDrawColor(0,10,220);                 // Seteaza o culoare pt. bordura celulei
$pdf->SetLineWidth(0.5);                     // Defineste grosimea bordurii la jumatate de milimetru
$pdf->SetFillColor(255,255,10);                     //Seteaza culoarea pt. background din celula urmatoare
$pdf->SetTextColor(0,220,0);                     // Schimba culoarea pentru urmatorul text
$pdf->Cell(115,10,’A treia linie de text in celula, dupa linie noua’,1,1,’C’,true);         // Celula cu background

$pdf->Output();                       // Trimite datele de iesire la browser
?>

– Ca sa intelegeti rolul fiecarei linii de cod, cititi comentariile asociate.
Pentru a vedea rezultatul acestui script click aici -> Demo 3.
– Ca sa observati mai bine rolul liniei noi „Ln()”, cand testati scriptul, stergeti aceasta linie de cod.

4. Paragraf, Linie, Imagine si Link

• Paragraf
In exemplele de sus ati vazut cum puteti adauga text (pe o linie) folosind metoda „Text()”, totusi, aceasta metoda este utila in cazul sirurilor mai mici, pe o singura linie, dar sunt situatii cand trebuie sa adaugati in pagina PDF un continut de text mai mare si care are mai multe linii. In acest caz folositi metoda write(), aceasta permite adaugarea de continut text cu mai multe linii (formate cu „\n”) sau cand testul ajunge la marginea din dreapta trece automat pe o noua linie. Sintaxa generala a acestei metode este:
                Write(h, continut_text, url)
– unde „h” este inalimea fiecarei linii din paragraf, „continut_text” este textul adaugat, iar „url” (optional) este o adresa URL care poate fi deschisa cand se da click pe continut_text.

      • Linie
Clasa FPDF are si o metoda pe care o puteti folosi pentru trasarea de linii in pagina, aceasta este metoda line() si are urmatoarea sintaxa:
                    Line(x1, y1, x2, y2)
– unde „x1” si „y1” sunt coordonatele X si Y pentru punctul de inceput a liniei, iar „x2” si „y2” sunt coordonatele X si Y pentru punctul de sfarsit a liniei

      • Imagine
Pe langa date de tip text sau linii, in pagiina PDF puteti adauga cu FPDF si imagini JPEG, PNG sau GIF; pentru aceasta se foloseste metoda Image() care are urmatoarea sintaxa:
                Image(src, x, y, w, h, tip, url)
– unde „src” este adresa imaginii, aceasta este singura strict necesara, restul sunt optionale.
– „x” si „y” sunt coordonatele X si Y pentru coltul din stanga-sus de unde incepe afisarea imaginii, daca nu sunt specificate se folosesc coordonatele curente.
– „w” si „h” reprezinta dimensiunile (lungime, inaltime) in care va fi afisata imaginea in pagina, daca nu sunt specificate se folosesc dimensiunile imaginii.
– „tip” este tipul imaginii (JPG, JPEG, PNG sau GIF), daca nu e adaugat se preia din extensia acesteia, iar „url” este o adresa URL care poate fi deschisa la click pe imaginea respectiva.

      • Link
Sunt mai multe metode, simple sau mai complexe, de a adauga un link in pagina PDF. Aici veti vedea doua metode simple, pentru ceva mai complicat studiati tutorialul din documentatia FPDF.
Cea mai simpla metoda e sa scrieti direct adresa URL in continutul textului (vedeti in exemplul de jos), in pagina va apare adresa asa cum ati scris-o iar cand se da click pe ea deschide acea adresa.
O alta metoda pe care o puteti folosi e sa adaugati adresa in atributul URL a uneia din metodele: Cell(), Write() sau Image().

Codul din urmatorul exemplu va afisa o pagina PDF in care este un continut text pe mai multe linii care are si o adresa URL, urmat de un link intr-o celula, doua linii si o imagine.

<?php
include(‘fpdf.php’);                         // Include clasa FPDF

// Creaza documentul de lucru
$pdf=new FPDF();

// Initializeaza pagina si defineste fontul textului
$pdf->AddPage();
$pdf->SetFont(‘Arial’,”,15);

// Sirul ce contine textul cu mai multe linii, care va fi adaugat in metoda Write()
$sir =”Text adaugat cu metoda Write() \r\n Linie noua din cadrul aceluiasi sir, \r\n O alta linie care contine si un link www.CursPHP.net/php-mysql”;

$pdf->Write(5, $sir);                         // Paragraf cu inaltimea liniei de 5 mm
$pdf->SetTextColor(1,1,250);           // Seteaza culoarea pentru textul care va apare in continuare
$pdf->Ln(10);                                 // Linie noua cu inaltimea 20mm
$pdf->SetFont(‘Arial’,’I’,13);                   // Modifica stilul si dimensunea textului, pt. evidentiere link
$pdf->Cell(23,5,’Link Jocuri’,’B’,1,’C’,false,’http://www.CursPHP.net/jocuri’);         // Celula cu link si bordura jos pt. evidentierea acestuia

$pdf->Ln();                                   // Linie noua
$pdf->Image(‘CursPHP.jpg’);         // Adauga o imagine in pagina

// Adaugarea liniilor
$pdf->SetDrawColor(90,100,200);                 // Seteaza culoarea pt. linie
$pdf->SetLineWidth(1);                       // Defineste grosimea liniei
$pdf->line(80,70,100,45);                   // Deseneaza prima linie
$pdf->line(100,45,120,70);                 // Deseneaza a doua linie

$pdf->Output();                         // Trimite datele de iesire la browser
?>

– Studiati codul si comentariile din script ca sa intelegeti modul de lucru.

Atentie, cand doriti sa adaugati in metode atribute care, in ordine, sunt dupa altele optionale pe care nu doriti sa le folositi, trebuie totusi sa le adaugati si pe acestea (cu valoare nula „” sau false).
De exempu, in scriptul de mai sus am vrut sa adaug o adresa URL in metoda „Cell()”, care este ultimul atribut, inaintea acestuia fiind atributul pt. background. Desi nu am folosit o culoare pt. background, am adaugat acest atribut ca „false” ca sa fie respectata ordinea atributelor recunoscute de clasa.


In partea a doua a acestei lectii veti invata cum sa adaugati elemente mai avansate in documentul PDF, cum sunt: Header, nr. pagini, tabele sau contint realizat prin recunoasterea unor tag-uri HTML.

Creare PDF cu PHP (2)

  • Aceasta lectie prezinta cateva lucruri mai avansate din lucrul cu FPDF

In prima parte (lectia 34) au fost prezentate lucrurile de baza prin care puteti crea un document PDF cu un continut simplu, folosind clasa FPDF.
In aceasta lectie sunt prezentate aspecte mai avansate din crearea paginilor PDF cu FPDF. Acestea necesita cunostinte medii de lucru cu functii si clase in PHP.

1. Header, Footer si Nr. pagina

Cand aveti un document PDF cu mai multe pagini, puteti crea printr-o singura funtie un continut care sa fie afisat in partea de sus (Header) sau de jos (Footer) a fiecarei pagini. De asemenea este util sa afisati si numarul paginilor. Toate acestea le puteti crea relativ usor cu functiile clasei FPDF.
Pentru obtinerea numarului paginii curente se foloseste metoda PageNo(), iar ca sa obtineti numarul total de pagini se foloseste metoda AliasNbPages() care defineste un alias pt. numarul total de pagini, acest alias poate fi numele unui argument a functiei sau daca nu e precizat, default e {nb}, si va fi inlocuit la inchiderea crearii documentului PDF cu numarul total de pagini.

Pentru adaugarea unui Header sau Footer in fiecare pagina se foloseste metoda Header() respectiv Footer() definite intr-o clasa extinsa (copil) a clasei FPDF. Aceasta clasa copil trebuie creata de dv. inaintea definirii obiectului de lucru, iar acest obiect va fi creat folosind sintaxa new Clasa_copil() (in loc de „new FPDF()”), unde „Clasa_copil” e numele clasei extinse in care ati definit metodele Header() sau /si Footer(). Aceste metode nu mai trebuiesc apelate dupa crearea obiectului deoarece sunt apelate automat de „AddPage()”
Ca sa intelegeti mai bine, studiati exemplul urmator. Acesta va crea un document PDF cu 2 pagini, fiecare avand acelasi Header iar in Footer este afisat nr. pagina curenta si nr. total pagini.

<?php 
include('fpdf.php');  // Include clasa FPDF
// Creaza clasa copil a clasei de baza FPDF
class PDF extends FPDF {
  // Definirea Header-ului
  function Header() {
    $this->SetFont('Arial','B',15);   // Seteaza Fontul Bold 15
    $this->Cell(80);                  // Muta pozitia in dreapta, 80mm
    $this->Cell(40,10,'Titlu Header',1,0,'C');       // Adauga un text
    $this->Ln(20);                            // Adauga rand nou
  }
  // Definirea Footer-ului
  function Footer() {
    $this->SetY(-15);          // Seteaza pozitia la 15mm pe verticala fata de subsolul paginii
    $this->SetFont('Arial','I',8);    // Seteaza Fontul Italic 8
    //Adauga o celula cu text ce contine nr. paginii curente si nr. total de pagini definit prin 'alias' (care va fi atributul lui AliasNbPages())
    $this->Cell(0,10,'Page '.$this->PageNo().'/nr_pgs',0,0,'C');
  }
}
// Definirea obiectului prin apelarea clasei extinse create mai sus
$pdf=new PDF();
$pdf->AliasNbPages('nr_pgs');         // Seteaza un alias care va prelua nr. total de pagini
$pdf->AddPage();                              // Initializeaza adaugarea paginilor
// Seteaza un font si adauga mai multe linii de text pt. a depasi o pagina
$pdf->SetFont('Times','',12);
for($i=1; $i<=35; $i++) $pdf->Cell(0,10,'Linia de text numarul '.$i,0,1);
$pdf->Output();                // Trimite datele de iesire
?>
               

– Studiati cu atentie codul si comentariile din script. Puteti vedea rezultatul aici -> Demo 5.
– In functiile „Header()” si „Footer()” din clasa copil PDF puteti adauga si alte functii PHP sau sa apelati cu „$this->” si alte metode ale clasei FPDF (imagini, culori) pentru a crea continutul dorit. Observati ca metodele „Header()” si „Footer()” nu au fost apelate dupa obiectul creat.
– Pentru atributul metodei „AliasNbPages()” (aici ‘nr_pgs’) puteti folosi orice nume doriti, dar sa tineti cont ca acesta reprezinta numarul total de pagini.

2. Pagina noua si link-uri interne

Cand continutul pe care doriti sa-l adaugati in documentul PDF depaseste lungimea paginii, va fi creata automat o alta pagina, dar sunt cazuri cand doriti crearea intentionata a uneia sau mai multor pagini noi.
Pentru crearea unei pagini noi puteti folosi din nou metoda AddPage(), aceasta va forta adaugarea unei noi pagini.

Cand documentul PDF este mare, cu multe pagini, este util sa folositi link-uri interne care sa redirectioneze printr-un click catre oricare locatie definita de dv. in document. Acest lucru il puteti face folosind doua metode ale clasei FPDF: AddLink() si SetLink().
Prima data folositi AddLink() ca sa atribuiti unei variabile valoarea de link intern, apoi in locatia sau pagina unde doriti sa deschida acest link apelati metoda SetLink() si intre parantezele ei adaugati variabila setata pentru link-ul intern respectiv.
Aceeasi variabila o folositi ca atribut URL si pentru textul, celula sau imaginea care va afisa link-ul (pe care se va da click).

Ca sa intelegeti mai bine studiati exemplul urmator:

<?php
include('fpdf.php');  // Include clasa FPDF
// Se defineste clasa extinsa, pt. adaugarea nr. pagina in Footer
class PDF extends FPDF {
  // Definirea Footer-ului
  function Footer() {
    $this->SetY(-15);          // Seteaza pozitia la 15mm pe verticala fata de subsolul paginii
    $this->SetFont('Arial','I',8);    // Seteaza Fontul Italic 8
    // Adauga o celula cu text ce contine nr. paginii curente
    $this->Cell(0,10,'Page '.$this->PageNo(),0,0,'C');
  }
}
$pdf = new PDF();              // Creaza obiectul de lucru
$pdf->AddPage();               // Initializeaza prima pagina
$pdf->SetFont('Arial','',15);  // Defineste fontul
// Seteaza variabilele pt. 2 link-uri interne
$pag1 = $pdf->AddLink();
$pag3 = $pdf->AddLink();
$pdf->Write(5,'Textul din prima pagina a documentului PDF, cu link intern catre pagina 3,
 adaugat prin alta apelare a metodei Write() ce contine textul si variabila definita ca link intern catre ');
$pdf->SetFont('','U');         // Seteaza fontul pt. link
$pdf->Write(5,'pagina 3',$pag3);       // Adauga link-ul
$pdf->SetFont('');             // Modifica din nou fontul
// Seteaza destinatia link-ului intern din variabila $pag1
$pdf->SetLink($pag1);
// Adauga o noua pagina
$pdf->AddPage();
$pdf->Write(5,'Textul din a doua pagina');
// Adauga o alta pagina
$pdf->AddPage();
$pdf->Write(5,'Textul din a treia pagina, link catre prima pagina, ');
$pdf->SetFont('','U');         // Seteaza fontul pt. link
$pdf->Write(5,'click aici',$pag1);    // Adauga link-ul
// Seteaza destinatia link-ului intern din variabila $pag3
$pdf->SetLink($pag3);
$pdf->Output();                // Trimite datele de iesire
?>
               

– Am adaugat o extindere a clasei FPDF ca sa fie adaugat un Footer in care sa se afiseze numarul paginii.
– Alte explicatii ajutatoare gasiti in comentariile din script. Documentul PDF generat il puteti vedea aici -> Demo 6.

3. Creare tabel

Ca sa creati un tabel intr-un document PDF trebuie sa creati cate o celula pentru fiecare casuta a tabelului si sa le asezati (definiti) astfel incat sa formeze un tabel. Pentru aceasta cel mai indicat este folosirea matricelor.
In exemplul urmator este prezentat si explicat un script care preia niste date dintr-un fisier text (aici state.txt) si le afiseaza intr-un document PDF sub forma de tabel. Datele din fisier sunt linii de text care contin numele unor state, capitala, suprafata si populatie; separate prin caracterul punct si virgula (;). Astfel, va fi creat un tabel cu 4 coloane.
Explicatiile necesare le gasiti in script, studiati cu atentie comentariile adaugate, acestea va ajuta sa intelegeti modul de lucru si rolul fiecarei linii de cod.

<?php
include('fpdf.php');    // Include clasa FPDF
// Creaza clasa copil a clasei de baza FPDF
class PDF extends FPDF {
  // Peia datele din fisier si le separa
  function LoadData($file) {
    // Citeste fiecare liniile din fisier, primit ca argument
    // Separa datele cu "explode()" si le adauga intr-o matrice
    $lines = file($file);
    // Defineste matricea $data care va contine pt. fiecare element cate o matrice cu datele liniei
    $data = array();
    foreach($lines as $line) $data[]=explode(';',trim($line));
    return $data;              // Returneaza matricea cu datele separate
  }
  // Creaza celulele in forma unui tabel, cu datele din matrice
  // Primeste ca argumente variabilele ce contin textul pt. header si datele din matrice
  function FancyTable($header,$data) {
    //Defineste grafica pt. Header-ul tabelului
    $this->SetFillColor(254,90,110);
    $this->SetTextColor(255);
    $this->SetDrawColor(128,0,0);
    $this->SetLineWidth(.3);
    $this->SetFont('','B');
    $w = array(40,35,40,45);                  // Matricea cu lungimea fiecarei coloane
    // Afiseaza in linie cate o celula de text (argumentul cinci este 0)
    for($i=0; $i<count($header); $i++) $this->Cell($w[$i],7,$header[$i],1,0,'C',true);
    $this->Ln();                      // Adauga linie noua dupa header
    //Defineste un fondul si culoarea pt. text
    $this->SetFillColor(224,235,255);
    $this->SetTextColor(0);
    $this->SetFont('');
    // Seteaza o variabila care determina daca celula va avea fondul definit sau nu
    $fill = false;
    // Pentru fiecare matrice principala din $data creaza cate o linie cu 4 celule
    // In fiecare celula adauga datele din elementele sub-matricei curente (formata cu explode())
    // 'LR' reprezinta bordura doar in stanga si dreapta (Left, Right)
    foreach($data as $row) {
      $this->Cell($w[0],6,$row[0],'LR',0,'L',$fill);
      $this->Cell($w[1],6,$row[1],'LR',0,'L',$fill);
      $this->Cell($w[2],6,$row[2],'LR',0,'R',$fill);
      $this->Cell($w[3],6,$row[3],'LR',0,'R',$fill);
      $this->Ln();                    // Adauga rand nou dupa fiecare linie
      $fill = !$fill;          // Alterneaza 'true', 'false' variabila ce determina includerea fondului
    }
    // Adauga o celula goala pt. cu lungimea totala a coloanelor si o bordura
    // Aceasta e necesara pt afisarea liniei de sfarsit a tabelului
    $this->Cell(array_sum($w),0,'','T');
  }
}
$pdf = new PDF();                     // Creaza obiectul de lucru
// Matricea cu textul header a fiecarei coloane
$header = array('State','Capitala','Suprafata','Populatie (mii)');
$data=$pdf->LoadData('state.txt');            // Apeleaza metoda care preia datele din fisier
$pdf->SetFont('Arial','',14);
$pdf->AddPage();
$pdf->FancyTable($header,$data);              // Apeleaza metoda care aseaza celulele in forma de tabel
$pdf->Output();
?>
               


Continutul fisierului „state.txt” este urmatorul:

Austria; Vienna; 83859; 8075
Belgium; Brussels; 30518; 10192
Denmark; Copenhagen; 43094; 5295
Finland; Helsinki; 304529; 5147
France; Paris; 543965; 58728
Germany; Berlin; 357022; 82057
Greece; Athens; 131625; 10511
Ireland; Dublin; 70723; 3694
Italy; Roma; 301316; 57563
Luxembourg; Luxembourg; 2586; 424
Netherlands; Amsterdam; 41526; 15654
Portugal; Lisbon; 91906; 9957
Spain; Madrid; 504790; 39348
Sweden; Stockholm; 410934; 8839
United Kingdom; London; 243820; 58862


– Documentul PDF generat de acest script il puteti vedea aici -> Demo 7.

8. Parsare cod HTML

In acest ultim exemplu este prezentat un script care recunoaste etichetele html <b>, <i>, <u>, <a> si <br> sau <br />.
Normal, clasa FPDF creaza documentul PDF cu textul asa cum este scris, fara a recunoaste tag-urile, totusi, de multe ori este necesara aceasta facilitate si poate fi creata cu functii specifice adaugate intr-o clasa extinsa.
Aceasta modalitate consta in lucru cu functii pentru siruri. Pe scurt, trebuie create functii care sa recunoasca tag-urile dorite din sir, apoi, in functie de semnificatia acestor tag-uri, sa apeleze metodele clasei care sa defineasca stilul textului afisat in pagina PDF.
Studiati clasa extinsa creata in exemplul de mai jos, pe care o puteti copia si folosi in programele dv.

<?php
include('fpdf.php');  // Include clasa FPDF
// Creaza clasa extinsa a clasei de baza FPDF
class PDF extends FPDF {
  // Definirea variabilei pt. lucru cu adresa URL
  var $HREF;
  // Functia care scrie textul si recunoaste tagu-urile HTML
  function WriteHTML($html) {
    // Inlocuieste cu spatiu linia noua si parseaza tag-ul HTML
    $html = str_replace("\n",' ',$html);
    $a = preg_split('/<(.*)>/U',$html,-1,PREG_SPLIT_DELIM_CAPTURE);
    foreach($a as $i=>$e) {
          if($i%2==0) {
            // Daca in tag e recunoscut href
               if($this->HREF) $this->PutLink($this->HREF,$e);
               else $this->Write(5,$e);
      }
      else {
        // Daca este eticheta de inchidere a tag-ului
               if($e[0]=='/') $this->CloseTag(strtoupper(substr($e,1)));
        else {
          // Extrage atributele
          $a2 = explode(' ',$e);
          $tag = strtoupper(array_shift($a2));
          $attr=array();
          foreach($a2 as $v) {
            if(preg_match('/([^=]*)=["\']?([^"\']*)/',$v,$a3))
              $attr[strtoupper($a3[1])] = $a3[2];
          }
          $this->OpenTag($tag,$attr);
        }
      }
    }
  }
  // Functia pt. determinarea actiunii in functie de tag-ul HTML recunoscut
  function OpenTag($tag,$attr) {
    // Daca tag-ul este B, I sau U
    if($tag=='B' || $tag=='I' || $tag=='U') $this->SetStyle($tag,true);
        // Daca tag-ul e A
    if($tag=='A') $this->HREF=$attr['HREF'];
        // Daca tag-ul e BR
    if($tag=='BR') $this->Ln(5);
  }
  // Functia pt. actiunea la inchiderea tag-ului
  function CloseTag($tag) {
    // Daca tag-ul inchis este B, I sau U
    if($tag=='B' || $tag=='I' || $tag=='U') $this->SetStyle($tag,false);
        // Daca tag-ul inchis e A
    if($tag=='A') $this->HREF='';
  }
  // Functia pt. setarea stilului textului in functie de tipul tag-ului B, I, U
  function SetStyle($tag,$enable) {
    // Seteaza stilul fontului in functie de tag-ul B, I sau U
    $this->$tag+=($enable ? 1 : -1);
    $style = '';
    foreach(array('B','I','U') as $s) {
      if($this->$s>0) $style.=$s;
    }
    $this->SetFont('',$style);
  }
  // Functia pt. adaugarea link-ului
  function PutLink($URL,$txt) {
    // Seteaza fontul specific link si apeleaza metoda Write() cu atribut pt. URL
    $this->SetTextColor(0,0,255);
    $this->SetStyle('U',true);
    $this->Write(5,$txt,$URL);
    $this->SetStyle('U',false);
    $this->SetTextColor(0);
  }
}
// Variabila ce contine textul cu elemente HTML
$html = 'Text care contine tag-uri HTML a caror stil va fi recunoscut si modificat pentru PDF, pentru a fi similar cu stilul afisat in pagina HTML.<br />
Linie noua adaugata cu BR, stilurile recunoscute: <b>bold</b>, <i>italic</i>, <u>underlined</u>, sau <b><i><u>toate la un loc</u></i></b>!<br><br>
        Link adaugat prin recunoasterea tag-ului "A" specific pt. link-uri, <a href="http://www.CursPHP.net/php-mysql/">Curs PHP - MySQL</a>';
$pdf = new PDF();
$pdf->AddPage();
$pdf->SetFont('Arial','',14);
// Apeleaza metoda WriteHTML() creata in clasa extinsa
// transferand ca argument variabila $html
$pdf->WriteHTML($html);
$pdf->Output();
?>
               

– Aceasta clasa extinsa recunoaste si transforma doar tag-urile HTML <b>, <i>, <u>, <a> si <br> sau <br />; daca in sir sunt si alte tag-uri acestea nu vor fi adaugate.
– Rezultatul acestui script il puteti vedea aici -> Demo 8.

Studiati si documentatia si tutorialul de pe site-ul oficial www.fpdf.org.

Utilizare FTP cu PHP

  • Invatati sa va conectati la server prin FTP folosind PHP
  • Invatati sa transferati fisiere prin FTP cu PHP
  • Functii utile pentru utilizare FTP cu PHP

FTP (File Transfer Protocol) este un protocol standard care realizeaza o conexiune client-server pentru transfer si manipulare de fisiere prin Internet.
Cu ajutorul FTP puteti adauga si copia fisiere (si directoare) de pe server sau sa le schimbati permisiunile CHMOD. PHP are functii speciale pentru conectarea la server si lucrul cu FTP.

1. Conectarea la server

Pentru conectarea la server prin FTP sunt necesare 3 date importante: adresa serverului (a domeniului), numele de utilizator si parola de conectare prin FTP.
La inceput se deschide o conexiune cu serverul, folosind functia ftp_connect(), aceasta preia ca argument necesar numele serverului, care de obicei are forma „ftp.server” („server” poate fi numele domeniului sau adresa IP a acestuia). Daca deschiderea conexiunii s-a efectuat, functia va returna un ID a conexiunii, in caz contrar returneaza FALSE.
Dupa deschiderea conexiunii se face autentificarea pe server, pentru aceasta se foloseste functia ftp_login() care are urmatoarea sintaxa:
                ftp_login(conn_id, nume_user, parola)
– unde „conn_id” este id-ul conexiunii returnat de „ftp_connect()”
– „nume_user” este numele de utilizator pentru conectare la FTP, iar „parola” este parola utilizatorului.
Pentru inchiderea conectarii se foloseste functia ftp_close(), aceasta preia ca argument id-ul conexiunii.

Iata un exemplu de conectare prin FTP la server-ul unui site:

<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.un_site.net';              // Poate fi de exemplu 'ftp.CursPHP.net'
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 
// Executa autentificarea pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
echo "Conectare reusita la serverul $ftp_server, pentru utilizatorul $ftp_user";
}
// Inchide conexiunea
ftp_close($conn_id);
?>

– Daca s-a efectuat cu succes conectarea si autentificarea pe server, va afisa mesajul de confirmare, in caz contrar apare mesajul de eroare.
– La urma, „ftp_close($conn_id);” inchide conexiunea si elibereaza memoria alocata.

Conectarea la server folosind codul de mai sus este primul pas, dupa aceasta puteti folosi functiile PHP specifice FTP pentru a efectua diferite operatii, cum sunt: preluarea continutului directoarelor, incarcarea sau descarcarea de fisiere, crearea de noi directoare sau modificarea permisiunilor CHMOD.

2. Preluarea continutului directoarelor

Pentru a prelua continutul unui director (numele fisierelor si directoarelor din el) se foloseste functia
                ftp_nlist(conn_id, director)
– unde „conn_id” este id-ul conexiunii returnat de „ftp_connect()”
– „director” este numele directorului a carui continut va fi preluat
Aceasta functie returneaza o matrice secventiala a carei elemente sunt numele fiecarui director si fisier din catalogul cautat.
Mai jos este un exemplu practic.

<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';             // Poate fi de exemplu 'ftp.CursPHP.net'
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 
// Executa conectare pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
// Obtine continutul directorului (numele de fisiere si directoare din el)
$continut = ftp_nlist($conn_id, ".");
// Parcurge matricea si afiseaza numele directoarelor si fisierelor returnate
for ($i=0; $i<count($continut); $i++) {
echo '<br>'.$continut[$i];
}
}
// Inchide conexiunea
ftp_close($conn_id);
?>

– Dupa setarea conexiunii si autentificarea pe server, daca conectarea a reusit este apelata functia „ftp_nlist()”, care va stoca in variabila „$continut” matricea cu numele cataloagelor si fisierelor din directorul radacina (precizat de argumentul „.”).
Daca doriti obtinerea datelor din alt director, de exemplu „www”, puteti apela functia asa: ftp_nlist($conn_id, ‘/www’).
– Pentru afisarea (sau preluarea) numelui fiecarui fisier si director returnat se parcurge matricea „$continut”.
Rezultatul afisat de acest script va fi ceva similar cu cel de jos:

cgi-bin
private
public_html
statistics
www

3. Incarcare fisier pe server

Pentru incarcarea (upload) unui fisier pe server prin FTP cu PHP se foloseste functia ftp_put(), aceasta returneaza TRUE daca incarcarea s-a efectuat cu succes, in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
                ftp_put(conn_id, destinatie, fisier, tip_transfer)
– unde „conn_id” este id-ul conexiunii returnat de „ftp_connect()”
– „destinatie” este directorul (si numele fisierului) pe server unde va fi incarcat fisierul
– „fisier” este numele fisierului care va fi copiat
– „tip_transfer” reprezinta modul incarcarii pe server, acesta poate lua valoarea FTP_ASCII sau FTP_BINARY

Iata un exemplu in care se copie un fisier de pe calculatorul client pe server, in directorul ‘www’:

<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 
// Executa conectare pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
// Datele cu numele fisierului, sursa unde se afla si directorul unde va fi incarcat pe server
$fisier = 'test.txt';
$sursa = 'c:/wamp/www/site/'. $fisier;
$destinatie = '/www/'. $fisier;
// Apeleaza functia "ftp_put()" pt. efectuarea transferului
// Afiseaza mesaj de reusita sau nu
if (ftp_put($conn_id, $destinatie, $sursa, FTP_BINARY)) echo "Fisierul $fisier a fost incarcat pe server";
else echo "Eroare, fisierul $fisier nu a putut fi incarcat pe server";
}
// Inchide conexiunea
ftp_close($conn_id);
?>

– Daca datele pentru conectare sunt corecte si PHP are permisiuni de transfer prin FTP, fisierul „test.txt” (aflat pe calculatorul client in directorul „c:/wamp/www/site/”) va fi copiat pe server, in directorul „www/”.
– Fisierul va fi incarcat cu acelasi nume, daca doriti sa fie transferat pe server cu alt nume, modificati la „$destinatie”.

4. Copiere fisier de pe server

Pentru copierea (download) unui fisier de pe server pe calculatorul client se foloseste functia ftp_get(), aceasta returneaza TRUE daca transferul s-a efectuat cu succes, in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
                ftp_get(conn_id, client, fisier, tip_transfer)
– unde „conn_id” este id-ul conexiunii returnat de „ftp_connect()”
– „client” este locatia de pe calculatorul client unde va fi copiat fisierul
– „fisier” este numele fisierului (si locatia) de pe server unde acesta se gaseste
– „tip_transfer” reprezinta modul incarcarii pe server, acesta poate lua valoarea FTP_ASCII sau FTP_BINARY

Iata un exemplu in care se descarca prin FTP un fisier de pe server pe calculatorul client:

<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 
// Executa conectare pe server (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
// Datele cu numele fisierului, sursa unde se afla si directorul unde va fi copiat
$fisier = 'test.txt';
$server = '/www/'. $fisier;
$client = 'c:/download/'. $fisier;
// Apeleaza functia "ftp_get()" pt. efectuarea transferului
// Afiseaza mesaj de reusita sau nu
if (ftp_get($conn_id, $client, $server, FTP_BINARY)) echo "Fisierul $fisier a fost descarcat";
else echo "Eroare, fisierul $fisier nu a putut fi descarcat";
}
// Inchide conexiunea
ftp_close($conn_id);
?>

– Daca datele pentru conectare sunt corecte si PHP are permisiuni de transfer prin FTP, fisierul „test.txt” (aflat pe server in directorul „www/”) va fi copiat pe calculatorul client, in directorul „c:/download/”.
– Fisierul va fi copiatat cu acelasi nume, daca doriti sa fie descarcat pe calculator cu alt nume, modificati la „$client”. Daca in directorul unde va fi copiat se mai afla un fisier cu acelasi nume, acesta va fi inlocuit cu cel descarcat de pe server.

5. Creare director pe server

Inainte de a crea un director nou prin FTP, setati directorul curent de lucru care reprezinta locatia unde doriti sa fie creat noul catalog. Pentru aceasta se foloseste functia ftp_chdir(conn_id, director); „conn_id” este id-ul conexiunii iar „director” este numele directorului care va fi setat pentru lucru.

Pentru crearea unui director pe server prin FTP se foloseste functia ftp_mkdir(), in caz de succes returneaza numele noului director creat, iar in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
                ftp_mkdir(conn_id, nume_dir)
– unde „conn_id” este id-ul conexiunii returnat de „ftp_connect()”
– „nume_dir” este numele noului director

Iata un exemplu in care se creaza un director „test” pe server, in „www/”:

<?php
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 
// Executa conectare (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true); 
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
$dir = 'un_director';          // Numele noului director
// Daca e setat directorul de lucru "www/"
if(ftp_chdir($conn_id, '/www/')) {
// Apeleaza functia "ftp_mkdir()" pt. crearea directorului
// Afiseaza mesaj de reusita sau nu
if (ftp_mkdir($conn_id, $dir)) echo "Directorul $dir a fost creat";
else echo "Eroare, directorul $dir nu a putut fi creat";
}
}
// Inchide conexiunea
ftp_close($conn_id);
?>

– Daca datele pentru conectare sunt corecte si directorul curent de lucru (www/) este setat cu succes iar PHP are permisiuni de scriere pe server, in catalogul „www/” va fi creat directorul „un_director”.

Pentru stergerea unui director se foloseste functia ftp_rmdir(conn_id, del_dir), unde „conn_id” este id-ul conexiunii iar „del_dir” este numele directorului care va fi sters.

6. Transferarea unei portiuni de fisier pe server

Pe langa transferul unui fisier complet, PHP ofera si functii pentru transferul unei anumite parti din continutul unui fisier.
O functie care face acest lucru este ftp_fput(), aceasta incarca pe server continut dintr-un fisier deschis cu „fopen()”, returneaza TRUE in caz de succes, iar in caz contrar returneaza FALSE. Are urmatoarea sintaxa:
                ftp_fput(conn_id, destinatie, pointer_fisier, tip_transfer)
– unde „conn_id” este id-ul conexiunii returnat de „ftp_connect()”
– „destinatie” este directorul de pe server unde va fi incarcat fisierul
– „pointer_fisier” reprezinta identificatorul (pointer-ul) de fisier deschis cu „fopen()”. Retine continutul de la acest pointer pana la sfarsitul fisierului.
– „tip_transfer” reprezinta modul incarcarii pe server, acesta poate lua valoarea FTP_ASCII sau FTP_BINARY

Iata un exemplu in care este preluata o parte din continutul unui fisier si transferata intr-un fisier pe server:

<?php
$fisier = "test.txt";          // Fisierul care va fi deschis pt. citire
// Daca fisierul a fost deschis pt. citire
if ($fp = fopen($fisier, rb)) {
fseek($fp, 40);        // Seteaza pozitia pointer-ului in fisier
// Datele pt. conectare la server
$ftp_server = 'ftp.domeniu_site';
$ftp_user = 'utilizator';
$ftp_pass = 'parola';
// Seteaza Id-ul conexiunii
$conn_id = ftp_connect($ftp_server); 
// Executa conectare (mod pasiv ca sa nu fie blocat de firewall)
$login_result = ftp_login($conn_id, $ftp_user, $ftp_pass);
ftp_pasv($conn_id, true);
// Verifica daca s-a reusit sau nu conectarea la server
if ((!$conn_id) || (!$login_result)) { 
echo "Conectarea prin FTP la serverul $ftp_server pentru utilizatorul $ftp_user a iesuat.";
exit;
}
else {
$destinatie = '/www/test2.txt';               // Directorul destinatie si numele fisierului
// Transfera continutul intr-un fisier nou pe server
// Afiseaza mesaj de reusita sau nu
if (ftp_fput($conn_id, $destinatie, $fp, FTP_BINARY)) echo 'Continutul a fost transferat';
else echo 'Eroare, continutul nu a putut fi transferat';
}
// Inchide conexiunea
ftp_close($conn_id);
// Elibereaza memoria ocupata de deschiderea fisierului
fclose($fp);
}
?>

– Daca fisierul „test.txt” a fost deschis pentru citire, functia „fseek($fp, 40)” muta pointer-ul la pozitia 40, astfel va fi retinut continutul din fisier care incepa de la caracterul 41 pana la sfarsit (primul caracter are pozitia 0).
– In continuare, daca s-a efectuat cu succes conexiunea si autentificarea prin FTP, se transfera continutul in fisierul „test2.txt” din directorul „www” de pe server (daca fisierul „test2.txt” exista deja pe server, continutul lui va fi inlocuit cu cel transferat).
In cazul in care doriti sa transferati intreg continutul unui fisier deschis cu „fopen()”, nu este necesara utilizarea funtiei „fseek()”.
Aceasta metoda este utila cand doriti sa adaugati un sir sau continut, de exemplu preluat dintr-un form, pe server prin FTP. Adaugati sirul intr-un fisier temporar pe care apoi il deschideti cu „fopen()” si transferati continutul cu „ftp_fput()”.

Pentru stergerea unui fisier se foloseste functia ftp_delete(conn_id, ‘cale/fisier’), unde „conn_id” este id-ul conexiunii iar „cale/fisier” este calea si numele fisierului care va fi sters.

7. Alte functii utile pentru FTP

Pe langa functiile prezentate in exemplele de mai sus, PHP are si alte functii utile pentru lucrul cu fisiere si directoare prin FTP.
Iata cateva din acestea:

  • ftp_cdup(conn_id)   – Schimba ca director curent de lucru directorul parinte
  • ftp_chmod(conn_id, octal_CHMOD, fisier)   – Seteaza permisiunile CHMOD a unui fisier prin FTP
  • ftp_mdtm(conn_id, fisier)   – returneaza timpul, in format Unix, cand a fost ultima data modificat un fisier
  • ftp_pwd(conn_id)   – Returneaza numele directorului curent de lucru
  • ftp_rename(conn_id, nume_actual, nume_nou)   – Modifica numele unui director sau fisier
  • ftp_size(conn_id, fisier)   – Returneaza marimea fisierului specificat, in bytes (unele servere nu suporta aceasta functie)

O lista completa cu functiile PHP pentru FTP gasiti la adresa din urmatorul link Functii PHP pentru FTP

Similar Posts

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *