Schvalování článků - II - Builder.cz - Informacni server o programovani

Odběr fotomagazínu

Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!

 

Zadejte Vaši e-mailovou adresu:

Kamarád fotí rád?

Přihlas ho k odběru fotomagazínu!

 

Zadejte e-mailovou adresu kamaráda:



PHP

Schvalování článků - II

redakcni system

9. ledna 2002, 00.00 | Pokračujeme v tvorbě vlastního redakčního systému v PHP. Dnes si ukážeme změny při schvalování článků, jako zobrazování obrázků, odstranění časového limitu a správná logika v administraci článků.

Dnes pozměníme schvalování článků v admin centru. Ještě před tím si ukážeme, jak si ony načtené obrázky zobrazit.

Myslím, že hned ze začátku je jasné, že zobrazovat obrázky v jejich plné velikosti hned na hlavní stránce, by nebylo vhodné. Proto je zmenšíme, ale zachováme poměr stran, tedy obrázek nebude deformovaný. Zařídí to tento úryvek ze scriptu index.php, který přidáme za odkaz s příspěvky.

if(File_Exists("./images/$row[0].jpeg")){ 
	$a=GetImageSize("./images/$row[0].jpeg");
	if($a[0]>80 || $a[1]>80)
	$pomer=$a[0]/$a[1];
	while(($a[0]>40 && $a[1]>40) || ($a[0]<60 && $a[1]<60) && 
         $a[0]/$a[1]==$pomer)
	{	
	$a[0]=round($a[0]/1.1);
	$a[1]=round($a[1]/1.1);
	}?>
	<IMG SRC="./images/<? echo $row[0]; ?>.jpeg" WIDTH=<? echo $a[0]; ?> 
         HEIGHT=<? echo $a[1]; ?>>
	<?}
elseif(File_Exists("./images/$row[0].gif")){
	$a=GetImageSize("./images/$row[0].gif");
	if($a[0]>80 || $a[1]>80)
	$pomer=$a[0]/$a[1];
	while(($a[0]>40 && $a[1]>40) || ($a[0]<60 && $a[1]<60) && 
         $a[0]/$a[1]==$pomer)
	{	
	$a[0]=round($a[0]/1.1);
	$a[1]=round($a[1]/1.1);
	}?>
	<IMG SRC="./images/<? echo $row[0]; ?>.gif" WIDTH=<? echo $a[0]; ?> 
         HEIGHT=<? echo $a[1]; ?>>
	<?
	}

Vysvětlime si to. Využíváme zde opět funkci GetImageSize(). Pokud existuje obrázek, do proměnné $a si načteme výsledek funkce GetImageSize(). Když je výška nebo šířka větší než 80 px (pixelů), změníme jeho velikost. Proto si spočítáme poměr stran, aby se nám nedeformoval. Dále tu máme cyklus, který nám bude obrázek zmenšovat dokud nebude alespoň jeden z rozměrů (šířka či výška) v rozmezí 40 a 60 px a poměr bude stále zachován. Tělo cyklu nám rozměry zmenší tím, že je vydělí 1,1. Proč zrovna tímhle číslem? Představte si, že tam máte dělení číslem 2 a před tím než poběhne naposledy tělo cyklu, bude mít obrázek rozměry řekněme 61 šířku a 75 výšku. Poté, co naposledy projde cyklem, bude mít 31 šířku a 38 výšku, což je poměrně málo. Když je tam ale 1,1, tak při stejných vstupních rozměrech dostaneme 55 šířku a 68 výšku. A na to se už lépe kouká. Je pravda, že cyklus trvá déle, ale dělení a zaokrouhlování nejsou operace, které by zabraly moc času. Číslo, kterým se bude bělení provádět, je ale na vás. Na konci cyklu dostaneme nezdeformovaný obrázek v menších rozměrech. Tyto rozměry pak příslušně dosadíme.

Jenže když se zobrazuje jen jeden samotný článek, chceme, aby se obrázek zobrazil v plných rozměrech. V tom případě použijeme toto:

	if(File_Exists("./images/$clanek.jpeg")){ 
	$imag=GetImageSize("./images/$clanek.jpeg");?>
	<IMG SRC="./images/<? echo $clanek; ?>.jpeg" <? echo  $imag[3];?>>
	<?}
	elseif(File_Exists("./images/$clanek.gif")){
	$imag=GetImageSize("./images/$clanek.gif");?>
	<IMG SRC="./images/<? echo $clanek; ?>.gif" <? echo $imag[3];?>>
	<?

Pokud obrázek existuje, použijeme výsledek z funkce GetImageSize() s indexem 3 (pole s indexem 3). V tomto poli je řetězec ve tvaru height=xxx width=yyy, kde xxx je výška obrázku a yyy je šířka v pixelech. Ve výsledku to vypadá takto:

	<?
	if(File_Exists("./images/$clanek.jpeg")){ 
	$imag=GetImageSize("./images/$clanek.jpeg");?>
	<IMG SRC="./images/

Ještě před tím si znovu upravíme jeden script. Jedná se o forum.php. O co tu jde: do tohoto scriptu jsem přidal funkci Set_Time_Limit(0). Záleželo na Vás, jestli ji použijete. Přidal jsem ji kvůli tomu, že pokud by v databázi bylo hodně e-mailů, které by chtěli upozorňovat na zprávy z diskuze, trvalo by to asi déle než 30 sekund (standardní timeout Apache). Když však tuhle funkci použijeme, může to trvat poměrně dlouho (a asi to dloho trvat bude). Mám obavy, že návštěvník stránky bude 2 nebo 3 minuty čekat, až se vše odešle. Po chvíli ho to přestane bavit a na prohlížeči zmáčkne tlačítko "Zastavit", nebo něco podobného. V takovém případě se běh scriptu zastaví. To ale my nechceme. My potřebujeme, aby script doběhl až do konce a odeslaly se všechny e-maily. Musíme tedy udělat něco, co nám to zajistí. V PHP na to máme funkci Ignore_User_Abort(). Díky ní doběhne script vždy do konce, nehledě na uživatelovy příkazy k ukončení práce. Do scriptu forum.php přidáme tuto funkci na označené místo:

@$sql = mysql_query("SELECT DISTINCT email FROM fora WHERE id_clanku = '$clanek'");
	Set_Time_Limit(0);
	Ignore_User_Abort();
               while (@$row = mysql_fetch_row($sql))
               {
                 @mail($email,"Novy prispevek v diskuzi",$mess, 
                 "From: \nReply-To: ");
               }

Nevím jak vám, ale mě začínalo vadit, že pokud kliknu na korekturu článků, objevují se tam i články, které jsou již schválené k zobrazení. Proto jsem zavedl nový pořádek:

  1. Ke korektuře se budou zobrazovat jen články, které nejsou schváleny k zobrazení.
  2. Právo opravovat a mazat schválené články má jen šéfredaktor.
Všechny scripty, jimiž se budeme zabývat, vycházejí ze scriptu korektura.php. Změny jsou jen v SQL dotazech. V souboru korektura.php jej změníme na:

SELECT C.id,C.nadpis,R.rubrika,A.jmeno,C.datum, C.counter,C.stav,C.priorita,A.email
FROM clanky C, rubriky R, autori A WHERE C.id_autor = A.id AND C.id_rubrika = R.id 
AND C.stav!='a' ORDER BY datum DESC, priorita DESC

Přidali jsme tam zeleně označenou část.

V souboru prehled.php je to samé jako ve scriptu schval.php, jen tam není možnost editace scriptu a zobrazují se zde všechny články.

Nyní jednotlivé SQL dotazy. První je pro prehled.php a druhý pro schval.php:

SELECT C.id,C.nadpis,R.rubrika,A.jmeno,C.datum, C.counter,C.stav,C.priorita 
FROM clanky C, rubriky R, autori A WHERE C.id_autor = A.id AND C.id_rubrika = R.id
ORDER BY datum DESC, priorita DESC

SELECT C.id,C.nadpis,R.rubrika,A.jmeno,C.datum, C.counter,C.stav,C.priorita,A.email 
FROM clanky C, rubriky R, autori A WHERE C.id_autor = A.id AND C.id_rubrika = R.id 
AND C.stav='a' ORDER BY datum DESC, priorita DESC

A abych nezapomněl. Možná se vám zdá divné, že pokud přidáte obrázek ke článku, obrázek, tak JPEG má formát GIF a obráceně. Je to způsobeno mojí chybou, za kterou se omlouvám. podmínka na ukládání obrázků má vypadat následovně:

  if($obr_size!=0):
  $a=Getimagesize($obr);
  if($a[2]=="2"):
      move_uploaded_file($obr, "../images/$di.jpeg");
  elseif($a[2]=="1"):
      move_uploaded_file($obr, "../images/$di.gif");
  endif;

Ještě jednou uvedu podporované formáty:

  • 1 = GIF
  • 2 = JPG
  • 3 = PNG
  • 4 = SWF
  • 5 = PSD
  • 6 = BMP
Ještě jednou se omlouvám.

Doufám, že vše bylo srozumitelné. Kdo to nepochopil, nechť si počká na poslední díl, kde dám ke stažení kompletní scripty. Příště si ukážeme, jak může korektor přidat obrázek k článku bez obrázku.

Obsah seriálu (více o seriálu):

Tématické zařazení:

 » Rubriky  » PHP  

 » Rubriky  » Web  

Diskuse k článku

 

Vložit nový příspěvek   Sbalit příspěvky

 

Zatím nebyl uložen žádný příspěvek, buďte první.

 

 

Vložit nový příspěvek

Jméno:

Pohlaví:

,

E-mail:

Předmět:

Příspěvek:

 

Kontrola:

Do spodního pole opište z obrázku 5 znaků:

Kód pro ověření

 

 

 

 

Nejčtenější články
Nejlépe hodnocené články

 

Přihlášení k mému účtu

Uživatelské jméno:

Heslo: