• Rezultati Niso Bili Najdeni

6.2 PHP ter ostala koda – možgani aplikacije

6.2.6 Administratorski del

$mr->insert("visitors", $visitor);

$visitor_id = $mr->get_last_insert_id();

$cookie_visitor_data = array("name"=>$_POST['visitor']['name'],

"last_name"=>$_POST['visitor']['last_name'], "address"=>$_POST['visitor']['address'],

"post_no"=>$_POST['visitor']['post_no'], "post"=>$_POST['visitor']['post'],

"tel"=>$_POST['visitor']['tel'], "email"=>$_POST['visitor']['email']);

setcookie("visitor_data", serialize($cookie_visitor_data), time() + 30*24*3600);

$book = $_POST['book'];

$book['project_id'] = $project['project_id'];

$book['visitor_id'] = $visitor_id;

$book['insert_time'] = time();

$mr->insert("books", $book);

Za tem sledi le še to, da shranjeni knjigi dodamo v bazo še izbrane fotografije. Koda je podobna, kot smo jo videli že pri označevanju fotografij, zato je tu ne bomo razlagali.

if (isset($_POST['selected'])) {

foreach ($_POST["selected"] as $image_id_and_filename => $on) {

$image_id_and_filename_exploded = explode("/", $image_id_and_filename);

$photo_id = $image_id_and_filename_exploded[0];

$book_photo = array("book_id" => $book_id, "photo_id" => $photo_id);

$mr->insert("book_photos", $book_photo);

} }

Tako, s tem smo zaključili opis kode za ogled projekta.

lahko ureja detajle projekta in dodaja nove fotografije.

if (!$project) {

// koda za stran za izbiro projekta }

else {

// koda za urejanje projekta }

6.2.6.1 Izbira projekta

Za stran izbire projekta ni veliko kode. Najprej dobimo vse projekte, potem pa za vsak projekt nastavimo deset malih sličic za hiter pregled delne vsebine projekta (ko uporabnik premika miško po prvi sličici projekta, se mu prikazuje teh deset drugih sličic, da lahko hitro vidi vsebino projekta) in poiščemo število izbranih in število vseh fotografij.

Kodo za male sličice bomo izpustili, ostala koda pa sledi.

$projects = $mr->uq("select * from projects order by is_active, create_time desc");

foreach ($projects as &$project) {

$selected_photos_count = $mr->suq("select count(photo_id) as photos_count from photos where project_id = {$project['project_id']} and is_selected = 1");

$project['selected_photos_count'] = $selected_photos_count['photos_count'];

$all_photos_count = $mr->suq("select count(photo_id) as photos_count from photos where project_id = {$project['project_id']}");

$project['all_photos_count'] = $all_photos_count['photos_count'];

}

$cpv['projects'] = $projects;

render($cp, $cpv);

6.2.6.2 AJAX zahtevki

AJAX je kratica, ki je na začetku pomenila asinhron Javascript in XML (Asynchronous JavaScript and XML), ta pomen pa je sčasoma prerasla in postala okrog leta 2005 popularna beseda, ki pomeni osveževanje posameznih delov strani brez osvežitve celotne strani [1].

Lahko se osveži okvirček z aktualnimi novicami, okvirček s športnimi rezultati, lahko poženemo kakšno akcijo v ozadju itd. Vse to se zgodi asinhrono, kar pomeni, da si lahko uporabnik še naprej nemoteno ogleduje stran, v ozadju pa se zgodi zahtevek.

AJAX je pomenilo tehnologijo, kjer je Javascript preko objekta XMLHttpRequest s pomočjo podatkovnega formata XML komuniciral s strežnikom. V tej aplikaciji namesto XML-a uporabljamo JSON (Javascript Object Notation), saj je v Javascriptu veliko bolj preprost za uporabo, pa še lepši je. Mi torej uporabljamo AJAJ, če smo povsem natančni, a bomo kljub temu uporabljali kratico AJAX, saj je bolj poznana.

Gre za štiri različne zahtevke, v oklepaju je napisan parameter, ki sproži to akcijo: brisanje vseh generiranih fotografij (delete_generated_photos), generiranje fotografij (generate_photos), brisanje seznama izbranih fotografij (delete_photos_selection) ter osvežitev aplikacije na zadnjo različico (update_app).

Vsi štirje zahtevki pridejo preko HTTP GET akcije, ki ima za parameter nastavljen zahtevek, ki ga želimo izvesti. Če je uporabljen URL /admin?generate_photos, to ugotovimo s kodo if

(isset($_GET['generate_photos'])), potem pa generiramo fotografije. Koda vseh štirih akcij

// delete_generated_photos

delete_dir("projects/{$project['url_title']}/img-s");

delete_dir("projects/{$project['url_title']}/img-l");

$mr->euq("delete from photos where project_id = {$project['project_id']}");

echo "'okay'";

exit;

// generate_photos

generate_images_if_necessary_imagemagick($project, $mr);

echo "'okay'";

exit;

}

// delete_photos_selection

$mr->euq("update photos set is_selected = 0 where project_id = {$project['project_id']}");

echo "'okay'";

exit;

// update_app

$output_array = array();

$return_value = 0;

exec("svn update 2>&1", $output_array, $return_value);

$response = ($return_value == 0 ? "'okay'" : "'napaka'");

echo $response;

exit;

img-s in img-l sta direktorija v direktoriju projekta, kjer hranimo male in velike fotografije.

Osvežitev različice aplikacije pa naredimo tako, da poženemo program svn update, ki potegne najnovejšo različico aplikacije in jo zamenja z našo.

6.2.6.3 Nastavitve projekta

Vsakemu projektu lahko nastavimo mnogo parametrov, kot npr. velikost pomanjšanih slik, ali se naj na slikah prikazuje vodni tisk, ime projekta itd.

Vsa imena vnosnih polj v obrazu nastavitve imamo določena tako, kot ta primer za polje ime projekta.

<input type="text" name="project[title]" value="" />

Tekst title, ki ga vidimo v kodi, ustreza imenu polja v podatkovni bazi. Tako bomo vse vrednosti dobili v kodi v seznamu $_POST['project'], ki bo z imeni polj ustrezal stolpcem v bazi. To močno poenostavi zadeve.

Vse nove podatke shranimo v seznam $new_project_data.

6.2.6.4 Generiranje foto knjige

Uporabniki imajo možnost ustvarjanja foto knjige. To naredijo tako, da se pri ogledu projekta odločijo (s klikom na povezavo), da bi želeli ustvariti knjigo. Delovanje aplikacije je potem za uporabnika enako kot pri izboru fotografij za končni izdelek (kar običajno počne), le da mora najprej izpolniti nekaj podatkov o tej knjigi, kot npr. kam naj bo knjiga dostavljena, kakšno platnico bo imela itd.

Ko uporabnik shrani izbrane fotografije za knjigo, se knjiga shrani v bazo, to knjigo pa se poveže z izbranimi fotografijami.

$book = $_POST['book'];

$mr->insert("books", $book);

$book_id = $mr->get_last_insert_id();

if (isset($_POST['selected'])) {

foreach ($_POST["selected"] as $image_id_and_filename => $on) {

$image_id_and_filename_exploded = explode("/", $image_id_and_filename);

$photo_id = $image_id_and_filename_exploded[0];

$book_photo = array("book_id" => $book_id, "photo_id" => $photo_id);

$mr->insert("book_photos", $book_photo);

} }

Za tem pride zanimivi del, ko fotograf v administratorskem vmesniku izbere, da želi izvoziti to knjigo. Kode, ki izvozi izbrane fotografije v PDF formatu je veliko, zato bomo prikazali le izbrane dele.

Generiranje PDF dokumenta nam omogoča PHP knjižnjica TCPDF, zato jo je potrebno najprej naložiti.

require_once('_app/classes/tcpdf/config/lang/eng.php');

require_once('_app/classes/tcpdf/tcpdf.php');

Iz baze poberemo podatke o knjigi in fotografijah.

$book = $mr->srq("select * from books where book_id = @book_id@ limit 1", array("@book_id@" => $book_id));

$book['photos'] = $mr->uq("select p.* from book_photos bp inner join photos p using(photo_id) where book_id = {$book['book_id']} order by exif_time, filename");

Za tem pridejo nastavitve knjige: širina belega roba okrog vsake fotografije, odmik od roba dokumenta, razmak med dvema fotografijama ter število pik na inčo printane knjige.

$border_width = 2;

$margin = 20 + 3; // 2 cm + 3mm porezave

$between_images_margin = 20;

$dpi = 300;

Med nastavitve sodi tudi format končne knjige. Poglejmo nastavitev za ležeči A4 format. Ta ima nastavljene dimenzije, poleg tega pa še dva prostora za fotografijo.

$page_formats = array(

"A4-landscape" => array(

"width" => 303, "height" => 216

$page_formats['A4-landscape']['placeholders'] = array(

array(

"x" => 0 + $margin, "y" => 0 + $margin,

"width" => $page_formats['A4-landscape']['width'] / 2 - $margin - $margin / 2, "height" => $page_formats['A4-landscape']['height'] - 2 * $margin

), array(

"x" => $page_formats['A4-landscape']['width'] / 2 + $margin / 2, "y" => 0 + $margin,

"width" => $page_formats['A4-landscape']['width'] / 2 - $margin - $margin / 2, "height" => $page_formats['A4-landscape']['height'] - 2 * $margin

) );

Izbira položaja fotografije na strani je kompleksnejša stvar (ali pa vsaj bolj široka z besedami kode), zato bomo raje prikazali izris fotografije na stran.

$placeholder = $page_format['placeholders'][$i];

$pdf->Rect($page_photos[$i]['inserted_x'] - $border_width, $page_photos[$i]['inserted_y']

- $border_width, $page_photos[$i]['inserted_width'] + 2 * $border_width,

$page_photos[$i]['inserted_height'] + 2 * $border_width, "F", array(), array(255, 255, 255));

$image_number = str_pad(strval(1 + $counter + $i), 4, "0", STR_PAD_LEFT);

resize_photo_with_dpi_and_mm("projects/{$project['url_title']}/orig/{$page_photos[$i]['ori g_filename']}", "{$image_cache_dir}{$image_number}.jpg",

$page_photos[$i]['inserted_width'], $page_photos[$i]['inserted_height'], $dpi);

$pdf->Image("{$image_cache_dir}{$image_number}.jpg", $page_photos[$i]['inserted_x'],

$page_photos[$i]['inserted_y'], $page_photos[$i]['inserted_width'],

$page_photos[$i]['inserted_height'], '', '', '', false, $dpi, '', false, false, 0);

V spremenljivki $pdf imamo objekt iz TCPDF knjižnjice, ki nam daje na voljo mnogo funkcij. Tu uporabljamo Rect, s katero izrišemo velik bel pravokotnik, ki deluje kot obroba fotografije, ter Image, s katero izrišemo fotografijo.

6.2.6.5 Skripta za uvoz izbora v Aperture

Skripta, ki uvozi izbor fotografij v Aperture, je napisana v Apple-ovem skriptnem jeziku Applescript. Skripta najprej požene Aperture, nastavi ime albuma (ime albuma pride iz administratorskega vmesnika in ga vpiše fotograf), da vsem fotografijam v albumu tri zvezdice, nazadnje pa izbranim fotografijam da pet zvezdic. Tako lahko fotograf naredi nov (pametni) album, ki vsebuje le izbrane fotografije.

7 Koda, ki teče na odjemalcu

V tem delu bomo prikazali pomembne in zanimive dele kode, ki teče na odjemalcu (klientu).

To vključuje HTML, CSS ter Javascript kodo.

7.1 Izbor fotografij ter dinamično štetje izbranih