Dedenie v OOP

Na posledných dvoch prednáškach sme si vytvorili triedu User, ktorej objekt slúži na reprezentovanie používateľa – jedného záznamu v tabuľke users v našej databáze. Po zadefinovaní sme si doňho pridali postupne metódu na vytvorenie (konštruktor), na vloženie nového záznamu do databázy a taktiež na zmazanie záznamu z databázy. Všetky tieto metódy, ktoré sme si vytvorili v triede User, sú v podstate použiteľné pre všetky druhy používateľov. Ak by sme mali kategorizovať používateľov podľa stĺpca role (user, admin, owner, customer service), tak by sa tieto metódy mali týkať všetkých záznamov, lebo je jedno, aký je to typ, vytvorenie, vloženie a mazanie je v podstate rovnaké u každého typu.

 

Predstavme si ale situáciu, že by bola v praxi požiadavka na vykonanie nejakej funkcionality, ktorá by sa týkala iba jedného konkrétneho typu používateľa. Mohlo by to byť napríklad mailové upozornenie pre ownera (vlastníka), aby si skontroloval mesačné výkazy (alebo niečo podobné). Túto funkcionalitu by sme samozrejme riešili vytvorením nejakej metódy, ktoré by to všetko vykonala ako treba a následne by sa táto metóda spúšťala zaradom na všetkých používateľoch s tým, že by sme kontrolovali, či sa jedná o typ owner (checkovali by sme hodnotu property role).

 

Jedna vec by ale na tom nebola úplne ideálna a to je to, že by túto metódu mali zadefinované všetky objekty tejto triedy, čiže aj tie, ktoré ju nepotrebujú (iné role ako owner). Aby to bolo ideálne, tak by mal mať každý objekt v sebe iba to (properties a metódy), čo potrebuje. Ako to ale docielime, aby mali iba niektoré typy objektov tejto triedy nadefinované niečo navyše od ostatných?

 

Aj tento problém rieši jedna zo základných vlastností (vymožeností) OOP – dedenie (inheritance). Z bežného života poznáme dedenie ako niečo, čo si prenesieme, resp. čo vlastníme (vieme) vďaka tomu, že to máme po našom rodičovi (po niekom inom). Takto nejako je to aj v OOP, pretože v OOP môžeme vytvoriť objekty, ktoré budú potomkami (deťmi – children) nejakej inej nadradenej (rodičovskej – parent) triedy, resp. ich objektov. Dedenie v tomto prípade znamená, že potomok obsahuje takmer všetky properties a metódy, ktoré sú deklarované v rodičovi.

 

Ako to ale môže vyriešiť náš problém? Veľmi jednoducho. Naša trieda User môže v podstate predstavovať rodičovskú triedu, z ktorej sa bude dediť, pretože obsahuje props (properties) a metódy, ktoré potrebuje každý typ používateľa. My si vytvoríme novú triedu, ktorá bude slúžiť na používateľa typu owner a zadefinujeme, že bude potomkom triedy User, čiže bude dediť všetko z tejto triedy. V tomto momente by medzi objektami týchto dvoch triedy nebol žiadny rozdiel.

 

My si ale do deklarácie tejto triedy okrem zadefinovania, že bude dediť z triedy User, pridáme metódu na odoslanie mailu, ktorú budú mať potomkovia tejto triedy zadefinovanú. Keďže ju zadeklarujeme v triede UserOwner a nie v triede User, potomkovia triedy User (ostatné role okrem ownerov) túto metódu mať zadefinovanú nebudú. Tým zabezpečíme, že potomkovia obidvoch tried budú mať zadefinované iba to, čo skutočne potrebujú. Poďme teda na to.

 

Za deklaráciou triedy (označenie class a meno triedy) sa zadáva slovo extends (rozširíť – akože táto trieda rozširuje ďalšiu), za ktorým nasleduje názov triedy, z ktorej sa dedí – v našom prípade to bude trieda User. Toto je všetko pre zadefinovanie dedičnosti, vďaka tomuto budú mať objekty triedy ktorá dedí všetko k dispozícii z rodičovskej triedy. Deklarácia našej triedy spolu s jej metódou by mohla vyzerať teda takto:

 


index.php (pridaná nová trieda):

class UserOwner extends User{

    function remindOwnerByMail(){
        //kod pre vykonanie funkcie
        print_r('Zavolala sa metoda remindOwnerByMail()');
    }
}

 


Tak ako sme si povedali, slovom extends sme dali najavo, že naša trieda bude potomkom triedy User, takže jej objekty budú obsahovať zadefinované properties a metódy v triede User. Potom sme si zadefinovali metódu pre triedu UserOwner, ktorú budú obsahovať už len objekty tejto triedy. Kód v triede nie je dôležitý (poslanie mailu), ide nám len o to, aby to fungovalo a aby sme si ukázali, ako sa to asi využije.

 

Keď už máme samostatnú triedu pre používateľov role owner, tak na mieste v kóde, kde si dáta z databázy transformujeme na objekty triedy User, musíme kontrolovať, o akú rolu používateľa sa jedná a v prípade role owner nepoužiť triedu User ale triedu UserOwner. Za transformáciou dát z DB na pole objektov si dáme kontrolne vypísať obsah property users, aby ste videli, že skutočne používatelia typu owner sú objektom triedy UserOwner. Malo by to vyzerať asi takto:

 


index.php (zmenený kód v metóde loadData):

...
if (mysqli_num_rows($result) > 0) {
    $data = mysqli_fetch_all($result, MYSQLI_ASSOC);

    //TRANSFORMACIA DAT NA POLE OBJEKTOV
    foreach($data as $key => $value){
        if($value['role'] == 'owner'){
            $this->users[$key] = new UserOwner($value['id'], $value['user_name'], $value['user_surname'], $value['age'], $value['role']);
        }else{
            $this->users[$key] = new User($value['id'], $value['user_name'], $value['user_surname'], $value['age'], $value['role']);
        }
    }

    echo '<pre>';
        print_r($this->users);
    echo '</pre>';
}

 


Ako vidíte v ukážke kódu, jednoduchou podmienkou pri prechádzaní dát z databázy sa pýtame, či sa nejedná o rolu owner. Ak áno, tak vytvárame objekt triedy UserOwner a nie User. Po spustení tohto kódu pekne vidno, že používatelia s rolou owner sú skutočne objektami triedy UserOwner.

 

Aby sme si skutočne dokázali, že sa daná metóda nachádza len v objektoch triedy UserOwner, skúsme si zavolať túto metódu na objekte triedy User za výpisom property Users. Použijeme napríklad index 1 (druhý prvok), ktorý by mal byť objekt triedy User. Po spustení kódu by sa nemalo nič zobraziť. Ak si však zmeníme index na číslo 2 (tretí prvok), čo je objekt triedy UserOwner, po zavolaní tejto metódy sa skutočne zobrazí text, ktorý sme zadali ako hodnotu príkazu print_r v tele tejto metódy (len pre testovanie). Ak máte náhodou iné indexy používateľov, tak si dajte indexy tak, aby ste mali v prvom prípade objekt triedy User (čiže sa nevypíše nič, lebo takú metódu nepozná) a v druhom prípade, aby ste mali objekt triedy UserOwner. V druhom prípade by sa telo metódy malo vykonať, pretože túto metódu tento objekt musí poznať. Mohlo by to vyzerať nejako takto:

 


index.php:


echo '<pre>';
    print_r($this->users);
echo '</pre>';

$this->users[2]->remindOwnerByMail();

 


Niekedy sa však v kóde nachádza množstvo tried, ktoré majú vysoký počet definovaných properties a metód. Je dobré v istých prípadoch pred zavolaním skontrolovať, či daný objekt pozná, resp. má skutočne zadefinovanú property alebo metódu vo svojej triede alebo v triede, z ktorej dedí. Volaním metódy, ktorá neexistuje, vlastne spôsobujeme chybu. Preto existujú funkcie jazyka PHP property_exists (vlastnosť/atribút existuje) a method_exists (metóda existuje), ktoré slúžia na skontrolovanie, či daný objekt obsahuje deklaráciu požadovanej property alebo metódy. Tieto funkcie môžeme využiť v našom prípade, aby sme si dokázali, že objekt triedy User nepozná metódu definovanú v triede UserOwner a opačne, že ju objekt tejto triedy pozná, ale že aj pozná metódy definované v triede User. Mohlo by to vyzerať takto:

 


index.php:


echo '<pre>';
    print_r($this->users);
echo '</pre>';

echo '<br><br>';
echo 'Objekt triedy User method_exists($this->users[1], "remindOwnerByMail") : '.method_exists($this->users[1], "remindOwnerByMail")."<br>";
echo 'Objekt triedy User method_exists($this->users[1], "deleteUser") : '.method_exists($this->users[1], "deleteUser")."<br>";
echo 'Objekt triedy UserOwner method_exists($this->users[2], "remindOwnerByMail") : '.method_exists($this->users[2], "remindOwnerByMail")."<br>";
echo 'Objekt triedy UserOwner method_exists($this->users[2], "deleteUser") : '.method_exists($this->users[2], "deleteUser")."<br>";

 


Ako vidíte na obrazovke po spustení tohto kódu, v prvom prípade nedostaneme žiadnu odpoveď, pretože výsledok funkcie je false, pretože objekt rodičovskej triedy nepozná metódu potomka. Svoju vlastnú (druhý prípad) samozrejme pozná. V prípade objektu triedy UserOwner je kladná odpoveď (1 = True) v obidvoch prípadoch, pozná metódy rodiča aj svoje vlastné.

 

Možnosť dedenia patrí medzi najsilnejšie v OOP, pretože má veľmi široké a efektívne využitie. My sme si síce ukázali len krátky a jednoduchý príklad, ale už aj tam nám musí byť jasné, aký to má význam. Vo väčšine sa používa podobne, ako sme si to skúsili my. Zvyknú sa robiť nadradené triedy, ktoré obsahujú iba to, čo by mali mať všetky prvky nejakej spoločnej vlastnosti (typ dát z DB) a následne sa k nim vytvárajú triedy, ktoré z nich dedia (potomkovia). Tieto triedy potom slúžia len na konkrétny typ dát, ktorý potrebuje mať niečo navyše. Samozrejme, je možné potom vytvoriť triedu, ktorá bude dediť z triedy, ktorá už niečo dedí – akokeby trojúrovňová vrstva. Prvá trieda je hlavná, druhá by dedila z prvej a tretia by dedila z druhej, lenže tým pádom aj z prvej.

Máte nejakú otázku alebo Vám niečo nie je jasné? Napíšte nám na info@zacni-programovat.sk a poradíme!

Obsah súborov projektu po tejto prednáške

1 - footer.php

<div class="footer">
</div>

2 - fotogaleria.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "fotogaleria";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div id="gallery-content" class="main-content right">
<h1>Fotogaléria</h1>
<div class="line"></div>

<?php

$pictures = array();

for($i = 0; $i < 30; $i++){
$pictures[] = 'images/placeholder.jpg';
}

//zadefinovanie maximalneho poctu pre jednu stranku a nacitanie parametra (urcenie aktualnej stranky)
$countPerPage = 12;
if($_GET['page']){
$page = $_GET['page'];
}else{
$page = 1;
}

//vypocet od ktorej po ktoru fotku zobrazujeme galeriu
$start = ($page-1)*$countPerPage;
$end = $page*$countPerPage;

echo '<ul id="gallery">';
for($i = $start; $i < $end; $i++){

if($pictures[$i]){
echo '<li class="left';

if(($i+1)%3){
echo ' photo-margin';
}

echo '">';

echo '<img src="'.$pictures[$i].'">';

echo '<a target="_blank" href="'.$pictures[$i].'" class="over_div">';
echo '<span>Kliknite pre zväčšenie!</span>';
echo '</a>';

echo '</li>';
}
}
echo '</ul>';

//cyklus, ktory nam vypise dostatocny pocet odkazov pre jednotlive stranky
$pageLink = 1;
$photosCount = count($pictures);

echo '<ul class="pagination">';
while($photosCount > 0){

echo '<li><a ';

if($pageLink == $page){
echo ' class="active" ';
}

echo 'href="fotogaleria.php?page='.$pageLink.'">'.$pageLink.'</a>';
echo '</li>';
$photosCount = $photosCount - $countPerPage;
$pageLink++;
}
echo '</ul>';

?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>
</body>
</html>

3 - global.css

BODY{
margin: 0;
background-color: #dee8e7;
font-family: Arial;
}

H1{
color: #5b6b78;
margin-bottom: 10px;
}

.line{
height: 3px;
border-top: 1px dotted #5b6b78;
border-bottom: 1px dotted #5b6b78;
margin-bottom: 25px;
}

.main{
background-color: #f6f7f1;
width: 900px;
margin: auto;
margin-top: 20px;
margin-bottom: 20px;
}

.header{
border-bottom: 1px solid #7d8079;
height: 150px;
}

.header-inner1{
}

.header-inner2{
}

.content{
}

.footer{
border-top: 1px solid #7d8079;
height: 200px;
}

.half-width{
width: 50%;
}

.full-height{
height: 100%;
}

.left{
float: left;
}

.right{
float: right;
}

.clear{
clear: both;
}

/**********MENU***********/
.sidebar{
width: 200px;
height: 400px;
}

.sidebar UL{
list-style-type: none;
padding: 0;
margin: 0;
}

.sidebar UL LI{
position: relative;
}

.sidebar UL LI A, .sidebar UL LI:HOVER .submenu A{
display: block;
padding: 15px 0px 15px 35px;
border-bottom: 1px solid #7d8079;
color: #7d8079;
text-decoration: none;
text-transform: uppercase;
}

.sidebar UL LI A.active{
color: #f5f7f4;
background-color: #f96b81;
}

.sidebar UL LI:HOVER A, .sidebar UL LI .submenu LI:HOVER A{
background-color: #5b6b78;
color: #d6e3e9;
}

.main-content{
width: calc(100% - 241px);
min-height: 700px;
border-left: 1px solid #7d8079;
padding-left: 20px;
padding-right: 20px;
}

.submenu{
display: none;
border: 2px solid #7d8079;
position: absolute;
top: -1px;
left: 201px;
width: 200px;
background-color: #FFFFFF;
}

.sidebar UL LI:HOVER .submenu{
display: block;
}

.sidebar UL LI:HOVER .submenu A{
background-color: #FFFFFF;
}

.main-content{
width: calc(100% - 241px);
min-height: 700px;
border-left: 1px solid #7d8079;
padding-left: 20px;
padding-right: 20px;
}

/**********GALERIA***********/
/**********GALERIA***********/
#gallery{
display: inline-block;
width: 100%;
list-style-type: none;
margin: 0;
padding: 0;
}

#gallery LI{
position: relative;
height: 133px;
margin-bottom: 10px;
}

#gallery LI IMG{
width: 213px;
height: 133px;
}

.photo-margin{
margin-right: 10px;
}

#gallery A{
display: none;
}

#gallery LI:HOVER A{
display: block;
}

#gallery LI:HOVER{
outline: 2px solid #7d8079;
}

#gallery A{
text-decoration: none;
position: absolute;
background-color: grey;
opacity: 0.4;
height: 100%;
width: 100%;
top: 0px;
}

#gallery A SPAN{
position: relative;
top: 100px;
color: #FFFFFF;
font-weight: bold;
}

/**********PERSONS***********/
.persons{
width: 100%;
font-family: Arial;
}

.persons, .persons TH, .persons TD{
border: 1px solid #D9E4E6;
}

.persons TH, .persons TD{
padding: 10px;
}

.persons TH{
background-color: #167F92;
color: #FFFFFF;
font-weight: normal;
text-transform: uppercase;
}

.persons TR:nth-child(odd){
background-color: #D9E4E6;
}

.persons TR{
color: #024457;
background-color: #FFFFFF;
}

.persons TD{
font-size: 14px;
}

.persons TR:HOVER{
color: #f5f7f4;
background-color: #f96b81;
cursor: pointer;
}

.persons TH A.sortable{
color: #FFFFFF;
}

.persons TH A.sortable:HOVER{
color: #D9E4E6;
}

.persons TH A.sortable.asc:before{
content: '⇡ ';
}

.persons TH A.sortable.desc:before{
content: '⇣ ';
}

/**********PERSONS***********/
.contact_form{
padding: 20px;
border: 1px solid #ebebeb;
background-color: white;
font-family: Arial;
font-size: 14px;
color: #455560;
text-transform: uppercase;
text-align: center;
}

.contact_form INPUT, .contact_form TEXTAREA, .contact_form LABEL{
display: block;
width: 100%;
}

.contact_form LABEL{
margin-bottom: 5px;
text-align: left;
}

.contact_form INPUT, .contact_form TEXTAREA{
height: 30px;
border: 1px solid #bababa;
margin-bottom: 30px;
}

.contact_form TEXTAREA{
min-height: 100px;
min-width: 100%;
max-width: 100%;
}

.contact_form INPUT[type="submit"]{
display: inline;
width: 200px;
height: 40px;
background-color: #7bc143;
border: 1px solid #6fae3c;
font-size: 16px;
color: #FFFFFF;
text-transform: uppercase;
}

.contact_form INPUT[type="submit"]:HOVER{
cursor: pointer;
background-color: #42aa44;
}

.success, .error{
border: 1px solid;
margin: 10px 0px;
padding:15px 10px 15px 10px;
}

.success {
color: #4F8A10;
background-color: #DFF2BF;
}

.error {
color: #D8000C;
background-color: #FFBABA;
}
/**********PAGINATION***********/
#gallery-content{
text-align: center;
}

ul.pagination {
display: inline-block;
padding: 0;
margin: 10px 0px 20px 0px;
}

ul.pagination li {
display: inline;
}

ul.pagination li a {
color: black;
padding: 8px 16px;
text-decoration: none;
border: 1px solid #ddd;
}

ul.pagination li a.active {
background-color: #4CAF50;
color: white;
}

ul.pagination li a:hover{
background-color: #ddd;
}

.map{
margin: 30px 0px;
text-align: center;
padding: 25px 0px;
background-color: #FFFFFF;
}

4 - header.php

<div class="header">
<div class="header-inner1 full-height half-width left"></div>
<div class="header-inner2 full-height half-width left"></div>
</div>

5 - index.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "index";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>Domov</h1>
<div class="line"></div>

<h2>Pridanie nového používateľa</h2>

<?php

//TRIEDA DATABAZA (pripojenie)
class Database{

public $server_name = '';
public $login_name = '';
public $login_password = '';
public $db_name = '';
public $connection = null;

function __construct($server_name, $login_name, $login_password, $db_name){
$this->server_name = $server_name;
$this->login_name = $login_name;
$this->login_password = $login_password;
$this->db_name = $db_name;
}

function connectToDb(){
$this->connection = mysqli_connect($this->server_name, $this->login_name, $this->login_password, $this->db_name);

if (!$this->connection) {
echo 'Spojenie s databázou sa nepodarilo nadviazať.';
}else{
// echo 'Spojenie s databázou sa podarilo úspešne nadviazať.';
}
}
}

//TRIEDA USER (pouzivatel v tabulke users)
class User{

public $id = 0;
public $user_name = '';
public $user_surname = '';
public $age = 0;
public $role = '';

function __construct($id, $user_name, $user_surname, $age, $role){
$this->id = $id;
$this->user_name = $user_name;
$this->user_surname = $user_surname;
$this->age = $age;
$this->role = $role;
}

function deleteUser($db_connection){
$sql_query = "DELETE FROM users WHERE id=".$this->id;
return mysqli_query($db_connection, $sql_query);
}

function insertToDb($db_connection){

$sql_query = "INSERT INTO users (user_name, user_surname, age, role) VALUES (";
//otestovanie ci prisli parametre, inak vkladame NULL
if($this->user_name){
$sql_query .= "'".$this->user_name."',";
}else{
$sql_query .= "NULL,";
}

$sql_query .= "'".$this->user_surname."',";

if($this->age){
$sql_query .= $this->age.",";
}else{
$sql_query .= "NULL,";
}

if($this->role){
$sql_query .= "'".$this->role."')";
}else{
$sql_query .= "NULL)";
}

return mysqli_query($db_connection, $sql_query);
}
}

class UserOwner extends User{

function remindOwnerByMail(){
//kod pre vykonanie funkcie
print_r('Zavolala sa metoda remindOwnerByMail()');
}
}

//TRIEDA USERLIST (zoznam pouzivatelov)
class UserList{

public $users = array();
public $search_keyword = '';
public $sort_by = 'id';
public $sort_type = 'ASC';

function loadData($db_connection){
$sql_query = "SELECT * FROM users";

if($this->search_keyword){
$sql_query .= " WHERE user_name LIKE '%".$this->search_keyword."%' OR user_surname LIKE '%".$this->search_keyword."%'";
}

if($this->sort_by){
$sql_query .= " ORDER BY ".$this->sort_by;

if($this->sort_type){
$sql_query .= " ".$this->sort_type;
}else{
$sql_query .= " ASC";
}
}

$result = mysqli_query($db_connection, $sql_query);

if (mysqli_num_rows($result) > 0) {
$data = mysqli_fetch_all($result, MYSQLI_ASSOC);

//TRANSFORMACIA DAT NA POLE OBJEKTOV
foreach($data as $key => $value){
if($value['role'] == 'owner'){
$this->users[$key] = new UserOwner($value['id'], $value['user_name'], $value['user_surname'], $value['age'], $value['role']);
}else{
$this->users[$key] = new User($value['id'], $value['user_name'], $value['user_surname'], $value['age'], $value['role']);
}
}

echo '<pre>';
print_r($this->users);
echo '</pre>';

echo '<br><br>';
echo 'Objekt triedy User method_exists($this->users[1], "remindOwnerByMail") : '.method_exists($this->users[1], "remindOwnerByMail")."<br>";
echo 'Objekt triedy User method_exists($this->users[1], "deleteUser") : '.method_exists($this->users[1], "deleteUser")."<br>";
echo 'Objekt triedy UserOwner method_exists($this->users[2], "remindOwnerByMail") : '.method_exists($this->users[2], "remindOwnerByMail")."<br>";
echo 'Objekt triedy UserOwner method_exists($this->users[2], "deleteUser") : '.method_exists($this->users[2], "deleteUser")."<br>";
}

}

function deleteUserById($id_user, $db_connection){
$actual_user = null;
$actual_user_key = null;

foreach($this->users as $key => $value){
if($value->id == $id_user){
$actual_user = $value;
$actual_user_key = $key;
}
}

if($actual_user->deleteUser($db_connection)){
array_splice($this->users, $actual_user_key, 1);

return true;
}else{
return false;
}
}
}

//PRIPOJENIE DO DB
$db = new Database('localhost', 'root', 'root', 'zapr_db_1');
$db->connectToDb();

//ZACHYTENIE PARAMETROV

if($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['user_form']){
$user_name = $_POST['user_name'];
$user_surname = $_POST['user_surname'];
$age = $_POST['age'];
$role = $_POST['role'];

if(preg_match('#^.{0,50}$#', $user_name) &&
preg_match('#^.{1,50}$#', $user_surname) &&
preg_match('#^.{0,20}$#', $role) &&
preg_match('#^[0-9]{0,3}$#', $age)){

//KOREKTNE DATA
$new_user = new User(null, $user_name, $user_surname, $age, $role);

if($new_user->insertToDb($db->connection)){
echo '<p class="success">Položka bola úspešne uložená.</p>';
}else{
echo '<p class="error">Pri ukladaní dát do databzy sa vyskytla chyba.</p>';
}

//vycistenie poloziek
$user_name = '';
$user_surname = '';
$age = '';
$role = '';

}else{
//CHYBNE DATA

echo '<p class="error">Nová položka nebola uložená - nesprávne vyplnené dáta vo formulári. </p>';
}

}
?>

<!-- Formular pre vlozenie noveho usera -->
<form class="contact_form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post">
<label for="user_name">Meno</label>
<input type="text" name="user_name" id="user_name" value="<?php echo $user_name;?>">

<label for="user_surname">Priezvisko</label>
<input type="text" name="user_surname" id="user_surname" value="<?php echo $user_surname;?>">

<label for="age">Vek</label>
<input type="text" name="age" id="age" value="<?php echo $age;?>">

<label for="role">Rola</label>
<input type="text" name="role" id="role" value="<?php echo $role;?>">

<input type="submit" name="user_form" value="Odoslať">
</form>

<?php

$user_list = new UserList();

//SPRACOVANIE FILTROVANIA
if($_SERVER['REQUEST_METHOD'] == 'GET' && $_GET['search_form']){
$user_list->search_keyword = $_GET['search_keyword'];
}

//ZACHYTENIE PARAMETRA PRE TRIEDENIE DAT V TABULKE
$user_list->sort_by = $_GET['sort_by'];
$user_list->sort_type = $_GET['sort_type'];

$user_list->loadData($db->connection);

//MAZANIE POLOZKY
$id_user = $_GET['id_user'];
if($id_user){

$result = $user_list->deleteUserById($id_user, $db->connection);

if($result){
echo '<p class="success">Položka bola úspešne zmazaná.</p>';
}else{
echo '<p class="error">Pri mazaní položky sa vyskytla chyba.</p>';
}
}

echo '<h2>Zoznam používateľov</h2>';

?>

<!-- Formular na filtrovanie usera -->
<form class="contact_form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="get">
<label for="search_keyword">Meno</label>
<input type="text" name="search_keyword" id="search_keyword" value="<?php echo $user_list->search_keyword;?>">

<input type="hidden" name="sort_by" value="<?php echo $user_list->sort_by;?>">
<input type="hidden" name="sort_type" value="<?php echo $user_list->sort_type;?>">

<input type="submit" name="search_form" value="Filtruj">
</form>

<br>


<?php
//VYPIS POUZIVATELOV DO TABULKY
if($user_list->users){

echo '<table class="persons">';
echo '<tr>';
echo '<th>ID</th>';

echo '<th><a class="sortable';

if($user_list->sort_by == 'user_name'){
if($user_list->sort_type == 'ASC'){
echo ' asc';
}else{
echo ' desc';
}
}

echo '" href="index.php?sort_by=user_name';

if($user_list->sort_by == 'user_name'){
if($user_list->sort_type == 'ASC'){
echo '&sort_type=DESC';
}else{
echo '&sort_type=ASC';
}
}else{
echo '&sort_type=ASC';
}

if($user_list->search_keyword){
echo '&search_keyword='.$user_list->search_keyword.'&search_form=Filtruj';
}

echo '">Meno</a></th>';

echo '<th><a class="sortable';

if($user_list->sort_by == 'user_surname'){
if($user_list->sort_type == 'ASC'){
echo ' asc';
}else{
echo ' desc';
}
}

echo '" href="index.php?sort_by=user_surname';

if($user_list->sort_by == 'user_surname'){
if($user_list->sort_type == 'ASC'){
echo '&sort_type=DESC';
}else{
echo '&sort_type=ASC';
}
}else{
echo '&sort_type=ASC';
}

if($user_list->search_keyword){
echo '&search_keyword='.$user_list->search_keyword.'&search_form=Filtruj';
}

echo '">Priezvisko</a></th>';

echo '<th>Vek</th>';
echo '<th>Rola</th>';
echo '<th>Akcie</th>';
echo '</tr>';

for($i=0; $i<count($user_list->users); $i++){
echo '<tr>';
foreach($user_list->users[$i] as $index => $value){
echo '<td>'.$value.'</td>';
}

echo '<td>';
echo '<a href="uprava-zaznamu.php?id_user='.$user_list->users[$i]->id.'">Upraviť záznam</a><br><br>';
echo '<a href="index.php?id_user='.$user_list->users[$i]->id.'" onclick="return showConfirm()">Vymazať záznam</a>';
echo '</td>';

echo '</tr>';
}

echo '</table>';

} else {
echo "0 results were selected.";
}

echo '<br><br>';

mysqli_close($db->connection);
?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>

<script>
function showConfirm(){
var answer = confirm("Naozaj chcete vymazať daný záznam?");

if(answer){
//vykonanie, ak pouzivatel potvrdi confirm okno - odkaz sa vykona
return true;
}else{
//vykonanie, ak pouzivatel zruzi confirm okno - odkaz sa nevykona
return false;
}
}
</script>

</body>
</html>

6 - kontakt.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "kontakt";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>Kontakt</h1>
<div class="line"></div>

<?php
if($_SERVER['REQUEST_METHOD'] == 'POST' && $_POST['contact_form']){
if(!preg_match('#^[a-zA-Z0-9]{5,10}$#', $_POST['name']) || !filter_var($_POST['email'], FILTER_VALIDATE_EMAIL)){
echo '<p class="error">Zadajte prosim korektne udaje</p>';

//naplnenie formulara
$name = $_POST['name'];
$email = $_POST['email'];
$subject = $_POST['subject'];
$message = $_POST['message'];
}else{
//odoslanie emailu
echo '<p class="success">Vasa sprava bola uspesne odoslana.</p>';

$name = '';
$email = '';
$subject = '';
$message = '';
}

}

?>

<form action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="post" class="contact_form">
<label for="email">Meno a priezvisko</label>
<input type="text" name="name" id="name" value="<?php echo $name;?>"><br><br>

<label for="email">Email</label>
<input type="text" name="email" id="email" value="<?php echo $email;?>"><br><br>

<label for="subject">Predmet</label>
<input type="text" name="subject" id="subject" value="<?php echo $subject;?>"><br><br>

<label for="message">Správa</label>
<textarea name="message" id="message" placeholder="Zadajte text spravy..."><?php echo $message;?></textarea><br><br>

<input type="submit" name="contact_form" value="Odoslat">
</form>

<div class="map">
<iframe src="https://www.google.com/maps/embed?pb=!1m18!1m12!1m3!1d84199.38373426767!2d19.06093170408453!3d48.73928892777478!2m3!1f0!2f0!3f0!3m2!1i1024!2i768!4f13.1!3m3!1m2!1s0x47153de36e8ad42f%3A0xf8223f8a0b8b9032!2sBansk%C3%A1+Bystrica!5e0!3m2!1ssk!2ssk!4v1465151393672" width="600" height="450" frameborder="0" style="border:0" allowfullscreen></iframe>
</div>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>
</body>
</html>

7 - menu.php

<div class="sidebar left">
<ul>
<li><a class="<?php if($actual_page == "index"){echo 'active';}?>" href="index.php">Domov</a></li>
<li><a class="<?php if($actual_page == "o-nas"){echo 'active';}?>" href="o-nas.php">O nás</a></li>
<li><a class="<?php if($actual_page == "fotogaleria"){echo 'active';}?>" href="fotogaleria.php">Fotogaléria</a></li>
<li>
<a class="<?php if($actual_page == "kontakt"){echo 'active';}?>" href="kontakt.php">Kontakt</a>

<ul class="submenu">
<li><a href="kontakt.php">Kontakt</a></li>
<li><a href="kontakt.php">Kontakt</a></li>
</ul>

</li>
</ul>
</div>

8 - o-nas.php

<!DOCTYPE html>

<html lang="sk">
<head>
<title>Vitajte na našej prvej skutočnej webstránke!</title>

<meta charset=“UTF-8“>
<meta name="description" content="Ponúkame vám lekcie jazykov HTML, CSS, PHP a mnoho ďalších užitočných rád pri programovaní">
<meta name="keywords" content="programovanie, html, css, php, webstranka, web, tvorba webu, web developer, ucenie programovania, ako programovat">

<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<?php $actual_page = "o-nas";?>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>O nás</h1>
<div class="line"></div>

<?php
$person_1 = array('Raťafák', 'Plachta', 'plachtos@mail.sk','0903 123 123');
$person_2 = array('Od kuka', 'do kuka', 'kuko@mail.sk','0903 123 123');
$person_3 = array('Joey', 'Tribbiani', 'ako.sa.mas@mail.sk','0903 123 123');
$person_4 = array('Charlie', 'Harper', 'hooker@mail.sk','0903 123 123');
$person_5 = array('Chruno', 'Moysey', 'abstinent@mail.sk','0903 123 123');

$pole = array($person_1, $person_2, $person_3, $person_4, $person_5);

$pole[5] = array('Jardo', 'Jágr', 'legenda@mail.sk','0903 123 123');

echo '<table class="persons">';
echo '<tr>';
echo '<th>Meno</th>';
echo '<th>Priezvisko</th>';
echo '<th>Email</th>';
echo '<th>Telefónne číslo</th>';
echo '</tr>';

for($i=0; $i<count($pole); $i++){
echo '<tr>';

for($j=0; $j<count($pole[$i]); $j++){
echo '<td>'.$pole[$i][$j].'</td>';
}

echo '</tr>';
}

echo '</table>';

?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>
</div>
</body>
</html>

9 - uprava-zaznamu.php

<!DOCTYPE html>

<html lang="sk">
<head>
<link rel="stylesheet" type="text/css" href="global.css">
</head>

<body>
<div class="main">

<?php include "header.php";?>

<div class="content">

<?php include "menu.php";?>

<div class="main-content right">
<h1>Editácia používateľa</h1>
<div class="line"></div>

<?php
$id_user = $_GET['id_user'];

//PRIPOJENIE DO DB
$server_name = "localhost";
$db_user_name = "root";
$password = "root";
$dbname = "zapr_db_1";

$connection = mysqli_connect($server_name, $db_user_name, $password, $dbname);

if (!$connection) {
echo '<p class="error">Spojenie s databázou sa nepodarilo nadviazať.</p>';
}

//SPRACOVANIE ODOSLANIA FORMULARA
if($_SERVER['REQUEST_METHOD'] == 'GET' && $_GET['edit_user_form']){
$user_name = $_GET['user_name'];
$user_surname = $_GET['user_surname'];
$age = $_GET['age'];
$role = $_GET['role'];

if(preg_match('#^.{0,50}$#', $user_name) &&
preg_match('#^.{1,50}$#', $user_surname) &&
preg_match('#^.{0,20}$#', $role) &&
preg_match('#^[0-9]{0,3}$#', $age)){

//KOREKTNE DATA

//ulozenie do DB
$sql_query = "UPDATE users SET user_name=";

//otestovanie ci prisli parametre, inak vkladame NULL
if($user_name){
$sql_query .= "'".$user_name."',";
}else{
$sql_query .= "NULL,";
}

$sql_query .= "user_surname='".$user_surname."',age=";

if($age){
$sql_query .= $age.",";
}else{
$sql_query .= "NULL,";
}

$sql_query .= "role=";

if($role){
$sql_query .= "'".$role."'";
}else{
$sql_query .= "NULL";
}

$sql_query .= " WHERE id=".$id_user.";";

$result = mysqli_query($connection, $sql_query);

if($result){
echo '<p class="success">Položka bola úspešne uložená.</p>';
?>

<script>
window.location.href = "/MyProject Coding/5-Projekt2/index.php";
</script>

<?php
}else{
echo '<p class="error">Pri ukladaní dát do databázy sa vyskytla chyba.</p>';
}


}else{
//CHYBNE DATA
echo '<p class="error">Položka nebola uložená - nesprávne vyplnené dáta vo formulári. </p>';
}
}

//NACITANIE DAT O USEROVI
if($id_user){
$sql_query = "SELECT * FROM users WHERE id=".$id_user.";";

$result = mysqli_query($connection, $sql_query);

if (mysqli_num_rows($result) > 0) {

$data = mysqli_fetch_all($result, MYSQLI_ASSOC);
$user_name = $data[0]['user_name'];
$user_surname = $data[0]['user_surname'];
$age = $data[0]['age'];
$role = $data[0]['role'];


?>

<!-- Formular pre editovanie usera -->
<form class="contact_form" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="get">
<label for="user_name">Meno</label>
<input type="text" name="user_name" id="user_name" value="<?php echo $user_name;?>">

<label for="user_surname">Priezvisko</label>
<input type="text" name="user_surname" id="user_surname" value="<?php echo $user_surname;?>">

<label for="age">Vek</label>
<input type="text" name="age" id="age" value="<?php echo $age;?>">

<label for="role">Rola</label>
<input type="text" name="role" id="role" value="<?php echo $role;?>">

<input type="hidden" name="id_user" value="<?php echo $id_user;?>">

<input type="submit" name="edit_user_form" value="Odoslať">
</form>

<?php


}else{
echo '<p class="error">Nepodarilo sa načítať dáta pre editovanie.</p>';
}


}else{
echo '<p class="error">Parameter používateľa pre editáciu sa nepodarilo načítať.</p>';
}

?>
</div>

<div class="clear"></div>
</div>

<?php include "footer.php";?>

</div>

</body>
</html>

Ťažko sa vám učí samému?

Máte problémy s niektorými časťami alebo sa neviete učiť sám? Využite našu možnosť individuálnej asistencie:

  • samostatný prístup
  • vysvetlenie nejasností prebraného učiva
  • úlohy a cvičenia navyše
  • všetko z pohodlia domova cez mail a skype

Pre viac info kliknite tu

Kľúčové slová prednášky

dedenieoop dedeniededenie v oopinheritanceextendsphp extendsphp dedenieobjek dedenietrieda dediphp trieda dedenie

IT ftip

Počítačového maniaka zrazí auto. On sa postaví a povie: "Nevadí, mám ešte dva životy."