V předchozím díle jsme se věnovali vytvoření náhledů fotografií, je tedy na
místě vytvořit skript také pro generování náhledových stránek. Úkolem PHP skriptu
bude načíst z adresáře všechny fotografie, rozlišit od sebe náhledy od velkých
obrázků a nakonec vytvořit nový soubor, jenž bude obsahovat další PHP skript
na výpis obrázků, popř. i popisků k nim.
Nejprve si ukážeme načtení cest k fotografiím:
$adresar_name=dirname($cesta)."/";
$adresar=opendir($adresar_name);
$j=0;
while ($soubor=readdir($adresar))
{
@$overeni=GetImageSize($adresar_name.$soubor);
if ($soubor!="."&&$soubor!=".."&&$overeni[2]==2
&&substr($soubor, 0, strlen($prefix))!=$prefix)
{
$obrazky[$j][t]=$adresar_name.$prefix.$soubor;
$obrazky[$j][f]=$adresar_name.$soubor;
$j++;
}
elseif($soubor!="."&&$soubor!=".."&&(!$overeni||$overeni[2]!=2))
{
echo "Nelze pracovat se souborem: $soubor <br>\n";
}
}
closedir($adresar);
|
Od příkladu v minulém díle se mnoho nezměnilo. V podmínce se objevilo ověření,
zda se nejedná o náhled: Funkce substr()
vrací řetězec znaků podle námi zadaných argumentů. Prvním z nich ($soubor) je
řetězec, ze kterého budeme znaky vybírat, druhý (0) značí, od kterého znaku
budeme výběr provádět a poslední, kolik znaků má mít vrácený řetězec. To spočítáme
pomocí funkce strlen(),
jež vrací délku řetězce. Jednoduše řečeno - kontrolujeme, jestli obrázek nemá
před sebou např. "t_". Pokud nikoliv, jeho jméno se zařadí do vícerozměrného
pole $obrazky[][], kde první index znamená pořadí obrázků, druhý pak zda-li
se jedná o náhled (t) nebo samotnou fotografii (f). Takže pod $obrazky[0][t]
se skrývá např. c:\home\t_foto01.jpg a $obrazky[0][f] zastupuje c:\home\foto01.jpg.
Výsledek nyní potřebujeme zobrazit (kvůli ověření správnosti) a připsat popisky.
To bude obsaženo v dalším formuláři (kompletní zdrojový soubor včetně přístupu
k formulářům necháme opět na konec dílu):
for($i=0;$i<count($obrazky);$i++)
{
$t_size=GetImageSize($obrazky[$i][t]);
$f_size=GetImageSize($obrazky[$i][f]);
?>
<table border="1">
<tr>
<td width="<?= $t_size[0] ?>">
<img src="<?= $obrazky[$i][t] ?>" <?= $t_size[3] ?>>
</td>
<td valign="top" width="280">
<b>obrazek:</b><br>
<?= basename($obrazky[$i][f]) ?><br>
<?= $f_size[0].'x'.$f_size[1] ?><br>
popisek:<br>
<textarea name="f_pop[<?= $i ?>]"></textarea>
</td>
<td valign="top" width="280">
<b>nahled:</b><br>
<?= basename($obrazky[$i][t]) ?><br>
<?= $t_size[0].'x'.$t_size[1] ?><br>
popisek:<br><input type="text" name="t_pop[<?= $i ?>]" size="30">
</td>
</tr>
</table>
<?
echo '<input type="hidden" name="obrazky['.$i.'][f]"
value="'.basename($obrazky[$i][f]).'">';
echo '<input type="hidden" name="obrazky['.$i.'][t]"
value="'.basename($obrazky[$i][t]).'">';
}
|
Pro každý obrázek, cesta k němuž je uložena v poli $obrazky, se vytvoří samostatná
tabulka. Pomocí nám již známé funkce GetImageSize() získáme informace o právě
zpracovávaném obrázku včetně náhledu. Pod indexem 0 (např. $t_size[0]) je skryta
šířka, pod 1 výška. Typ obrázku zjišťovat nepotřebujeme, k tomuto formuláři
se dostaly již jen jpegy. Index 3 skrývá šířku a výšku ve formátu vhodném pro
HTML dokument (width="x" height="y"). Zatím jsme se věnovali
pouze výstupu na obrazovku, který však nijak neovlivní výsledný PHP skript.
V této části jsou důležité popisky, jež se budou předávat přes pole $f_pop[]
a $t_pop[], kde indexy se dosadí podle aktuálně zpracovávaných obrázků. Také
se předá pole $obrazky[][], ale tentokrát již jen názvy souborů, nikoliv celé
cesty.
Poslední "stránka" skriptu již odpovídá za vytvoření toho správného
zdrojového kódu. Protože se jedná o kód v kódu není zrovna snadné se v něm orientovat:
function print_multi($pole,$m,$rel)
{
$x="array(";
for($i=0;$i<count($pole);$i++)
{
$x.="'".$rel.$pole[$i][$m]."',";
}
$x.=");\n";
return $x;
}
function print_simple($pole)
{
$x="array(";
for($i=0;$i<count($pole);$i++)
{
$x.="'".$pole[$i]."',";
}
$x.=");\n";
return $x;
}
$text="<html>\n<body>\n<h1>fotky</h1>\n <?\n";
$text.='$ukaz='.print_multi($obrazky,'f',$relativni);
$text.='$thumbs='.print_multi($obrazky,'t',$relativni);
$text.='$f_popisek='.print_simple($f_pop,'','');
$text.='$t_popisek='.print_simple($t_pop,'','');
$text.="\nif (!isset(\$show)||\$show=='nahledy')\n{\n";
$text.=' for($i=0;$i<count($ukaz);$i++)'."\n {\n ?>\n";
$text.=' <a href="?show=<?= $i ?>"><img src="<?= $thumbs[$i] ?>"></a>'."\n";
$text.=' <br><?= $t_popisek[$i] ?><br><br>'."\n";
$text.=" <?\n }\n";
$text.="}\nelse\n{\n ?>\n";
$text.=' <img src="<?= $ukaz[$show] ?>"><br>'."\n";
$text.=' <?= $f_popisek[$show] ?><br><br>'."\n";
$text.=' <a href="?show=nahledy">nahledy</a>';
$text.="\n <?\n}\n ?>\n";
$text.="</body>\n</html>";
$fp = fopen ("$soubor.php", "w");
fwrite($fp,$text);
fclose ($fp);
echo "Hotovo.";
|
Na začátek si vytvoříme dvě funkce na výpis pole. Funkce print_multi() je použita
pro vícerozměrné pole - podle argumentů zpracuje buď informace o náhledech nebo
plných fotografiích. Předává se také relativní URL. Výstupem (returm $x) bude
např. array('cesta/foto1.jpg,'cesta/foto2.jpg',);. Print_simple() slouží k výpisu
obsahu jednoduchého pole. Do souboru budeme zapisovat obsah proměnné $text.
Tu tvoříme po řádcích, proměnné "sčítáme" jako obvykle tečkou. Aby
byl výsledný skript přehledný, používáme formátování pomocí \n tedy "new
line". Výsledkem bude např.:
<html>
<body>
<h1>fotky</h1>
<?
$ukaz=array('01Calais.JPG','02Calais.JPG',);
$thumbs=array('t_01Calais.JPG','t_02Calais.JPG',);
$f_popisek=array('popisek k obrazku1','popisek k obrazku2',);
$t_popisek=array('popisek k nahledu1','popisek k nahledu2',);
if (!isset($show)||$show=='nahledy')
{
for($i=0;$i<count($ukaz);$i++)
{
?>
<a href="?show=<?= $i ?>"><img src="<?= $thumbs[$i] ?>"></a>
<br><?= $t_popisek[$i] ?><br><br>
<?
}
}
else
{
?>
<img src="<?= $ukaz[$show] ?>"><br>
<?= $f_popisek[$show] ?><br><br>
<a href="?show=nahledy">nahledy</a>
<?
}
?>
</body>
</html>
|
Princip takovéto náhledové stránky je vysvětlen na konci článku PHP
v praxi, 21. díl - soubor.php?jak=na&t=o.
Slibovaný zdrojový kód bude samozřejmě obsahovat i HTML formuláře a další "detaily",
jež však není nutné podrobně rozebírat:
<html>
<body>
<h1>fotky</h1>
<?
$ukaz=array('01Calais.JPG','02Calais.JPG',);
$thumbs=array('t_01Calais.JPG','t_02Calais.JPG',);
$f_popisek=array('popisek k obrazku1','popisek k obrazku2',);
$t_popisek=array('popisek k nahledu1','popisek k nahledu2',);
if (!isset($show)||$show=='nahledy')
{
for($i=0;$i<count($ukaz);$i++)
{
?>
<a href="?show=<?= $i ?>"><img src="<?= $thumbs[$i] ?>"></a>
<br><?= $t_popisek[$i] ?><br><br>
<?
}
}
else
{
?>
<img src="<?= $ukaz[$show] ?>"><br>
<?= $f_popisek[$show] ?><br><br>
<a href="?show=nahledy">nahledy</a>
<?
}
?>
</body>
</html>
|
Princip takovéto náhledové stránky je vysvětlen na konci článku PHP
v praxi, 21. díl - soubor.php?jak=na&t=o.
Slibovaný zdrojový kód bude samozřejmě obsahovat i HTML formuláře a další "detaily",
jež však není nutné podrobně rozebírat:
<html>
<body>
<h1>Náhledy - PageMaker</h1>
<?
if(!isset($submit)){
?>
<form action="<?= $PHP_SELF ?>" method="post">
Cesta k adresáři:
<input type="file" name="cesta">
(určeno k načtení obrázků)<br>
Prefix náhledů:
<input type="text" name="prefix" value="t_" size="5">
(slouží k odlišení náhledů od vlastních fotek)<br>
<br>
<input type="submit" name="submit" value="Dalsi">
<input type="reset" name="reset" value="Reset">
</form>
<?
}
elseif($submit=='Dalsi')
{
$adresar_name=dirname($cesta)."/";
$adresar=opendir($adresar_name);
$j=0;
while ($soubor=readdir($adresar))
{
@$overeni=GetImageSize($adresar_name.$soubor);
if ($soubor!="."&&$soubor!=".."&&$overeni[2]==2
&&substr($soubor, 0, strlen($prefix))!=$prefix)
{
$obrazky[$j][t]=$adresar_name.$prefix.$soubor;
$obrazky[$j][f]=$adresar_name.$soubor;
$j++;
}
elseif($soubor!="."&&$soubor!=".."&&(!$overeni||$overeni[2]!=2))
{
echo "Nelze pracovat se souborem: $soubor <br>\n";
}
}
closedir($adresar);
?>
<form action="<?= $PHP_SELF ?>" method="post">
Relativní cesta k adr.:
<input type="text" name="relativni" value="./">
(např. "fotky/", jestliže bude výsledný PHP skript v adresáři nadřazeném
adr. fotky)<br><br>
Název souboru
<input type="text" name="soubor" value="thumbs">.php
<br><br>
<?
for($i=0;$i<count($obrazky);$i++)
{
$t_size=GetImageSize($obrazky[$i][t]);
$f_size=GetImageSize($obrazky[$i][f]);
?>
<table border="1">
<tr>
<td width="<?= $t_size[0] ?>">
<img src="<?= $obrazky[$i][t] ?>" <?= $t_size[3] ?>>
</td>
<td valign="top" width="280">
<b>obrazek:</b><br>
<?= basename($obrazky[$i][f]) ?><br>
<?= $f_size[0].'x'.$f_size[1] ?><br>
popisek:<br>
<textarea name="f_pop[<?= $i ?>]"></textarea>
</td>
<td valign="top" width="280">
<b>nahled:</b><br>
<?= basename($obrazky[$i][t]) ?><br>
<?= $t_size[0].'x'.$t_size[1] ?><br>
popisek:<br><input type="text" name="t_pop[<?= $i ?>]" size="30">
</td>
</tr>
</table>
<?
echo '<input type="hidden" name="obrazky['.$i.'][f]"
value="'.basename($obrazky[$i][f]).'">';
echo '<input type="hidden" name="obrazky['.$i.'][t]"
value="'.basename($obrazky[$i][t]).'">';
}
?>
<br>
<input type="submit" name="submit" value="Vytvor">
<input type="reset" name="reset" value="Reset">
</form>
<?
}
elseif($submit=='Vytvor')
{
function print_multi($pole,$m,$rel)
{
$x="Array(";
for($i=0;$i<count($pole);$i++)
{
$x.="'".$rel.$pole[$i][$m]."',";
}
$x.=");\n";
return $x;
}
function print_simple($pole)
{
$x="Array(";
for($i=0;$i<count($pole);$i++)
{
$x.="'".$pole[$i]."',";
}
$x.=");\n";
return $x;
}
$text="<html>\n<body>\n<h1>fotky</h1>\n <?\n";
$text.='$ukaz='.print_multi($obrazky,'f',$relativni);
$text.='$thumbs='.print_multi($obrazky,'t',$relativni);
$text.='$f_popisek='.print_simple($f_pop,'','');
$text.='$t_popisek='.print_simple($t_pop,'','');
$text.="\nif (!isset(\$show)||\$show=='nahledy')\n{\n";
$text.=' for($i=0;$i<count($ukaz);$i++)'."\n {\n ?>\n";
$text.=' <a href="?show=<?= $i ?>"><img src="<?= $thumbs[$i] ?>"></a>'."\n";
$text.=' <br><?= $t_popisek[$i] ?><br><br>'."\n";
$text.=" <?\n }\n";
$text.="}\nelse\n{\n ?>\n";
$text.=' <img src="<?= $ukaz[$show] ?>"><br>'."\n";
$text.=' <?= $f_popisek[$show] ?><br><br>'."\n";
$text.=' <a href="?show=nahledy">nahledy</a>';
$text.="\n <?\n}\n ?>\n";
$text.="</body>\n</html>";
$fp = fopen ("$soubor.php", "w");
fwrite($fp,$text);
fclose ($fp);
echo "Hotovo.";
}
?>
</body>
</html>
|
HTML formátování výsledné stránky již nechám na vás, ukázkový skript měl za
úkol hlavně vygenerovat seznam fotek, jejich náhledů a popisků k nim.
Veselý Jan
|