Diskuze: Machr na PHP - Galerie obrázků
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Vlastník
Zobrazeno 26 zpráv z 26.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.
Takto jednoduchou věc jde opravdu udělat i objektově?
Ono by se jinak programovat ani nemělo
Jsou nějaké sample obrázky? Nebo si mám sehnat svoje?
Udělej si pár screenshotů a máš obrázků kolik chceš. Hlavně tam nedávej fotky z diskoték, toho je plný FB
Tan LightBox nemusí být doufám v PHP nebo jo?
Když ho uděláš v AJAXu, tím lépe. PHP na AJAX nepotřebuješ.
Ahojte, tady je můj výtvor. http://stebravaclav.g6.cz/…ok/index.php Kód dodám později. Reklamy si nevšímejte, obrázky jsou nakopírované ty co byly jako ukázkové v LightBoxu.
Hehe, lidi tohle je soutěž na PHP, ne kterej komentář bude mít víc <strong style="color: red">mínusek</strong>
Ahoj tak i já zde přidávám svůj výtvor http://uloz.to/…inal-1-1-zip . Pokud chcete falerii změnit jméno, tak ji do url připište:
?name=Váš název galerie
pokud chcete změnit složku s obrázky, tak do url připište:
?folder=složka s obrázky a náhledy
pokud to chcete kombinovat tak u druhého místo otazníku dejte &:
?name=Váš název galerie&folder=složka s obrázky a náhledy
U názvu i složky se html znak převádějí na entity, takže by se mělo zabránit php injection.
A co se hodnotí - kód, funkčnost? Nebo má váhu i ten grafický výstup?
určitě nejdůležitější je funkčnost programu a krásný objektový kód
Tak sem přidám, taky svůj kousek.
http://davidhynek.cz/galerie/ příklad toho jak to vypadá.
ale kód je poněkud složitější, tedy ne pro uživatele, ale na vysvětlení zde. Je to psané v OOP, ale určitě by to šlo napsat slušněji, ale vzhledem k tomu, že v OOP jsem zelenáč, je to tak jak to je.
Není to kompletní, protože je tam potřeba dodělat ještě spoustu ochranných prvků.
Podstata je taková, že tento script se nahraje na sever do adresáře, "Galerie", a pak se v tom adresáři vytvoří podadresář s fotogalerii třeba "příroda", při spuštění scriptu se dá jako startovací parametr název této galerie a ta už ověří, zda již k této galerii jsou vytvořená náhledy a soubor s databází obrázků. Když to nenalezne, vytvoří se náhledy a údaje o obrázcích se pak zaznamenají do souboru databáze. Při dalším spuštění se už pracuje jen s údaji v databázi (použil jsem sqlite), takže je to rychlé. Zkuste to a uvidíte
Kód použití v index.php:
<?php
header('Content-type: text/html; charset=utf-8');
date_default_timezone_set('Europe/Prague');
mb_internal_encoding("UTF-8");
include("galerie.php");
$gal = New Galerie("priroda");
?>
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<script src="http://code.jquery.com/jquery-1.10.1.min.js"></script>
<script type="text/javascript" charset="UTF-8" src="lightbox/js/jquery.lightbox-0.5.js"></script>
<link rel="stylesheet" type="text/css" href="lightbox/css/lightbox.css" media="screen" />
<link rel="stylesheet" type="text/css" href="lightbox/css/galerie.css" media="screen" />
<title>Galerie</title>
</head>
<body>
<h1>Fotogalerie:</h1>
<?php echo $gal;?>
</body>
</html>
a pak sama kouzelná třída:
class Galerie
{
public $obrazky;
private $nazev;
private $nazev_db;
private $db;
private $start;
private $n_obrazku = 0;
private $n_data = 0;
private $limit = 20000000; //limit zpracovani objemu dat !! DULEZITE
private $stav = 0;
function __construct($nazev)
{
$this->nazev = $nazev;
$this->start = microtime(true);
if(@scandir($nazev))
{
if(@count(scandir($nazev))>2)
{
$this->stav = 1;
$this->obrazky = "";
$this->nazev_db = "$nazev/obrazky.dtb";
if(file_exists($this->nazev_db))
{
$this->db = sqlite_open($this->nazev_db);
$this->nacti_obrazky();
sqlite_close($this->db);
}
else
{
$this->db = sqlite_open($this->nazev_db);
sqlite_exec($this->db, "create table obrazky (id integer not null unique primary key, jmeno varchar(255),koncovka varchar(5), typ varchar(10))");
$this->vytvor_nahledy();
$this->nacti_obrazky();
sqlite_close($this->db);
}
}
else $this->stav = 2;
}
}
function __destruct()
{
if($this->n_obrazku > 0) echo "<br /><p>Délka scriptu: ".round(microtime(true) - $this->start,4)."s. Zpracováno {$this->n_obrazku} obrázků. Celkem zpracováno: ".round($this->n_data/1000000,2)."Mb dat.</strong></p>";
}
function __toString()
{
if($this->stav == 1) return "<div id='galerie'>\n".$this->obrazky."\n</div>";
if($this->stav == 0) return "<div id='galerie'>\n<p class='chyba'>Galerie s názvem {$this->nazev}, nebyle nalezena!</p>\n</div>";
if($this->stav == 2) return "<div id='galerie'>\n<p class='chyba'>Galerie s názvem {$this->nazev}, je prázná!</p>\n</div>";
}
function vytvor_nahledy()
{
foreach (glob($this->nazev.'/*',GLOB_BRACE) as $n)
{
if($this->n_data<$this->limit)
{
list($w, $h, $t, $a,$d) = getimagesize($n);
if(in_array($t,array(1,2,3)))
{
$f = mb_convert_encoding($n,"UTF-8","ISO-8859-2");
$koncovka = preg_replace("~^.*\.([^\.]+)$~","$1",$f);
$jmeno = preg_replace("~^.*\/(.+)\.[^\.]+$~","$1",$f);
if(sqlite_exec($this->db, "insert into obrazky (jmeno,koncovka,typ) values('{$jmeno}','{$koncovka}','{$t}')"))
{
$this->n_obrazku++;
$this->n_data += filesize($n);
if ($w > $h)
{
$a = ($w-$h)/2;
$b = 0;
$w = $h;
}
elseif ($h > $w)
{
$a = 0;
$b = ($h-$w)/2;
$h = $w;
}
else
{
$a = 0;
$b = 0;
}
$jmeno = mb_convert_encoding($jmeno,"ISO-8859-2","UTF-8");
if($t == 2)
{
$nacteny_obrazek = Imagecreatefromjpeg($n);
$novy_obrazek = ImageCreateTrueColor(150, 150);
ImageCopyResampled($novy_obrazek, $nacteny_obrazek, 0, 0, $a, $b, 150, 150, $w, $h);
Imagejpeg($novy_obrazek, $this->nazev."/".$jmeno."_nahled.".$koncovka, 90);
}
if($t == 3)
{
$nacteny_obrazek = Imagecreatefrompng($n);
$novy_obrazek = ImageCreateTrueColor(150, 150);
ImageCopyResampled($novy_obrazek, $nacteny_obrazek, 0, 0, $a, $b, 150, 150, $w, $h);
Imagepng($novy_obrazek, $this->nazev."/".$jmeno."_nahled.".$koncovka);
}
if($t == 1)
{
$nacteny_obrazek = Imagecreatefromgif($n);
$novy_obrazek = ImageCreateTrueColor(150, 150);
ImageCopyResampled($novy_obrazek, $nacteny_obrazek, 0, 0, $a, $b, 150, 150, $w, $h);
Imagegif($novy_obrazek, $this->nazev."/".$jmeno."_nahled.".$koncovka);
}
}
}
}
}
}
function nacti_obrazky()
{
$data = sqlite_array_query($this->db,"select * from obrazky");
foreach($data as $r)
{
$jmeno = mb_convert_encoding($r['jmeno'],"ISO-8859-2","UTF-8");
if(!file_exists($this->nazev."/{$jmeno}.".$r['koncovka']))
{
sqlite_exec($this->db,"delete from obrazky where id='{$r['id']}'");
if(file_exists($this->nazev."/{$jmeno}_nahled.".$r['koncovka'])) unlink($this->nazev."/{$jmeno}_nahled.".$r['koncovka']);
}
else
{
$this->obrazky .= "\t<a href='{$this->nazev}/{$r['jmeno']}. {$r['koncovka']}' title='{$r['jmeno']}' alt='{$r['jmeno']}.{$r['koncovka']}'><img src='{$this->nazev}/{$r['jmeno']}_nahled.{$r['koncovka']}' /></a>\n";
}
}
}
}
Odkaz na script ke stažení: http://davidhynek.cz/…/galerie.zip
Mám tam nasazený limit 20Mb zpracovaných dat. Limit si tam dejte podle svých možností. U mne na localhostu serveru je to 20Mb za cca 4sekundy.
Díky moc .
Pro ostatní - tady jsou moje zdrojáky: https://www.dropbox.com/…achr_php.zip
Uznáváte tu dost jiný způsob programování. Artasovi gratuluji, ale pro placku svůj styl měnit nebudu
Používat šablony bys určitě měl, echování html kódu se už příliš nepoužívá. Styl programování se s časem mění, jelikož se mění technologie a náročnost projektů.
v pohodě, nejsem uražen nebo dotčen. Šablonu samozřejmě používám, jen mi přišla při této úloze, kdy jde o zápis do jednoho řádku jako zbytečná...
Tady samozřejmě jo, ale když ji někdo použije, tak mu za to dám pár těch bodíků navíc. Měl jsi to pěkné
Sakryš, zase jsem to prošvihl. Není nějaký RSS kanál na soutěže, či něco takového? Na DevBook fórum chodím jednou za pár dní, takže mi to vždycky uteče (o soutěži se dozvím chvíli po deadline ).
Asi jsi nedělal žádný větší projekt.
RSS - http://www.itnetwork.cz/…t/system/rss
Každé pondělí (sem tam až v úterý) je nová soutěž. Deadline je v neděli. Pokud se třeba každé úterý podíváš, tak to neprošvihneš .
Zobrazeno 26 zpráv z 26.