Diskuze: Machr na PHP - Galerie obrázků

PHP PHP Machr na PHP - Galerie obrázků American English version English version

Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

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  +1 30.6.2013 16:11
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Michal Žůrek (misaz):

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

Nahoru Odpovědět  -1 30.6.2013 16:28
Nesnáším {}, proto se jim vyhýbám.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Michal Žůrek (misaz)
David Čápka:

Ono by se jinak programovat ani nemělo :)

Nahoru Odpovědět  -4 30.6.2013 16:29
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Michal Žůrek (misaz):

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

Nahoru Odpovědět  -1 30.6.2013 18:00
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

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

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

Nahoru Odpovědět  -1 30.6.2013 18:13
Nesnáším {}, proto se jim vyhýbám.
Avatar
Kit
Redaktor
Avatar
Odpovídá na Michal Žůrek (misaz)
Kit:

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
Redaktor
Avatar
Artas:

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  +6 30.6.2013 20:51
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Daniel Vítek:

Hehe, lidi tohle je soutěž na PHP, ne kterej komentář bude mít víc mínusek :D

 
Nahoru Odpovědět  -3 1.7.2013 18:21
Avatar
Michal Žůrek (misaz):

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  +1 2.7.2013 16:26
Nesnáším {}, proto se jim vyhýbám.
Avatar
Pavel Vosyka
Člen
Avatar
Pavel Vosyka:

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"
Avatar
Nahoru Odpovědět 3.7.2013 20:14
Nesnáším {}, proto se jim vyhýbám.
Avatar
Milan Gallas
Redaktor
Avatar
Milan Gallas:

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
Redaktor
Avatar
David Hynek:

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  +2 4.7.2013 18:03
Čím víc vím, tím víc věcí nevím.
Avatar
Milan Gallas
Redaktor
Avatar
Milan Gallas:

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 Čápka
Tým ITnetwork
Avatar
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Artas
Redaktor
Avatar
Odpovídá na David Čápka
Artas:

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
Redaktor
Avatar
David Hynek:

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:

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

 
Nahoru Odpovědět  -1 7.7.2013 17:38
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na David Hynek
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Hynek
Redaktor
Avatar
Odpovídá na David Čápka
David Hynek:

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  +1 7.7.2013 17:50
Čím víc vím, tím víc věcí nevím.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na David Hynek
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Radim Sückr
Redaktor
Avatar
Radim Sückr:

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
Avatar
XpellCZ
Člen
Avatar
XpellCZ:

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

Nahoru Odpovědět  -1 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):

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

 
Nahoru Odpovědět 11.7.2013 17:57
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Odpovídá na Radim Sückr
Daniel Vítek:

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