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.
Zobrazeno 26 zpráv z 26.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
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
).
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.
