NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!
NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.

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.

Aktivity
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:30.6.2013 16:11

Ahoj, pravidelná týdenní webová minisoutěž o placku a samolepky bude tento týden v jazyce PHP. Napište skript, který vypíše tabulku obrázků ze zadané složky. Obrázky jsou typu jpeg, png nebo gif a každý z nich má i miniaturu, jejíž název končí na _nahled. V tabulce se samozřejmě zobrazí jen tyto náhledy, po kliknutí na náhled se zobrazí velký obrázek. Snažte se o objektovou aplikaci a ideálně využijte známý JavaScriptový doplněk LightBox pro otevírání zvětšenin obrázků.

Deadline jako vždy v neděli 7.7. v 15:00 :)

Odpovědět
30.6.2013 16:11
New kid back on the block with a R.I.P
Avatar
Michal Žůrek - misaz:30.6.2013 16:28

Takto jednoduchou věc jde opravdu udělat i objektově?

 
Nahoru Odpovědět
30.6.2013 16:28
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Michal Žůrek - misaz
David Hartinger:30.6.2013 16:29

Ono by se jinak programovat ani nemělo :)

Nahoru Odpovědět
30.6.2013 16:29
New kid back on the block with a R.I.P
Avatar
Michal Žůrek - misaz:30.6.2013 18:00

Jsou nějaké sample obrázky? Nebo si mám sehnat svoje?

 
Nahoru Odpovědět
30.6.2013 18:00
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:30.6.2013 18:04

Udělej si pár screenshotů a máš obrázků kolik chceš. Hlavně tam nedávej fotky z diskoték, toho je plný FB :)

Nahoru Odpovědět
30.6.2013 18:04
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Michal Žůrek - misaz:30.6.2013 18:13

Tan LightBox nemusí být doufám v PHP nebo jo?

 
Nahoru Odpovědět
30.6.2013 18:13
Avatar
Kit
Tvůrce
Avatar
Odpovídá na Michal Žůrek - misaz
Kit:30.6.2013 18:24

Když ho uděláš v AJAXu, tím lépe. PHP na AJAX nepotřebuješ.

Nahoru Odpovědět
30.6.2013 18:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Artas
Tvůrce
Avatar
Artas:30.6.2013 20:51

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.

 
Nahoru Odpovědět
30.6.2013 20:51
Avatar
Neaktivní uživatel:1.7.2013 18:21

Hehe, lidi tohle je soutěž na PHP, ne kterej komentář bude mít víc <strong style="color: red">mínusek</stron­g> :D

Nahoru Odpovědět
1.7.2013 18:21
Neaktivní uživatelský účet
Avatar
Michal Žůrek - misaz:2.7.2013 16:26

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.

 
Nahoru Odpovědět
2.7.2013 16:26
Avatar
Pavel Vosyka
Člen
Avatar
Pavel Vosyka:3.7.2013 15:20

A co se hodnotí - kód, funkčnost? Nebo má váhu i ten grafický výstup?

Nahoru Odpovědět
3.7.2013 15:20
"nikdy nepiš nic 2x" (updated 10 years after: "Není nic špatného na tom napsat něco 2x")
Avatar
Odpovídá na Pavel Vosyka
Michal Žůrek - misaz:3.7.2013 20:14

hodnotí se všechno.

 
Nahoru Odpovědět
3.7.2013 20:14
Avatar
Milan Gallas
Tvůrce
Avatar
Milan Gallas:3.7.2013 22:22

určitě nejdůležitější je funkčnost programu a krásný objektový kód :D

 
Nahoru Odpovědět
3.7.2013 22:22
Avatar
David Hynek
Tvůrce
Avatar
David Hynek:4.7.2013 18:03

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.

Editováno 4.7.2013 18:05
Nahoru Odpovědět
4.7.2013 18:03
Čím víc vím, tím víc věcí nevím.
Avatar
Milan Gallas
Tvůrce
Avatar
Milan Gallas:6.7.2013 17:23

Tak i já jsem poslal svůj výtvor přikládám foto.

 
Nahoru Odpovědět
6.7.2013 17:23
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:7.7.2013 16:32

Při hodnocení galerií jsem došel k následujícímu pořadí:

  1. Artas (100 bodů, pěkné oddělení logiky a výstupu)
  2. DavidHynek (95 bodů)
  3. Misaz (90 bodů)
  4. Fuulll (85 bodů)

Artase poprosím o adresu x do PM a gratuluji, na ostatní se těším příští týden o webdesignu :)

Nahoru Odpovědět
7.7.2013 16:32
New kid back on the block with a R.I.P
Avatar
Artas
Tvůrce
Avatar
Odpovídá na David Hartinger
Artas:7.7.2013 16:39

Díky moc :-).
Pro ostatní - tady jsou moje zdrojáky: https://www.dropbox.com/…achr_php.zip

 
Nahoru Odpovědět
7.7.2013 16:39
Avatar
David Hynek
Tvůrce
Avatar
David Hynek:7.7.2013 17:26

Uznáváte tu dost jiný způsob programování. Artasovi gratuluji, ale pro placku svůj styl měnit nebudu :)

Editováno 7.7.2013 17:27
Nahoru Odpovědět
7.7.2013 17:26
Čím víc vím, tím víc věcí nevím.
Avatar
CutThroat
Člen
Avatar
Odpovídá na David Hynek
CutThroat:7.7.2013 17:38

To Vám taky nikdo neříká.

 
Nahoru Odpovědět
7.7.2013 17:38
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na David Hynek
David Hartinger:7.7.2013 17:45

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ů.

Nahoru Odpovědět
7.7.2013 17:45
New kid back on the block with a R.I.P
Avatar
David Hynek
Tvůrce
Avatar
Odpovídá na David Hartinger
David Hynek:7.7.2013 17:50

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á...

Editováno 7.7.2013 17:51
Nahoru Odpovědět
7.7.2013 17:50
Čím víc vím, tím víc věcí nevím.
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na David Hynek
David Hartinger:7.7.2013 17:59

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é :)

Nahoru Odpovědět
7.7.2013 17:59
New kid back on the block with a R.I.P
Avatar
Neaktivní uživatel:8.7.2013 8:18

Sakryš, zase jsem to prošvihl. Není nějaký RSS kanál na soutěže, či něco takového? :D 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 :D).

Nahoru Odpovědět
8.7.2013 8:18
Neaktivní uživatelský účet
Avatar
XpellCZ
Člen
Avatar
XpellCZ:11.7.2013 16:42

Proč objektově.OOP v PHP není potřeba a nemá žádnou extra výhodu.:D

Nahoru Odpovědět
11.7.2013 16:42
"Lidé, kteří jsou natolik šílení, aby si mysleli, že mohou změnit svět, to opravdu dokážou."
Avatar
Odpovídá na XpellCZ
Martin Konečný (pavelco1998):11.7.2013 17:57

Asi jsi nedělal žádný větší projekt. :-)

Nahoru Odpovědět
11.7.2013 17:57
Aktuálně připravuji browser RPG, FB stránka - https://www.facebook.com/AlteiraCZ
Avatar
Odpovídá na Neaktivní uživatel
Neaktivní uživatel:31.8.2013 11:41

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š :).

Nahoru Odpovědět
31.8.2013 11:41
Neaktivní uživatelský účet
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 26 zpráv z 26.