Slevový týden - Květen Office week
Pouze tento týden sleva až 80 % na e-learning týkající se MS Office
30 % bodů zdarma na online výuku díky naší Slevové akci!

Lekce 5 - První objektová komponenta v PHP - Galerie obrázků

V minulé lekci, Zapouzdření v PHP, jsme si vysvětlili zapouzdření.

Na dnešek si vytvoříme galerii obrázků.

Motivace

Často chceme na našich stránkách zobrazit nějakou galerii obrázků, ať již se jedná o fotky z dovolené nebo o screenshoty našeho programu. Psát ručně HTML tabulku s obrázky je poněkud pracné, hlavně když jich je v dané složce hodně. Budeme tedy chtít zautomatizovat výpis obrázků z nějaké složky do přehledné tabulky a nejlépe pomocí objektové komponenty, kterou budeme moci používat vícekrát a třeba i na více webech.

Založení struktury projektu

Vytvoříme si novou složku pro projekt, já jsem ji pojmenoval "galerie". V ní vytvoříme soubor index.php a složku "tridy", ve které vytvoříme soubor Galerie.php. Nakonec vytvoříme složku s obrázky, tu jsem pojmenoval jednoduše "obrazky". Do ní si připravíme několik obrázků, já jsem použil ty výchozí "Ukázky obrázků" z operačního systému Windows. Ke každému obrázku je nutné vytvořit ještě jeho miniaturu (třeba v GIMPu). Mohlo by to za nás dělat PHP při nahrávání obrázků, ale nahrávání již není předmětem tohoto tutoriálu a můžeme ho dodělat někdy jindy. Zvolil jsem si, že miniatura bude široká 160px a její název bude vždy končit na _nahled. Vaše složka by mohla vypadat třeba nějak takto:

Složka s obrázky pro PHP Galerii

Galerie

Máme připravená data a strukturu, pusťme se do programování. Začneme samozřejmě třídou Galerie, jejíž instance bude reprezentovat galerii obrázků. Pojďme si promyslet, jaké atributy bude třída mít.

Atributy

Budeme chtít určit kolik náhledů se má zobrazit v jednom řádku, tedy kolik sloupců bude mít tabulka s obrázky. Dále budeme chtít samozřejmě uchovávat cestu ke složce s obrázky. Ani jeden atribut není důvod zpřístupňovat zvenčí, stačí, když si je necháme zadat v konstruktoru.

Kód třídy s těmito atributy a konstruktorem bude vypadat následovně:

class Galerie
{

    private $slozka;
    private $sloupcu;

    public function __construct($slozka, $sloupcu)
    {
        $this->slozka = $slozka;
        $this->sloupcu = $sloupcu;
    }

}

Metody

Přejděme k metodám. Jednu ve třídě již samozřejmě máme (konstruktor), přidáme tam 2 další.

Nacti

Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Metoda nacti() prohledá složku a uloží si do paměti náhledy obrázků. K prohledání složky nám PHP nabízí třídu Directory. Vzpomínáte si, jak jsme si říkali, že se v PHP začínají objevovat objekty? Directory je jedním z nich. Bohužel lze instanci vytvořit jen pomocí funkce dir(), no, nic není dokonalé. Na instanci nás zajímají 2 metody:

  • read() - Načte obsah dalšího souboru nebo složky ve složce a vrátí ho jako textový řetězec
  • close() - Ukončí čtení složky

Naše metoda nacti() by mohla vypadat prozatím takto:

public function nacti()
{
    $slozka = dir($this->slozka);

    while ($polozka = $slozka->read())
    {

    }
    $slozka->close();
}

Vytvoříme si instanci Directory a pomocí metody read() čteme postupně složky a soubory v této složce. Metoda vrátí false v případě, že jsme se prokousali až na "konec" složky (za poslední soubor nebo složku). Díky tomu můžeme dát načítání názvu souboru do while cyklu, který skončí ve chvíli, kdy načteme poslední. Název budeme mít uvnitř cyklu dostupný v proměnné $polozka. Možná je trochu nezvyklé, že v podmínce while cyklu provádíme rovnou i přiřazení do proměnné, ale dělá se to tak velmi často.

Každý soubor nyní načítáme 2x (miniatura + originál) a k tomu nám funkce ještě vrátí vždy 2 složky navíc. Jsou to složky s názvem "." a "..", které označují současnou a nadřazenou složku. My budeme chtít zobrazovat jen miniatury, proto do cyklu umístíme podmínku, že nás zajímají pouze soubory, obsahující v názvu "_nahled.". Tyto soubory si uložíme do pole. Jelikož chceme, aby bylo toto pole přístupné pro metodu vypis(), musíme ho přidat třídě jako privátní atribut:

private $soubory = array();

Nyní se přesuňme do těla cyklu while a přidejme název souboru do našeho pole pokaždé, když se jedná o náhled. Použijeme k tomu funkci strpos(), která vrací pozici podřetězce v řětězci. Pokud se v názvu položky vyskytuje od druhého znaku někde text "_nahled.", bude položka přidána do našeho pole. Pokud ne, funkce vrátí false.

if (strpos($polozka, '_nahled.'))
{
    $this->soubory[] = $polozka;
}

*Funkce strpos() vrátí 0 v případě, že řetězec podřetězcem začíná (protože 0 označuje první pozici). V našem případě by se hodnota 0 vyhodnotila jako nepravda a podmínka by neplatila. To je správně, soubor _nahled.jpg by se vázal k obrázku bez názvu a není tedy platný. Pokud bychom však chtěli opodmínkovat kompletně výskyt podřetězce, třeba v jiné aplikaci, používá se k odlišení 0 a hodnoty false operátor !== takto: *

if (strpos($polozka, '_nahled.') !== false)
{
    $this->soubory[] = $polozka;
}

Nyní podmínka neprojde pouze s hodnotou false a projde s hodnotou 0. V našem případě se nám však spíše hodí první varianta.

Vypis

Tu složitější část máme za sebou, přesuňme se nyní k výpisu HTML tabulky, tedy k metodě vypis(). I když by načtení i výpis mohly být v jedné metodě, jedná se o 2 logické úlohy a proto je lepší je rozdělit do 2 metod. Metoda by měla dělat vždy jednu věc a měli bychom ji být schopni popsat bez spojky a. Tedy "Metoda zobraz() zobrazí HTML tabulku s náhledy", nikoli "Metoda zobraz() načte a zobrazí galerii".

Metoda vypis() vyechuje začátek tabulky. Dále proiterujeme cyklem foreach miniatury a ty vyechujeme do buňky tabulky jako tag img. Kolem tagu img samozřejmě uděláme odkaz na originální obrázek. Ten získáme velmi jednoduše, stačí v názvu miniatury nahradit "_nahled." za ".". Nahrazení provedeme funkcí str_replace(). Aby nebyla celá tabulka v jednom řádku, budeme si počítat kolikátý sloupec vypisujeme. Jakmile dosáhneme hodnoty nastavené v atributu $sloupcu, uzavřeme řádek, začneme nový a vynulujeme počítadlo sloupců.

Kód metody vypis() by mohl vypadat nějak takto:

public function vypis()
{
    echo('<table id="galerie"><tr>');
    $sloupec = 0;
    foreach ($this->soubory as $soubor)
    {
        $nahled = $this->slozka . '/' . $soubor;
        $obrazek = $this->slozka . '/' . str_replace('_nahled.', '.', $soubor);
        echo('<td><a href="' . htmlspecialchars($obrazek) . '"><img src="' . htmlspecialchars($nahled) . '" alt=""></a></td>');
        $sloupec++;
        if ($sloupec >= $this->sloupcu)
        {
            echo('</tr><tr>');
            $sloupec = 0;
        }
    }
    echo('</tr></table>');
}

Použití

Přesuneme se do index.php, vložíme sem základní HTML strukturu a vytvoříme instanci galerie. Do konstruktoru předáme složku a počet sloupců. Následně zavoláme nacti() a vypis().

<!DOCTYPE html>

<html lang="cs-cz">
    <head>
            <meta charset="utf-8" />
            <title>Galerie obrázků</title>
    </head>

    <body>
        <h1>Galerie obrázků</h1>
        <?php
        require_once('tridy/Galerie.php');

        $galerie = new Galerie('obrazky', 5);
        $galerie->nacti();
        $galerie->vypis();

        ?>
    </body>
</html>

Máme hotovo.

Když přidáme minimum CSS, může vaše aplikace vypadat třeba takto (zdrojový kód jako vždy níže ke stažení, k zobrazování originální obrázků jsem ještě přidal JavaScriptový plugin LightBox):

Objektová galerie obrázků v PHP

Možná vylepšení

Metoda vypis() není úplně ideální, jelikož se HTML kód echuje a proto je práce s ním poněkud nepřehledná. Dalším, již zmíněným vylepšením, by mohl být nahrávač obrázků, který nám na FTP nahraje obrázky do galerie a sám vytvoří miniatury. Pro naše účely je však aplikace dostačující a myslím, že má i tak praktické využití.

Naprogramovali jsme objektovou komponentu, kterou můžeme používat na různých webech, pro různé složky a na různě široké tabulky.

V příští lekci, Referenční a primitivní datové typy v PHP, si vysvětlíme referenční datové typy v PHP.


 

Stáhnout

Staženo 2743x (6.54 MB)
Aplikace je včetně zdrojových kódů v jazyce PHP

 

 

Článek pro vás napsal David Čápka
Avatar
Jak se ti líbí článek?
44 hlasů
Autor pracuje jako softwarový architekt a pedagog na projektu ITnetwork.cz (a jeho zahraničních verzích). Velmi si váží svobody podnikání v naší zemi a věří, že když se člověk neštítí práce, tak dokáže úplně cokoli.
Unicorn College Autor sítě se informační technologie naučil na Unicorn College - prestižní soukromé vysoké škole IT a ekonomie.
Předchozí článek
Zapouzdření v PHP
Všechny články v sekci
Objektově orientované programování (OOP) v PHP
Miniatura
Následující článek
Referenční a primitivní datové typy v PHP
Aktivity (9)

 

 

Komentáře

Avatar
Jenkings
Redaktor
Avatar
Jenkings:11.8.2013 19:23

Pěkný návod ;)
Doteď jsem se s OOP v PHP moc nekamarádil, ale zjistil jsem že se tomu budu muset začít věnovat jelikož procedurál už není "IN"

Tohle mi rozhodně moc pomohlo v pochopení základu ;)

Odpovědět
11.8.2013 19:23
Největší časovou náročnost má výpočet časové náročnosti..
Avatar
Kit
Redaktor
Avatar
Odpovídá na Jenkings
Kit:11.8.2013 19:41

Až to bude skutečně objektově, bude to ještě zajímavější :)

Odpovědět
11.8.2013 19:41
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
Odpovídá na Kit
Michal Žůrek - misaz:11.8.2013 19:46

I se základy se dá žít.

 
Odpovědět
11.8.2013 19:46
Avatar
Daniel Vítek
Tým ITnetwork
Avatar
Daniel Vítek:12.8.2013 8:18

Zajímalo by mě to nahrávání přes PHP :P

Odpovědět
12.8.2013 8:18
Na síti působím už pěknou řádku let. Pokud budeš něco potřebovat, písni mi, pokusím se ti poradit :)
Avatar
mnemecek83
Člen
Avatar
mnemecek83:12.8.2013 8:25

Sup sem s dalsim dilem ;)

 
Odpovědět
12.8.2013 8:25
Avatar
mnemecek83
Člen
Avatar
Odpovídá na mnemecek83
mnemecek83:12.8.2013 16:19

Za co ten minus? Ze se mi tento serial tak libi, ze se nemuzu dockat dalsiho dilu?

 
Odpovědět
12.8.2013 16:19
Avatar
xnitrox
Člen
Avatar
xnitrox:14.8.2013 23:04

Tady ty novoty ohledně objektového programování v PHP a nových použitelných funkcích čerpáš výhradně z PHP manuálu a nebo z nějakého zahraničního webu či literatury?

 
Odpovědět
14.8.2013 23:04
Avatar
Kit
Redaktor
Avatar
Odpovídá na xnitrox
Kit:14.8.2013 23:11

To nejsou novoty. V PHP manuálu je toho plno včetně příkladů.

Nebo se ti to snad nelíbí, že tomu říkáš novoty?

Editováno 14.8.2013 23:13
Odpovědět
14.8.2013 23:11
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
xnitrox
Člen
Avatar
Odpovídá na Kit
xnitrox:15.8.2013 0:22

Ale jo líbí :D nechápej to z mé strany jako útok, ale jako zájem. V některém z PHP kurzů tady na webu byla zmínka o tom, že php obsahuje spoustu užitečných funkcí, a že jich je tolik, že se už stěží pamatují... teď mě tak napadá, že to bylo asi v kurzu s redakčním systémem...

A bylo tam myslím i psáno, že vznikají nové objektové knihovny, které se postupně začínají objevovat i v PHP manuálu :) tak mě akorát zajímalo, jestli autor kurzu/článků čerpá z nějakého novodobého zdroje, kde se soustřeďují už výhradně jen na OOP programování v PHP s využitím oněch nových knihoven či jsou veškeré jeho znalosti převzaty z manuálu :)

Ne proto, abych do něj nějak rýpal nebo znevažoval PHP, ale abych se soustředil na moderní typ vývoje a neučil se z manuálu nějaké staré věci a funkce (byť je mi známo, že je u každé uvedeno pro kterou verzi PHP je dělaná) :)

A proč to nazývám "novoty"... pro mě to jsou novoty :D s PHP jsem začínal před 6ti lety(pak se tomu dlouho nevěnoval) a to bylo úplně někde jinde... teď se snažím zapadnout do moderního způsobu programování ;) takže tak

Editováno 15.8.2013 0:23
 
Odpovědět
15.8.2013 0:22
Avatar
Kit
Redaktor
Avatar
Odpovídá na xnitrox
Kit:15.8.2013 0:31

Čtu hodně článků a debat o OOP, dalších paradigmatech, návrhových vzorech apod. a udělal jsem si na to vlastní názor. Totéž udělal i David Čápka . Proto se občas naše názory rozcházejí, evidentně čerpáme z různých zdrojů.

Je málo lidských činností, ve kterých je možné se ke stejnému výsledku dopracovat tolika naprosto odlišnými přístupy, jako je právě programování.

Odpovědět
15.8.2013 0:31
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
teeg
Člen
Avatar
teeg:22.8.2013 23:55

Ahoj, v tutoriálu zmiňuješ, že metoda vypis není ideální, protože se html echuje. Jak by se toto dalo napravit? Díky za odpověď

 
Odpovědět
22.8.2013 23:55
Avatar
Kit
Redaktor
Avatar
Odpovídá na teeg
Kit:23.8.2013 0:01

Výstup se běžně dělá přes šablony, aby se prezentace oddělila od vnitřní struktury. Na první pohled to vypadá troch složitěji, ale údržba takového programu je pak mnohem jednodušší.

Odpovědět
23.8.2013 0:01
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
teeg
Člen
Avatar
Odpovídá na Kit
teeg:23.8.2013 0:05

Nemůžeš mi udělat malou ukázku - nějak si to tady nedovedu představit. Díky

 
Odpovědět
23.8.2013 0:05
Avatar
Kit
Redaktor
Avatar
Odpovídá na teeg
Kit:23.8.2013 0:12

Jedině že bych tento příklad přepsal do té podoby, jak bych to udělal sám.

Odpovědět
23.8.2013 0:12
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
teeg
Člen
Avatar
Odpovídá na Kit
teeg:23.8.2013 0:16

Mohl bych tě o to poprosit? Jestli ti to nebude vadit? Díky

 
Odpovědět
23.8.2013 0:16
Avatar
Kit
Redaktor
Avatar
Odpovídá na teeg
Kit:23.8.2013 0:24

David Čápkavi se to asi nebude moc líbit, ale za chvíli to možná budu mít hotové.

Odpovědět
23.8.2013 0:24
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
teeg
Člen
Avatar
Odpovídá na Kit
teeg:23.8.2013 0:27

Díky moc, pomůže mi to rozšířit si obzory.

 
Odpovědět
23.8.2013 0:27
Avatar
Kit
Redaktor
Avatar
Odpovědět
23.8.2013 1:28
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
teeg
Člen
Avatar
Odpovídá na Kit
teeg:23.8.2013 1:44

Aha, takže pokud to chápu dobře, tak základem je metoda __toString(), která vrací naformátovaný řetězec, který se pak na daném místě v šabloně vykreslí?

 
Odpovědět
23.8.2013 1:44
Avatar
Kit
Redaktor
Avatar
Odpovídá na teeg
Kit:23.8.2013 1:57

Ano, v metodě __toString() je šablona, ale není v ní echo. Vyšší vrstvy, které použijí třídu Galerie, mohou tento řetězec použít dle uvážení - poslat na výstup, uložit na disk nebo do cache. To by v případě použití echo nešlo (šlo, ale nevypadá to dobře).

Kromě toho jsem se to snažil dělat objektově: Stránka se skládá z hlavičky, tabulky a ukončení. Tabulka se skládá z řádek. Řádky se skládají z položek. Položka se skládá z odkazu na obrázek a jeho náhledu. Snad je patrné zapouzdření.

Odpovědět
23.8.2013 1:57
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
teeg
Člen
Avatar
Odpovídá na Kit
teeg:23.8.2013 2:00

Dobře, díky moc za tvůj čas, zase jsem se naučil něco nového.

 
Odpovědět
23.8.2013 2:00
Avatar
Kit
Redaktor
Avatar
Odpovídá na teeg
Kit:23.8.2013 2:32

Za málo. Stejně jsem to chtěl napsat, protože se mi řešení v článku nelíbilo a aspoň jsem k tomu napsání měl další důvod.

Odpovědět
23.8.2013 2:32
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na teeg
David Čápka:23.8.2013 8:23

Podívej se na seriál o MVC frameworku v PHP, je to volné pokračování tohoto OOP seriálu a řeší se tam právě šablony.

Odpovědět
23.8.2013 8:23
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
arnie.one.hc
Člen
Avatar
arnie.one.hc:30.10.2013 9:06

Chtěl bych se zeptat, podle čeho se obrázky v galerii zobrazené na webu řadí. Jelikož jsem začátečník, tak zřejmě nevím, kde z kódu tuto proměnou vyčíst. Díky.

 
Odpovědět
30.10.2013 9:06
Avatar
Odpovídá na arnie.one.hc
Michal Žůrek - misaz:30.10.2013 9:19

v závislosti jak je metoda read() načte.

 
Odpovědět
30.10.2013 9:19
Avatar
arnie.one.hc
Člen
Avatar
arnie.one.hc:30.10.2013 9:51

Dobře, jak jsem tedy schopný ovlivnit metodu read, aby mě seřadila obrázky, např. dle jména ?

 
Odpovědět
30.10.2013 9:51
Avatar
Kit
Redaktor
Avatar
Odpovídá na arnie.one.hc
Kit:30.10.2013 9:56

Načteš si seznam obrázků do pole a seřadíš dle potřeby.

Editováno 30.10.2013 9:57
Odpovědět
30.10.2013 9:56
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
arnie.one.hc
Člen
Avatar
arnie.one.hc:30.10.2013 10:01

Mohu poprosit o ukázku, jak na to ?

 
Odpovědět
30.10.2013 10:01
Avatar
Kit
Redaktor
Avatar
Odpovídá na arnie.one.hc
Kit:30.10.2013 10:07

Když si přečteš zdejší tutoriály, tak na to přijdeš sám.

Odpovědět
30.10.2013 10:07
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na arnie.one.hc
David Čápka:1.11.2013 15:40

Můžeš použít funkci sort(), která řádí podle abecedy. Ale měl jsem za to, že PHP vrátí názvy souborů již podle abecedy.

Odpovědět
1.11.2013 15:40
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na David Čápka
Kit:1.11.2013 15:50

Záleží na souborovém systému, v jakém pořadí ta jména dodá. FAT je nemá nijak seřazena, ale tuším, že NTFS je seřadí, protože sám si jména souborů udržuje v B-stromech.

Odpovědět
1.11.2013 15:50
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Avatar
jod
Neregistrovaný
Avatar
jod:6.12.2013 22:37

Šlo by to takhle. Jsem začátečník v OOP.
*<?php
class Galerie
{

public $slozka;

public function Vypis()
{

$slozka=opendir($this->slozka);
$pr=0;
while($name=re­addir($slozka))
{
if ($name != "." && $name != ".."){
$pr++;
$pole[$pr]=$name;
}

}
print_r($pole);

}

}

$nacti=new Galerie();
$nacti->slozka="./img";
$nacti->Vypis();

?>*

 
Odpovědět
6.12.2013 22:37
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na jod
David Čápka:9.1.2014 19:09

Když metodu pojmenuješ jako vypis, očekával bych, že vypisuje, ne že něco načítá.

Odpovědět
9.1.2014 19:09
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Kit
Redaktor
Avatar
Odpovídá na jod
Kit:9.1.2014 19:17

Pro názvy objektů se obvykle používají podstatná jména, pro metody zase slovesa.

Odpovědět
9.1.2014 19:17
Vlastnosti objektů by neměly být veřejné. A to ani prostřednictvím getterů/setterů.
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
pastraka
Člen
Avatar
pastraka:1.6.2014 20:23

Zdravím, mohl by mi někdo objastnit kdy se používá lokální proměnná tzn. např. $nahled,$sloupcu a kdy se používá $this->nahled,$this->sloupcu. Také by mě zajímalo podle čeho se stanovují proměnné (private $slozka; private $sloupcu), které jsou definované na začátku třídy. Jsem začátečník tak bych potřeboval nějaký jednoduchý a srozumitelný návod. Děkuji

 
Odpovědět
1.6.2014 20:23
Avatar
Martin Píštěk (Denir):28.7.2014 23:30

ahoj, v příkladu je použitá funkce strpos(), ale je bez prefixu mb_. Ten ve třídě u funkcí nemusím zadávat?

 
Odpovědět
28.7.2014 23:30
Avatar
Tomáš123
Člen
Avatar
Odpovídá na Martin Píštěk (Denir)
Tomáš123:9.5.2015 12:36

Nemusíš ho zadávať preto, lebo v názvoch obrázkov v galérii nie je použité multibytové kódovanie, ako napríklad UTF-8. Nevyskytuje sa tam diakritika.

Odpovědět
9.5.2015 12:36
Keby nebolo Internetu Exploreru, nebolo by dnešného internetu.
Avatar
Odpovídá na Martin Píštěk (Denir)
Michal Šmahel:9.5.2015 12:56

Vždy si musíš rozmyslet, jaké texty tam budou. Pokud ty texty budou bez diakritiky, stačí běžná funkce, pokud s diakritikou, musí to být včetně prefixu mb_. Někdy to ani tak neuškodí (strlen() - jen to nebude přesné), ale někdy ti to udělá pěknou neplechu (str_replace() - vůbec nebude fungovat, substr() - usekne ti část písmene)

Odpovědět
9.5.2015 12:56
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Martin Píštěk (Denir)
David Čápka:9.5.2015 13:04

Ideálně by tam mělo být mb_. V tomto případě nás pozice vůbec nezajímá, zajímá nás jen jestli je podřetězec obsažený, proto použití strpost() nevadí, i když pozici může udat o kus jinde než je ve skutečnosti.

Odpovědět
9.5.2015 13:04
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Tomáš Růžička:22.5.2015 16:01

Mohl by mi prosím někdo poslat zdroják na třídu Directory jejíž instance se tvoří funkcí dir(). Zasekl jsem se a vůbec nic nemůžu najít. Jen tohle:

http://php.net/manual/en/class.directory.php
, ale tam zas nechápu to string, resource a void. Prosím o vysvětlení.
Editováno 22.5.2015 16:04
 
Odpovědět
22.5.2015 16:01
Avatar
Radoslav Pitoňák:10.8.2015 21:11

Zdravím, dokončil som tutorial spustil projekt a hodilo mi to error:
" Fatal error: Call to a member function read() on boolean in C:\xampp\htdoc­s\galeria\tri­edy\Galeria.php on line 16 "
Skúšal som googliť ale nenašiel som žiadne riešenie, akurát som zistil že to zlyhá už na funkcii dir() ktorá mi nevráti objekt. Zdroják som si kontroloval a mám ho presne ako je ten v prílohe, viete mi poradiť?

 
Odpovědět
10.8.2015 21:11
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Radoslav Pitoňák
David Čápka:10.8.2015 21:14

Když to vrátí false tak se z té složky nedá číst, např. neexistuje nebo k ní nemáš oprávnění.

Odpovědět
10.8.2015 21:14
Jsem moc rád, že jsi na síti, a přeji ti top IT kariéru, ať jako zaměstnanec nebo podnikatel. Máš na to! :)
Avatar
Odpovídá na David Čápka
Radoslav Pitoňák:10.8.2015 21:55

priečinok mám normálne na localhoste, existuje a mal by som mať k nemu aj oprávnenie, project mám v jednom priečinku kde su obrazky,triedy,in­dex.php.Aj v index php v konštruktore zadávam správne parameter s názvom priečinku.

 
Odpovědět
10.8.2015 21:55
Avatar
era60n
Člen
Avatar
Odpovídá na David Čápka
era60n:15.9.2015 21:21

Mám uplně stejný problém: "Fatal error: Call to a member function read() on boolean in C:\xampp_new\htdoc­s\PHP\OOP\tri­dy\Galerie.php on line 18" Kód mám napsaný přesně podle tutorialu, zkoušel jsem přeinstalovat a zároveň updatovat XAMP, vypnout UAC a oprávnění jsem také kontroloval, nic bohužel nepomohlo. Prosím o radu, děkuji. :)

 
Odpovědět
15.9.2015 21:21
Avatar
Vít Cigánek:11.10.2015 10:12

Tak pochopil jsem to, ale nedal bych to sam dohromady.

 
Odpovědět
11.10.2015 10:12
Avatar
danhosek
Člen
Avatar
danhosek:16.11.2015 2:19

$galerie = new Galerie('obrazky', 5);
nejde mi složku obrázky nahradit proměnou např.: $soubor. zkusil jsem veškeré možnosti se zívorkami a pod, a pokaždé aplikace spadne. Jak bych tam mohl dostat proměnou, tak aby to bylo funkční? Děkuji mnohokrát!!

 
Odpovědět
16.11.2015 2:19
Avatar
Odpovídá na danhosek
Vít Cigánek:23.11.2015 18:24

Mi to funguje.

Musíš to nastavit takhle:

$retezec = 'pic/obrazky';
$galerie = new Galerie($retezec, 4);

Jinak já mam jiný dotaz. Nechápu proč funkce vrací tečku a pak dvě tečky a pak až najede načítaní souboru.

Další věc je že popis http://php.net/…tion.dir.php je trochu divný. Kromě metody read() a close() by třída měla mít metody handle a path. Přijde mi že to tam není popsané. Tady tohle je taky divné http://php.net/…irectory.php

Ale nejvíce mě zajímají ty tečky

 
Odpovědět
23.11.2015 18:24
Avatar
danhosek
Člen
Avatar
Odpovídá na Vít Cigánek
danhosek:27.11.2015 22:54

Jde měak udělat: require_once('tri­dy/Galerie.php');
do .phtml ??? píše mi to chyby:

Warning: require(pohle­dy/galerie.phtml): failed to open stream: No such file or directory in /data/web/vir­tuals/101955/vir­tual/www/kontro­lery/Kontroler­.php on line 58

Warning: require(pohle­dy/galerie.phtml): failed to open stream: No such file or directory in /data/web/vir­tuals/101955/vir­tual/www/kontro­lery/Kontroler­.php on line 58

Fatal error: require(): Failed opening required 'pohledy/gale­rie.phtml' (include_path='­.:/data/web/vir­tuals/101955/vir­tual') in /data/web/vir­tuals/101955/vir­tual/www/kontro­lery/Kontroler­.php on line 58
díky za radu. :)

 
Odpovědět
27.11.2015 22:54
Avatar
Martin Bruna
Člen
Avatar
Odpovídá na Vít Cigánek
Martin Bruna:28.11.2015 14:45

nejsem si jisý, ale pokud dostaneš list obsahu složky, tak obsahuje zastupný znak pro aktuální složku(.) a pro složku nadřazenou(..)

 
Odpovědět
28.11.2015 14:45
Avatar
Danny
Člen
Avatar
Odpovídá na Martin Bruna
Danny:28.11.2015 15:52

Já si myslim, že je to podobně, jako například když chci zapsat cestu ve stylech například nebo v html
něco jako ./css/style.css (kde to napsané být ani vlastně nemusí) a ve stylech pak používám ../images která je na stejné úrovni se složkou CSS jako nadřazený adresář, ale mě by spíš zajímalo, jestli náhodou není nějaký parametr, který by mi nevracel tu hodnotu aktuální složky? Nevíte někdo? Díky

 
Odpovědět
28.11.2015 15:52
Avatar
danhosek
Člen
Avatar
Odpovídá na Danny
danhosek:28.11.2015 19:38

mysliš něco jako:
<base href="http://­www.domena.cz/" /> ?? tim jsi pro každý odkaz v kořenové složce, a tvoříš cestu tam odtud. je to dopré, když přesuneš stránku jinem, její odkazy budou stále funkční.

 
Odpovědět
28.11.2015 19:38
Avatar
Tomík
Člen
Avatar
Tomík:23.12.2015 14:10

Ahoj, mám problém s načítáním složky. Načítání funguje až na to, že pokud tam mám nějaké háčky a čárky v názvu těch fotek, tak se ty znaky mění. Není nějaký jiný způsob načítání ze složky, kde by se neměli názvy fotek?

díky

 
Odpovědět
23.12.2015 14:10
Avatar
Danny
Člen
Avatar
Odpovídá na danhosek
Danny:17.1.2016 23:19

Jj díky, přesně to jsem myslel :)

 
Odpovědět
17.1.2016 23:19
Avatar
Crrack
Člen
Avatar
Crrack:16.4.2016 14:18

Ahoj nevíte jak udělat, aby se soubory řadily podle datumu uprav na souborech ?

 
Odpovědět
16.4.2016 14:18
Avatar
Michal Vlasák:10.5.2016 11:09

Nevím, jestli to vysvětlím dobře, ale mate mě toto:

public function __construct($slozka, $sloupcu)
        {
                $this->slozka = $slozka;
                $this->sloupcu = $sloupcu;
        }

a toto,

public function nacti()
{
        $slozka = dir($this->slozka);
        ...

protože, když vytvořím instanci $galerie, tak v konstruktoru předávám do $this->slozka hodnotu proměné $slozka a ta se rovná 'obrazky'. Takže ve zkratce řečeno $slozka má hodnotu 'obrazky' a tu jsme předali do $this->slozka.

V dalších krocích pak vidím $slozka = dir($this->slozka). To tím pádem tu původní proměnou složka nahrazuju a mohl bych tam mít i jinou proměnnou a nebo je důležité, aby tam bylo právě $slozka = ?

Děkuju

Odpovědět
10.5.2016 11:09
"It doesn't work! I hate programming!" - One hour later: "It works! I love programming!"
Avatar
kivdul
Člen
Avatar
Odpovídá na Kit
kivdul:21.6.2016 14:44

Ahoj lidi,

23.08.2013 v 1:28 vložil KIT svůj kod, ve kterém ke konci použil zkratku EOT, a nepodařilo se mi dohledat její význam :-(

Věděl by náhodou někdo z Vás, co znamená a napsal sem stručně její použití?

děkuji Ludvík

 
Odpovědět
21.6.2016 14:44
Avatar
Adam Ježek
Tým ITnetwork
Avatar
Odpovědět
21.6.2016 15:04
Počkej chvíli, poradím se s křišťálovou koulí.
Avatar
kivdul
Člen
Avatar
 
Odpovědět
21.6.2016 16:15
Avatar
Odpovídá na Michal Vlasák
Pavel Habžanský:21.6.2016 17:33

$this -> slozka je něco jiného než $slozka... $this-> promenna ti říká, že pracuješ přímo s atributem třídy, $slozka je pak už samostatná proměnná

Odpovědět
21.6.2016 17:33
Čím větší výzva, tím větší zkušenost
Avatar
Andreas
Člen
Avatar
Andreas:9.9.2016 7:46

Viete niekdo ako spraviť aby keď na obrázok kliknem tak sa mi zobrazí a vistupi dopredu?

 
Odpovědět
9.9.2016 7:46
Avatar
Jan Zamecnik
Člen
Avatar
 
Odpovědět
14.9.2016 22:36
Avatar
Martin Procházka:27.11.2016 7:10

Ahoj mě zajímá trafic a možná jsem už moc old, ale miniatura se tvoří automaticky to je v pohodě, jdem mi o abych člověka nenutil natahovat obrazky v plné velikosti, aby se to transformovalo na miniaturu. někde přece ten trafic být musí a moc se mi nezdá že by tuto hodnotu převzal hosting.

Odpovědět
27.11.2016 7:10
... učit se, učit se, učit se ...
Avatar
Odpovídá na Pavel Habžanský
Marek Pastorek:22.8.2017 22:46

$slozka je v podstate lokalna premenna funkcie.

 
Odpovědět
22.8.2017 22:46
Avatar
Odpovídá na Jan Zamecnik
Matyáš Máslík:26.9.2017 11:38

Myslím, že tady jde spíše o zjednodušení, protože pokud přidáš pouze lightbox, musíš ke každému obrázku zvlášť přidal atribut rel a určit mu, ve které bude galerii, pokud nechceš aby se ti obrázky z celého webu dávaly do jedné. Pokud je navíc chceš mít nějak rozumně uspořádané, pravděpodobně sáhneš po řešení tabulkou. To ale funguje pokud tam máš pár obrázků a hodláš nějaký přidat jednou za čas, jelikož pochybuju, že by se někomu chtěla dělat tabulka o třeba 500 řádcích a 10 sloupcích ručně v html + do každé buňky ručně přidávat obrázek. Pokud jsem to správně pochopil, jde tedy o automatizaci pro větší galerie.

 
Odpovědět
26.9.2017 11:38
Avatar
Odpovídá na Radoslav Pitoňák
Karel Labonek:14.5.2018 19:38

Ahojki, vzřešil jsi ten problém s načtením fotek, mě to píše toto:

Přístup odmítnut!
Nemáte právo pro přístup do požadovaného adresáře. Buď neexistuje žádný dokument s obsahem (tzv. index), nebo je adresář chráněn proti čtení.

Pokud si myslíte, že toto je chyba serveru, kontaktujte, prosím, webmastera.

Error 403
webkatka
Apache/2.4.33 (Win32) OpenSSL/1.1.0g PHP/7.2.4

nemáš radu?

 
Odpovědět
14.5.2018 19:38
Avatar
Jiří Pecher:18.10.2019 20:40

Ahoj, výraz "vyechuje" je mi jasný :-) Co však prosím znamená výraz "proiterujeme"? ;-)

Editováno 18.10.2019 20:40
Odpovědět
18.10.2019 20:40
"Když nemám co dělat, pracuji."
Avatar
Odpovídá na Jiří Pecher
Michal Šmahel:18.10.2019 23:30

Ahoj, vychází to z iterátoru. Více si můžeš přečíst různě po internetu (např. tady). Úplně zjednodušeně se jedná o projití nějaké kolekce (v PHP je kolekcí vlastně i klasické pole) prvek po prvku. V PHP se k tomu často používá cyklus foreach (jako např. i v článku).


Když by ses chtěl dozvědět trochu více: Iterátor je návrhový vzor, který ti zajišťuje možnost "jednoduchého" projití nějaké kolekce (v PHP pole, jinak různé seznamy, množiny apod.), aniž bys musel složitě řešit, jak je tato kolekce uvnitř vlastně řešena. Iterátor zajistí určité rozhraní, díky němuž lze kolekci vložit do běžného foreach cyklu, který s ním díky jeho implementaci dokáže pracovat jako např. s klasickým PHP polem. Opět velmi zjednodušeno, ale myslím, že nemá smysl to více rozebírat. Prozatím je to jistě až až, v případě zájmu samozřejmě můžeš pročíst internet. Bez dalších podkladů a znalosti rozhraní a obecné teorie kolem návrhových vzorů to však nemá příliš smysl nějak hlouběji zkoumat.

Odpovědět
18.10.2019 23:30
Nejdůležitější je motivace, ovšem musí být doprovázena činy.
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 67 zpráv z 67.