[Tutorial PHP]Creare site cu PHP si MySQL - CMS

#1
Nume Tutorial:Creare site cu PHP si MySQL - CMS
Descriere:In aceast tutorial puteti invata cum sa creati un site de la zero, care foloseste si baza de date MySQL. Trebuie sa aveti cel putin cunostintele de baza despre PHP, MySQL, HTML si CSS. Vom avea 3 parti din acest tutorial.
Download:
Autor:
Sursa (Link-ul oficial):
tutorialeweb.net
Propria parere:Nu l-am incercat.
Tutorialul:
Datele despre numele paginilor, titlu, cuvinte cheie si descriere vor fi stocate intr-un tabel dintr-o baza de date MySQL, iar continutul fiecarei pagini va fi salvat in fisiere intr-un director pe server.
Toate aceste date vor putea fi adaugate sau stere dintr-o pagina de administrare.
Acest sistem de script pentru site se mai numeste si CMS, acronim de la Content Management System, o colectie de proceduri prin care continutul, paginile site-ului, pot fi adaugate, sterse si modificate automat dintr-o pagina de administrare.
Exemplul din aceast tutorial este un fel de CMS mai simplu, care da posibilitatea de a adauga in site: categorii, meniuri si continut, precum si stergerea lor din pagina de Admin. Pentru a nu complica prea mult scriptul si necesitatea explicatiilor, nu am adaugat si o procedura de modificare. Ideea fiind sa puteti invata esentialul in modul de creare a unui site cu PHP si MySQL. Continutul paginilor il puteti apoi modifica din fisierele in care a fost salvat.
Accentul este pus pe partea de programare, grafica site-ului pentru modelul prezentat aici o face fiecare. Sistemul permite usor crearea si folosirea unui template HTML

Daca doriti sa invatati cum sa creati un script de site CMS, va sfatuiesc sa cititi cu atentie acest tutorial si sa scrieti personal scriptul din fiecare fisier, dupa codul prezentat in continuare pentru fiecare. Daca doar vreti sa folositi acest model pentru a-l adapta si dezvolta, descarcati arhiva cu tot scriptul si studiati documentatia din el.
- Scriptul complet il puteti descarca de aici -> Creare site - CMS.

In fisierele scriptului gasiti explicatiile necesare intelegeri fiecarei linii de cod si la ce sunt folosite. In acest tutorial este explicat in mare structura si logica scriptului.
1. Structura site-ului

Inainte de a incepe crearea unui site, trebuie stabilita structura acestuia, care consta din 3 elemente principale (daca folosim si baza de date):
- structura tabelului (tabelelor) din baza de date.
- structura fisierelor si directoarelor pe server.
- structura paginii (paginilor) siteului, layout-ul.
Luam pe fiecare in parte.

Pentru exemplu de site, relativ simplu, din aceasa lectie, este folosit un singur tabel MySQL, care are urmatoarele coloane:
- id - o coloana de tip INTEGER AUTO_INCREMENT, care va avea un 'id' (numar) unic pentru fiecare pagina adaugata.
- meniu - unde e inregistrat numele meniurilor principale (categoria careia apartine pagina).
- pagina - pentru numele care-l are fisierul ce contine contextul paginii respective.
- titlu - in care e stocat titlul ce va fi adaugat in sectiunea HEAD, folosit si pt. formarea numelui si URL-ul paginii
- descriere - pentru descrierea din meta-tag "description".
- cuv_key - pentru cuvintele cheie care vor fi adaugate la fiecare pagina in meta-tag "keywords".
- data - pentru inregistrarea datei (in format UNIX) la care sunt adaugate paginile.

La structura de pe server sunt folosite 5 fisiere principale si un director pentru stocarea fisierelor unde va fi salvat continutul fiecarei pagini (vor fi prezentate fiecare mai tarziu).

Structura paginii (layout-ul) este creata in "index.php", cu o configuratie impartita in 3 zone principale:
- Top - unde sunt afisate meniurile principale din site,
- Corp - zona in care sunt afisate: intr-o parte link-urile paginilor din categoria respectiva, si in rest continutul acestora
- Subsol - pentru ce vrem sa apara in partea de jos a site-ului.

Aceasta e pe scurt structura site-ului, in continuare creem pe rand fiecare din aceste elemente.
2. Crearea tabelului MySQL

Partea mai simpla, dar esentiala si foarte importanta la un site care foloseste baze de date e proiectarea si scrierea codului pentru crearea tabelelor in baza de date. Pentru acest proiect, care e simplu in ceea ce priveste structura MySQL, am folosit un singur tabel, cu numele "pagini" ce are coloanele prezentate mai sus.
In directorul radacina al site-ului (www sau httpdocs) creem un fisier php (aici numit "creaza_tabel.php") in care se scrie codul PHP de mai jos, pentru tabelul MySQL (explicatiile necesare sunt in documentatia din cod).
- Fisierul creaza_tabel.php

Cod: Selectaţi tot

<?php
// Seteaza utilizarea formatului UTF-8
header("Content-type: text/html; charset=utf-8");

// Include fisierul pt. conectare-selectare baza de date
include("admin.php");

// Creaza tabelul pagini, cu coloanele necesare si utilizabil cu formatul UTF-8
$sql = "CREATE TABLE `pagini` (id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, meniu varchar(25), pagina varchar(110), titlu varchar(75), descriere varchar(250), cuv_key varchar(200), data int(10)) CHARACTER SET utf8 COLLATE utf8_general_ci";

// Se verifica executia funtiei pentru transmiterea codului SQL
if (mysql_query($sql, $conn))
echo '<br /><br /><br /><center><h4>Tabelul pagini a fost creat</h4></center><br />';
else
echo '<br /><br /><br /><center><h4>Tabelul pagini nu a putut fi creat deoarece - '. mysql_error(). '</h4></center>';

mysql_close($conn);         // Incheie conexiunea la mysql
?>
3. Datele administratorului, conectarea la MySQL si functii de filtrare

Pentru a lucra cu MySQL din PHP, trebuie sa scriem datele pentru conectarea scriptului la baza de date.
Deoarece aceste date trebuie folosite in toate paginile care preiau sau transmit valori la MySQL, le scriem intr-un fisier php separat, aici numit "admin.php", pe care-l vom include (cu include()) unde este necesar.
In acest script de tip CMS vom avea nevoie de inca 2 fisiere principale: unul pentru partea de administrare (adaugare, stergere pagini) si altul pentru afisarea continutului. Ambele vor lucra cu baza de date si numele meniurilor.
Pentru a nu crea de mai multe ori aceeasi functie in fisiere diferite, folosim "admin.php", pe care oricum il includem in celelalte fisiere din script, si scriem in el si alte date sau functii generale, precum cele de filtrare, pe care va trebui sa le folosim in fisiere separate. Astfel, codul comun folosit in scripturile din ele il vom scrie cat mai simplu, o singura data, in "admin.php", unde in total adaugam:
- datele pentru conectarea si selectarea bazei de date, numele si parola pentru accesul la functiile paginii de admin (prezentata in partea a doua a tutorialului), o functie pentru selectarea meniurilor principale din tabelul MySQL, deoarece numele meniurilor vor fi necesare atat in fisierul care afiseaza paginile din site cat si in cel de administrare, o functie pentru filtrarea datelor care lucreaza cu MySQL si alta care va fi folosita pentru definirea numelor paginilor din site, utilizate si in crearea link-urilor.
Codul PHP ce trebui scris in "admin.php" e urmatorul.
- Fisierul admin.php

Cod: Selectaţi tot

<?php
// De la http://www.marplo.net/php-mysql/
// Datele pt. autentuificare Administrator
// Necesare in pagina pt. adaugare si stergere pagini in site
$admin = 'admin';
$pass = 'pass';

// Numele directorrului unde sunt incarcate paginile
$dir = 'pagini';

// Seteaza extensia folosita pt. fisierele in care sunt salvate contextul paginilor
$ext = '.htm';

// Modificati datele pt. conectare la baza de date
$host = "localhost";
$utilizator = "root";
$parola = "parola";
$numebd = "nume_bd";

// Conectarea la baza de date
$conn = mysql_connect($host, $utilizator, $parola);
if (!$conn) {
  echo 'Conectare nereusita la MySQL'; 
  exit;
}

// Selectarea bazei de date
if (!mysql_select_db($numebd, $conn)) {
  echo 'Baza de date nu a putut fi selectata deoarece : '. mysql_errno(). ' : '. mysql_error();
  exit;
}

// Setarea conexiunii pt. utilizare format UTF-8
$sql = "SET NAMES 'utf8'";
mysql_query($sql, $conn);

		/*** Functii necesare ***/

// Functia pt. filtrarea variabilelor folosite in lucru cu MySQL
function filtr_sql($var) {
  // Se verifica daca "magic_quotes_gpc()" este setat ON
  // Daca e ON, se aplica stripslashes() variabilei $var, pentru a nu se adauga de 2 ori "\"
  if(get_magic_quotes_gpc()) { $var = stripslashes($var); }

  // Aplica functia de filtrare
  $var = mysql_real_escape_string($var);

  return $var;
}

// Functia care preia din MySQL meniurile principale ale site-ului
function get_meniu() {
  GLOBAL $conn;
  // Selecteaza coloanele in care numele meniului e acelasi cu numele paginii
  // Apoi adauga numele meniurilor intr-o variabila tip array
  $q = "SELECT `meniu` FROM `pagini` WHERE `meniu`=`pagina`";
  $result = mysql_query($q, $conn) or trigger_error(E_USER_ERROR);
  if (mysql_num_rows($result) == 0) {
    $menu = false;
  }
  else {
    while ($rand = mysql_fetch_assoc($result)) {
      // Elimina caracterele "\" care au fost adaugate de "mysql_real_escape_string()"
      $menu[] = stripslashes($rand['meniu']);
    }
  }
  return $menu;
}

// Functia pt filtrarea sirurilor folosite la numele meniurilor sau paginilor
// Utilizate la crearea numelor fisierelor si a link-urilor
function filtrare($sir) {
  // Inspirat de la www.tutoriale.far-php.ro
  // Se converteste numele in litere mici si se scot spatiile de la inceput si sfarsit
  $sir = trim(strtolower($sir));

  // Un array cu lista caracterelor care se inlocuiesc
  $lista_car = array(
	'&#259;' => 'a',
	'&icirc;' => 'i',
	'&acirc;' => 'a',
	'&#351;' => 's',
	'&#355;' => 't',
	'&#258;' => 'a',
	'&Icirc;' => 'i',
	'&Acirc;' => 'a',
	'&#350;' => 's',
	'&#354;' => 't',
	'ã' => 'a',
	'â' => 'a',
	'é' => 'e',
	'î' => 'i',
	'í' => 'i',
	'n' => 'n',
	'ó' => 'o',
	's' => 's',
	'?' => 't',
	'ú' => 'u',
	'-' => '_',
	' _ ' => '_',
	' _' => '_',
	'_ ' => '_',
	' ' => '_'
  );

  // Se inlocuiesc caracterele de mai sus, parcurgand fiecare element din matrice
  foreach ($lista_car as $litera=>$inlocuire) $sir = str_replace($litera, $inlocuire, $sir);

  // Pastreaza in sir doar caracterele din expresia regulata (adica litere, cifre si _)
  $sir = preg_replace('/([^A-Za-z0-9_])/', "", $sir);

  // Se returneaza gata aranjat
  return $sir;
}
?>
4. Protejarea fisierului

Deoarece in "admin.php" sunt datele importante pentru conectare la baza de date si autentificare administrator, este indicat sa asiguram o protetie sporita acestui fisier. Pentru aceasta folosim .htaccess ca sa blocam accesul extern la el.
Deschideti un editor simplu de text si scrieti in el codul de ma jos, apoi salvati-l in format ASCII cu denumirea .htaccess, fara alta extensie, in acelasi loc unde e si "admin.php".

Cod: Selectaţi tot

# Blocheaza accesul extern la admin.php
<files admin.php>
order allow,deny
deny from all
</files>
Sau o alta metoda ar fi sa mutati fisierul "admin.php" intr-un director de pe server, care nu poate fi accesat din browser. In acest caz trebuie sa modificati si calea de includere a lui.

- In partea a doua a acestui tutorial gasiti explicatii despre fisierul de administrare si management date, prin care se va putea adauga si sterge paginile site-ului.
- In partea a treia sunt prezentate fisierele "index.php" si "grafic.css"
Partea dificila la acest script si codul cel mai complicat este in fisierul care formeaza pagina de administrare, aici cu numele "add_del.php". In acest fisier se afla codul PHP si formularele pentru adaugarea meniurilor si paginilor in site si in baza de date, precum si scriptul de stergere a lor. Accesul la aceste functii se poate face numai dupa ce administratorul adauga intr-un formular datele de autentificare din "admin.php", deoarece la fiecare se verifica mai intai o sesiune de logare criptata MD5.
Imediat dupa tag-ul <body> al paginii este adaugata o conditie PHP "if()" care verifica existenta variabilei de sesiune setata la logare, daca aceasta nu exista sau nu e corecta, afiseaza formularul de autentificare, dupa care, cu instructiunea "exit;" se intrerupe executia codurilor urmatoare, care sunt pentru formularele de adaugare /stergere continut.
Inainte de codul HTML, este scriptul PHP, care e impartit in 4 parti distincte.
Ca sa intelegeti despre ce e vorba in explicatiile de mai jos, studiati in paralel si codul din "add_del.php", documentatiile adaugate.

1. - Se seteaza lucrul cu sesiuni "session_start();" si se include fisierul "admin.php", apoi, in prima parte se verifica datele pentru autentificare, primite de la formularul de logare, daca sunt corecte, creaza o variabila de sesiune compusa din numele si parola de admin, criptate cu MD5. Aceasta variabila e verificata la fiecare actiune de adaugare sau stergere date.

2. - Dupa aceasta urmeaza partea a doua din script, codul pentru adaugare meniuri si pagini in site. Detalii amanuntite gasiti in script.
In mare, se verifica sesiunea de logare, dupa care se verifica daca au fost trimise datele pentru adaugare meniu nou sau pagina noua. Aceste date, primite prin $_POST sunt stocate in variabile, cele care trebuie adaugate in tabelul "pagini" in MySQL sunt filtrate cu functia "filtr_sql()" creata in "admin.php", iar cu functia "filtrare($sir)" se formeaza din titlul paginii numele ei, folosit pentru salvare pe server. Astfel, in formarea numelui, caracterul '-' si spatiul sunt inlocuite cu '_', iar orice alt caracter care nu e o litera sau cifra este sters.
In functie de optiunea aleasa, adaugare meniu sau pagina, se executa codul corespunzator pentru salvarea continutului paginii intr-un fisier pe server si adaugarea datelor in tabelul MySQL: titlu, nume pagina, descriere, cuvinte cheie si data.
Pentru o diferentiere usoara, cand este adaugat meniu nou, contextul lui este salvat intr-un fisier care va avea numele meniului, iar cand este adaugata o pagina intr-o categorie (meniu) deja existenta, fisierul ce va contine contextul paginii respective va avea numele format din numele categoriei unde e adaugata pagina si titlul ei filtrat, separate prin liniuta '-'. Astfel, pagina principala a categoriei va avea numele "nume_meniu" iar cea care e ca sub-meniu dintr-o categorie va avea numele "nume_meniu-titlu_pagina".
Pentru a nu depasi lungimea indicata pt. SEO, titlul paginii e setat sa poata avea maxim 75 caractere.

3. - In partea a treia se scrie codul prin care meniurile si paginile adaugate pot fi sterse.
Prima data se verifica sesiunea de autentificare, apoi se executa si filtrarile necesare la datele primite din formulare, deoarece aceste filtrari au fost aplicate cand paginile au fost adaugate si trebuie sa corespunda.
Daca e primita cerere de stergere a unei pagini dintr-un meniu, selecteaza din MySQL numele paginilor care apartin acelui meniu si le afiseaza intr-o casuta Select de formular; cea care e selectata va fi stearsa complet, atat fisierul in care e stocat contextul ei cat si datele din MySQL care-i apartin.
Daca este primita cerere pentru stergerea unui intreg meniu, se va executa un cod care serge toate fisierele si datele din MySQL care fac parte din acel meniu (deci atentie).

4. - In ultima parte in codul PHP se apeleaza functia "get_meniu()" (creata in "admin.php") ca sa fie preluate numele meniurilor principale din site, apoi fiecare nume e adaugat in tag-uri "<option>" si stocate intr-o variabila. Continutul acestei variabile va fi inclus cu "echo" intr-o casuta Select din formularele pentru adaugare pagini si stergere meniu.

Dupa scriptul PHP se scrie codul HTML al paginii, cu formularele necesare pentru adaugare sau stergere date, dupa cum puteti vedea in codul fisierului.
In sectiunea HEAD e codul CSS pt. elementele paginii si 2 functii JavaScript, cu ajutorul lor poate fi folosit acelasi formular pentru adaugare meniu sau pagina, sau tot un singur formular pentru stergere meniu sau pagina. In functie de optiunea aleasa, scriptul JavaScript va determina afisarea formularului corespunzator.
Mai jos este codul complet.
- Fisierul add_del.php

Cod: Selectaţi tot

<?php
// De la http://www.marplo.net/php-mysql/
// Seteaza optiunea de a afisa orice eroare care apare in executia scriptului
ini_set('display_errors',1);
error_reporting(E_ALL);

// Seteaza posibilitatea lucrului cu sesiuni
session_start();

// Seteaza utilizarea formatului UTF-8 in pagina
header("Content-type: text/html; charset=utf-8");

// Include fisierul cu datele pt. conectare la MySQL
include('admin.php');

		/*** Part. 1 - Autentificare admin ***/

// Se verifica datele trimise pt. autentificarea administratorului
if (isset($_POST['nume']) && isset($_POST['parola'])) {
  // Verifica daca datele primite sunt aceleasi cu cele in 'admin.php'
  if ($_POST['nume']==$admin && $_POST['parola']==$pass) {
    // Seteaza variabila de sesiune pt. recunoasterea autentificarii
	$_SESSION['logat'] = md5($admin.$pass);
  }
  else {
    // Daca datele de la formular nu sunt corecte
    echo '<h4>Numele sau Parola transmisa nu e corecta</h4>';
	// Sterge sesiune pt. logare
	unset($_SESSION['logat']);
  }
}

		/*** Part. 2 - Adaugare meniu si pagini ***/

// Verifica daca administratorul e autentificat
// Si daca sunt trimise date pt. adaugare meniu sau pagina
if (isset($_SESSION['logat']) && $_SESSION['logat']==md5($admin.$pass) && isset($_POST['titlu']) && isset($_POST['descriere']) && isset($_POST['cuv_key']) && isset($_POST['context'])) {

  // Daca nu a fost adaugata pagina pt. upload, inchide executia
  if (strlen($_POST['titlu'])<2) {
    echo '<h4>Scrieti titlul paginii, minim 2 caractere. Reveniti la pagina anterioara</h4>';
    exit;
  }

  /** Daca sunt trimise date pt. adaugare meniu nou **/
  if (isset($_POST['n_meniu'])) {
    // Verifica daca este completat nume pt. meniu
	if (strlen($_POST['n_meniu'])<1) {
	  echo '<h4>Adaugati un nume pt. meniu, reveniti la pagina anterioara</h4>';
	  exit;
	}

	// Daca numele e completat, se adauga in variabila, filtrat cu functia filtrare() (in admin)
    $meniu = filtrare($_POST['n_meniu']);

	// Seteaza denumirea fisierului salvat pe server, cu cea a meniului
    $pagina = $meniu;
  }

  /** Daca sunt trimise date pt. adaugare pagina noua **/
  else if (isset($_POST['meniul'])) {
	// Verifica daca a fost ales meniul caruia va apartine pagina
	if (strlen($_POST['meniul'])<1) {
	  echo '<h4>Alegeti meniul, reveniti la pagina anterioara</h4>';
	  exit;
	}

    // Adauga numele meniului intr-o variabila
	$meniu = $_POST['meniul'];

	// Seteaza numele pe care-l va avea fisierul pe server
	// Format din numele meniului si titlu filtrat cu functia filtrare() (in admin)
	$pagina = $meniu. '-'. filtrare($_POST['titlu']);
  }

  // Pregateste o matrice cu elementele ce trebuie adaugate in MySQL
  $add['meniu'] = $meniu;
  $add['pagina'] = $pagina;
  $add['titlu'] = $_POST['titlu'];
  $add['cuv_key'] = $_POST['cuv_key'];
  $add['descriere'] = $_POST['descriere'];
  $data = time();

  // Filtreaza toate datele din variabila array $add, folosind functia "filtr_sql()" creata in admin
  // Pentru ca mai tarziu sa fie adaugate in siguranta in MySQL
  $add = array_map('filtr_sql', $add);

  // Preia continutul pt. paginia (de la textarea) intr-o variabila
  $context =  $_POST['context'];

  // Seteaza locatia si numele pt. salvare pe server, cu extensia $ext, definita in admin.php
  $thefile = $dir. "/". $pagina. $ext;
  $ad_file = fopen($thefile, "xb");

  // Daca fisierul poate fi creat sib salvat pe server
  if (fwrite($ad_file, $context)) {
    // Se defineste interogarea pt. adaugarea datelor in tabelul MySQL `pagini`
	$sql = "INSERT INTO `pagini` (meniu, pagina, titlu, descriere, cuv_key, data) VALUES ('".$add['meniu']."', '".$add['pagina']."', '". $add['titlu']."', '".$add['descriere']."', '".$add['cuv_key']."', '$data')";

  // Se executa interogarea care adauga datele in tabele
    if (mysql_query($sql, $conn)) echo '<h4>Pagina '. $pagina. ' a fost salvata si inregistrata.</h4>';
    else  echo 'Eroare : '. mysql_errno(). ' - '. mysql_error();
  }
  // Daca fisierul ce trebuie sa contina contextul paginii nu a putut fi creat pe server
  else echo 'Fisierul <b>'. $pagina.$ext. '</b> nu a putut fi salvat in <b>'. $dir. '</b>';
}

		/*** Part. 3 - Stergere pagini ***/

// Verifica daca admmin-ul e logat si e trimisa cerere pt. stergere
if (isset($_SESSION['logat']) && $_SESSION['logat']==md5($admin.$pass) && isset($_POST['delet'])) {
  // Daca e primita cerere de afisare a paginilor din meniu
  if (isset($_POST['s_meniu'])) {
    $meniu = str_replace(' ', '_', $_POST['s_meniu']);

	// Filtreaza variabila pt. lucru cu MySQL
	$meniu = filtr_sql($meniu);

	// Selecteaza paginile din tabelul "pagini" care apartin meniului
	$sql = "SELECT `pagina` FROM `pagini` WHERE meniu='$meniu'";
    $result = mysql_query($sql, $conn) or trigger_error(E_USER_ERROR);
    if (mysql_num_rows($result) == 0) {
      echo '0 rezultate';
    }
    else {
      while ($rand = mysql_fetch_assoc($result)) {
        // Preia numele si titlul pagiilor care sunt in meniul accesat
	    // unde randu din tabel e diferi de cel al paginii meniului
	    if ($rand['pagina']!=$meniu) {
          // Elimina caracterele "\" care au fost adaugate de "mysql_real_escape_string()"
          $pags[] = stripslashes($rand['pagina']);
	    }
	  }
    }

	// Creaza formularul prin care va fi aleasa pagina care va fi stearsa
	echo '<h4><u>Sterge pagina</u></h4>
	  <form action="" method="post">Alege pagina: <select name="del_pg" id="del_pg"><option></option>';
	// Adauga o caseta select cu paginile
	for($i=0; $i<count($pags); $i++) {
	  echo '<option>'.$pags[$i].'</option>';
	}
	echo '</select> &nbsp; <input type="submit" name="delet" value="Sterge" /></form>';
	exit;
  }

  // Daca e primita cerere pt. a sterge o pagina
  else if (isset($_POST['del_pg'])) {
    $pg_del = $_POST['del_pg'];

	// Sterge fisierul paginii de pe server,
	// daca executia reuseste, sterge inregistrarea si in MySQL
	if (unlink($dir.'/'.$pg_del.$ext)) {
	  echo '<h4>Pagina ' .$pg_del.$ext. ' a fost stearsa de pe server</h4>';

	  // Filtreaza variabila pt. lucru cu MySQL
	  $pg_del = filtr_sql($pg_del);

	  // Interogatia SQL pt. stergerea paginilor meniului in MySQL
	  $sql = "DELETE FROM `pagini` WHERE `pagina`='$pg_del'";
	  // Daca datele sunt sterse
	  if (mysql_query($sql, $conn)) {
	    echo '<h4>Datele pt. pagina '. $_POST['del_pg']. ' au fost sterse in MySQL</h4>';
	  }
	}
  }

  // Daca e primita cerere pt. sters intreg meniul
  else if (isset($_POST['d_meniu'])) {
    $meniu = str_replace(' ', '_', $_POST['d_meniu']);

    // Preia intr-un array numele tuturor fisierelor si directoarelor aflate in directorul $dir
	$fisiere = scandir($dir);
	// Retine pe cele care apartin meniului
	$file_del = preg_grep("/^$meniu/", $fisiere);

	// Pregateste variabila meniu pt. lucru cu MySQL, aplica functia de filtrare
	$meniu = filtr_sql($meniu);

	// Interogatia SQL pt. stergerea paginilor meniului in MySQL
	$sql = "DELETE FROM `pagini` WHERE `meniu`='$meniu'";
	// Daca datele sunt sterse
	if (mysql_query($sql, $conn)) {
	  echo "<h4>Datele categoriei $meniu au fost sterse in MySQL</h4>";
	  // Sterge si fisierele respective in director
	  // Parcurge matricea cu numele lor si aplica la fiecare unlink() pt. stergere
	  foreach($file_del as $key=>$fisier) {
	    $fisier = $dir.'/'.$fisier;
	    if (unlink($fisier)) echo "<br />Fisierul <b> $fisier </b> a fost sters.";
	  }
	}
  }
}

		/** Part. 4 - Obtine mumele meniurilor, ce trebuie adaugate in formulare **/

$meniuri = get_meniu();		// Apeleaza functia (in admin.php) pt. obtinerea meniurilor

// Defineste o variabila ce va contine numele meniurilor intr-un cod HTML necesar pt. casuta Select in formular
$meniuri_f = '<option> </option>';
// Parcurge matricea din variabila $meniuri si adauga fiecare meniu in cod html
for($i=0; $i<count($meniuri); $i++) {
  $meniuri_f .= '<option>'.$meniuri[$i]."</option> \r\n";
}

@mysql_close($conn);
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
<title>Admin - adaugarea paginilor in site</title>
<meta name="description" content="Admin" />
<meta name="keywords" content="admin" />
<style type="text/css">
body { text-align:center; }
.actiune {
  cursor:pointer;
  font-family:"Calibri", sans-serif;
  font-size:18px;
  text-decoration:underline;
  font-weight:bold;
  color:blue;
}
#f_ad, #f_del {
  display:none;
  width:470px;
  border:1px solid silver;
  margin:10px auto;
  text-align:left;
  padding:5px 8px;
}
</style>

<script type="text/javascript">
// Functia pt. afisarea formularului potrivit de adaugare meniu sau pagina
function chose_ad(hide, show) {
  // Descopera formularul, ascunde elementul ne accesat, arata elementul accesat
  document.getElementById('f_ad').style.display='block';
  document.getElementById(hide).style.display='none';
  document.getElementById(show).style.display='block';

  // Elimina 'disabled' in casuta activata
  // Adauga 'disabled' la casuta de formular neactivata
  document.getElementById(show+'_c').removeAttribute('disabled');
  document.getElementById(hide+'_c').setAttribute('disabled', 'disabled');
}

// Functia pt. afisarea formularului potrivit de stergere intreg meniu sau pagina
function chose_del(nume, val) {
  // Seteaza valorile atributului 'name' si valoarea butonului submit
  document.getElementById('del').setAttribute("name", nume);
  document.getElementById('delet').value = val;
  document.getElementById('f_del').style.display='block';
}
</script>
</head>
<body>

<?php
// Determina afisarea unui formular de logare, daca administratorul nu e autentificat
if (!isset($_SESSION['logat']) || $_SESSION['logat']!=md5($admin.$pass)) {
  echo '<h4><u>Autentificare Admin</u></h4>
    <form action="" method="post">
    Nume: <input type="text" name="nume" /><br />
	Parola: <input type="password" name="parola" /><br />
	<input type="submit" value="Autentificare" />
    </form>';
	exit;
}
?>

<p>
 <span class="actiune" onclick="chose_ad('ad_pg', 'ad_meniu')">Adauga meniu nou</span> - <span class="actiune" onclick="chose_ad('ad_meniu', 'ad_pg')">Adauga pagina noua</span>
</p><br /><br />

<form action="" method="post" name="f_ad" id="f_ad">
 <div id="ad_meniu">Nume meniu: <input type="text" name="n_meniu" id="ad_meniu_c" maxlength="25" /></div>
 <div id="ad_pg">Alege meniul: <select name="meniul" id="ad_pg_c"><?php echo $meniuri_f; ?></select></div>
 Titlu: <input type="text" name="titlu" id="titlu" maxlength="75" /><br />
 Cuvinte cheie: <input type="text" name="cuv_key" id="cuv_key" maxlength="200" /> (<i>separate prin virgula</i>)<br />
 Descriere: <input type="text" name="descriere" id="descriere" maxlength="250" /><br />
 Adauga continutul pentru contextul paginii (poate contine cod HTML)<br />
 <textarea rows="20" cols="55" name="context" id="context"></textarea><br />
 <input type="submit" name="add" id="add" value="Adauga" />
</form><br />

<p>
 <span class="actiune" onclick="chose_del('d_meniu', 'Sterge meniul')">Sterge intreg meniul</span> - <span class="actiune" onclick="chose_del('s_meniu', 'Gaseste paginile')">Sterge pagina</span><br /><br />
</p><br />

<form action="" method="post" name="f_del" id="f_del">
 Alege meniul: <select name="" id="del"><?php echo $meniuri_f; ?></select> &nbsp;
 <input type="submit" name="delet" id="delet" value="" />
</form><br />
 <a href="index.php" title="Pagina principala"><em><b>Pagina principala</b></em></a><br />
</body>
</html>
		
- In partea a treia sunt prezentate ultimile doua fisiere: "index.php" si "grafic.css"

Aici, in a treia parte din acest tutorial sunt prezentate fisierele "index.php" si "grafic.css".
index.php - e fisierul care afiseaza continutul site-ului. In partea de sus a paginilor sunt afisate categoriile, meniurile principale din site. Iar in corpul paginii: in partea stanga e un meniu in care sunt afisate link-urile paginilor corespunzatoare fiecarei categorii si in centru se afiseaza continutul celei accesate.
Acest fisier trebuie creat in directorul root al site-ului (www sau httpdocs). In el sunt 2 categorii distincte de cod: scriptul PHP si codul HTML cu layout-ul site-ului.
Scriptul PHP include la inceput fisierul "admin.php", dupa care sunt definite variabilele cu datele initiale care vor fi incluse in codul HTML, pentru meniuri, nume pagina, titlul, descrierea si cuvintele cheie, apoi, in functie de pagina apelata, aceste date sunt modificate cu cele care apartin paginii respective, si care sunt preluate din MySQL.
O alta treaba pe care trebuie sa o faca scriptul din acest fisier este crearea link-urilor pentru meniuri si pagini. Adauga numele paginilor preluate din tabelul MySQL intr-o matrice, apoi parcurge aceasta matrice si formeaza cate un link cu fiecare nume, avand adresa URL de forma "index.php?p=nume_pagina". Astfel, ca sa stie ce pagina sa fie afisata cand e accesat un link, scriptul verifica valoarea variabilei $_GET['p'], care e numele paginii si care a fost folosit atat in tabelul MySQL cat si la fisierul in care e salvat continutul iei.
Ultima operatie din acest script e definirea meniului cu principalele categorii, care sunt afisate in top-ul paginii. Pentru aceasta se foloseste functia "get_meniu()" din "admin.php", datele returnate de aceasta fiind o matrice cu numele categoriilor. Se parcurge aceasta matrice si fiecare nume e adaugat in cod HTML.
Dupa scriptul PHP urmeaza codul HTML cu template-ul site-ului. Acesta preia variabilele setate in script, pentru titlu, descriere, cuvinte cheie, meniu principal, paginile din meniul curent si numele fisierului in care e continutul ce trebuie afisat. Aceste variabile au nume fixe, oricare ar fi pagina accesata, si datele din ele pot fi afisate cu instructiunea "echo", astfel, puteti modifica oricand template-ul site-ului si sa schimbati locul afisarii acestor elemente dupa cum doriti.
Veti observa ca scriptul complet din acest tutorial nu are si o grafica definita (doar superficial), asta o face fiecare dupa cum vrea, obiectul acestei lectii fiind partea de programare PHP.
Iata si codul complet din "index.php"
- Fisierul index.php

Cod: Selectaţi tot

<?php
// Exemplu creare site cu PHP, de la http://www.marplo.net
// Seteaza optiunea de a afisa orice eroare care apare in executia scriptului
ini_set('display_errors',1);
error_reporting(E_ALL);

// Include fisierul cu datele pt. conectare la MySQL
include('admin.php');

// Creaza variabilele folosite in template-ul paginii
$meniuri_html = '';
$pagini_html = '';
$titlu = 'Titlu pt. pagina principala, index';
$desc = 'Descriere pt. pagina principala, index';
$cuv_key = 'Cuvinte, cheie, pagina, principala, index';

// Daca sunt primite date prin $_GET, cu indice 'p'
if (isset($_GET['p'])) {
  // Adauga valoarea intr-o variabila, eliminand spatii exterioare cu trim()
  // si decodand-o cu urldecode() deoarece acel sir din adresa URL este adaugat cu urlencode()
  $pag = urldecode(trim($_GET['p']));

  // Preia din sir, cu explode(), primul cuvant (cuvinte) dinainte de '-', cu indice [0]
  // deoarece acesta e numele meniului (categoriei), necesar pt. Selectarea din MySQL a paginilor din meniu
  $sir = explode('-', $pag);
  $meniu = $sir[0];

  // Deoarece la adaugarea in tabele, datele au fost filtrate cu functia filtr_sql(), creata in admin
  // Aplica acelasi filtru si variabilelor $pag si $meniu, necesare pt. Select in tabel
  $pag = filtr_sql($pag);
  $meniu = filtr_sql($meniu);

  // Selecteaza din MySQL paginile care apartin categoriei, meniului transmis in adresa URL
  $sql = "SELECT * FROM `pagini` WHERE meniu='$meniu'";
  $result = mysql_query($sql, $conn) or trigger_error(E_USER_ERROR);
  if (mysql_num_rows($result) == 0) {
    echo '0 rezultate';
  }
  else {
    while ($rand = mysql_fetch_assoc($result)) {
      // Preia numele si titlul pagiilor care sunt in meniul accesat
	  // unde numele din coloana pt. pagini e diferit de numele meniului
	  if ($rand['pagina']!=$meniu) {
        // Elimina caracterele "\" care au fost adaugate de "mysql_real_escape_string()"
        $pg_titlu[] = stripslashes($rand['titlu']);
        $pg_nume[] = stripslashes($rand['pagina']);
	  }

	  // Preia numele paginii apelate, titlu, descriere, cuvinte cheie si data
	  // unde randul din tabel are datele paginii accesate
	  if ($rand['pagina']==$pag) {
	    $titlu = stripslashes($rand['titlu']);
	    $desc = stripslashes($rand['descriere']);
	    $cuv_key = stripslashes($rand['cuv_key']);
	    $pagina = stripslashes($rand['pagina']);
	    $data = stripslashes($rand['data']);
	  }
    }
  }
}

$meniuri = get_meniu();		// Apeleaza functia din admin.php pt. obtinerea meniurilor (categoriile) din Top

// Creaza codul HTML cu meniurile
$meniuri_html = '<ul><li><a href="index.php" title="Pagina Principala">Pagina Principala</a> &nbsp; </li>';

// Daca matricea cu meniurile contine cel putin un meniu adaugat
if (count($meniuri)>0 && !empty($meniuri[0])) {
  for($i=0; $i<count($meniuri); $i++) {
    // Cu ucfirst() face prima litera din meniu sa fie Majuscula
    // Cu str_replace inlocuieste '_' din numele meniului cu spatiu
    $n_meniu = ucfirst(str_replace('_', ' ', $meniuri[$i]));
    $meniuri_html .= '<li><a href="index.php?p='.$meniuri[$i].'" title="'.$n_meniu.'">'.$n_meniu.'</a></li>';
  }
}
$meniuri_html .= '</ul>';		// Inchide codul HTML pt. aceste meniuri

// Creaza codul HTML cu paginile din categoria curenta, daca acestea exista, pt. meniul din stanga
if (isset($pg_nume)) {
  $pagini_html = '<ul id="pagini">';
  for($i=0; $i<count($pg_nume); $i++) {
	$pagini_html .= '<li><a href="index.php?p='.$pg_nume[$i].'" title="'.$pg_titlu[$i].'">'.ucfirst($pg_titlu[$i]).'</a></li>';
  }
  $pagini_html .= '</ul>';
}

// Seteaza utilizarea formatului UTF-8 in pagina
header("Content-type: text/html; charset=utf-8");

// In continuare, codul HTML in care se adauga si variabilele necesare generate de PHP
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
 <title><?php echo $titlu; ?></title>
 <meta name="description" content="<?php echo $desc; ?>" />
 <meta name="keywords" content="<?php echo $cuv_key; ?>" />
 <meta name="robots" content="index, follow" />
 <link href="grafic.css" rel="stylesheet" type="text/css" />
</head>
<body>
<!-- Start Top pagina -->
<div id="top">
 <h1>Sectiunea din top-ul paginii</h1>
 <div id="meniu">
<?php echo $meniuri_html; ?>
 </div>
</div>

<!-- Start Corp pagina -->
<div id="corp">
 <!-- Start Meniul cu paginile -->
 <div id="meniu_p">
 <h4>Pagini</h4>
<?php echo $pagini_html; ?>
 </div>

 <!-- Start Context -->
 <div id="context">
<?php
  // Daca e setata o valoare pt. variabila $pagina,
  // Variabila definita prin Selectul din MySQL, si contine numele paginii, pt. adresa ei
  if (isset($pagina)) {
    // Afisaza data la care a fost creata psgina, preluata din MySQL
	echo '<em>'.date('j-F-Y ', $data).'</em><br />';
    // Include fisierul in care e continutul
	readfile('pagini/'.$pagina.$ext);
  }
  else {
    // Daca nu e apelat vreun link din meniu sau poagini
	// Afiseaza continutul dorit pt. pagina "index"
	// Il puteti crea cu 'echo' ori sa-l includeti din alt fisier extern
    echo '<h3>Continut initial pentru pagina index</h3>
	  <h3>Creati cu "echo" tag-urile HTML sau includeti continut din alt fisier extern,<br />
	  cu include("fisier.php") sau readfile("fisier.html")</h3>';
  }
?>
 </div>
</div>

<!-- Start Subsol pagina -->
<div id="subsol">
 <a href="add_del.php" title="Admin"><em><b>Admin</b></em></a>
 <h4>Continutul din subsolul paginii</h4>
 <h4>Va apare in toate paginile site-ului</h4>
</div>

</body>
</html>
		
Ultimul fisier din acest script gen CMS este cel care se ocupa de grafica site-ului. L-am denumit "grafic.css" si contine doar cateva coduri CSS pentru o structura de baza a cadrelor din pagina.
Acest fisier este apelat in sectiunea HEAD a codului HTML din "index.php".
- Fisierul grafic.css

Cod: Selectaţi tot

body {
 margin:0px auto;
 width:1000px;
 background-color:#e8e8fe;
 text-align:center;
}

/* Grafica pentru sectiunea Top */
#top {
 margin:2px auto;
 position:relative;
 border:1px solid #ceceda;
 background-color:#dedeee;
}

/* Grafica pentru sectiunea Corp */
#corp {
 position:relative;
 margin:2px auto;
 width:100%;
 border:1px solid #eeeefe;
 background-color:#ededfe;
 text-align:left;
}

/* Grafica pentru Meniu principal */
#meniu {
 position:relative;
 margin:2px auto;
 border:1px solid #dafedf;
 background-color:#deefee;
 padding-left:5px;
}
#meniu ul {
 margin:0px;
 background-color:#cceede;
 list-style:none;
 padding:0px 0px 1px 5px;
}
#meniu ul li {
 display:inline;
 margin:1px 3px;
 border:1px solid silver;
 padding:3px;
}
#meniu ul li a {
 margin:0px;
 border:1px solid #daccfe;
}
#meniu ul li a:hover {
  background-color:#ebede0;
}

/* Grafica pentru meniul din stanga */
#meniu_p {
 float:left;
 position:relative;
 width:240px;
 border:1px solid green;
 padding:2px
}

/* Grafica pentru Context */
#context {
 min-height:200px;
 margin:0px 1px 1px 260px;
 padding:3px 5px;
}

/* Grafica pentru sectiunea Subsol */
#subsol {
 clear:both;
 position:relative;
 margin:2px auto;
 border:1px solid #ceced8;
 background-color:#ebede0;
 z-index:10;
}
		
Site-ul creat cu acest script poate folosi si afisa caracterele in format UTF-8, iar codul HTML generat este valid XHTML.
Cateva date suplimentare despre modul de utilizare gasiti in fisierul "Citeste.html".
[/b]
Imagine

Înapoi la “Tutoriale PHP”

Cine este conectat

Utilizatori răsfoind acest forum: Niciun utilizator înregistrat și 3 vizitatori