Grafika publishing webtip.cz grafika.cz mujiPod.cz mujmac.cz fotografovani.cz printing.cz builder.cz galerie
webtip.cz
adresář  | práce  | diskuse  | redakce  | inzerce
 
 


  PHP v praxi, 23. díl - Tvorba fotoalba
o autorovi 
poslat mailem 
tisknout článek 
aktuální rubrika 
Tentokrát bude naším úkolem naprogramovat skript pro poloautomatické generování stránek s náhledy fotografií vytvořených např. pomocí skriptu v minulém díle.

Veselý Jan - 08.03.2002 - tutorial - Rubrika: PHP
Předchozí díl: PHP v praxi, 22. díl - Vytvoření zmenšených obrázků
Seriál: 
Následující díl: PHP v praxi, 24. díl - E-mail

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


Hodnocení článku: -1- -2- -3- -4- -5-  Aktuální hodnocení: 2.70 (3255)

Relevantní články
Žádné články


Příspěvky do diskuse o aktuálním článku
Venca04.10.21:06zobrazují se mi chyby
marian21.03.8:17vzory galerie
Jan Veselý21.03.22:02RE: vzory galerie
Martin10.03.20:37Generování náhledů?
Jan Vesely10.03.23:15RE: Generování náhledů?
  

 

  O vydavateli | Kontakt | Ceník reklamy | Ochrana osobních dat
©2002 Grafika Publishing. Všechna práva vyhrazena!