V článku „Univerzálny dynamický výber pomocou JavaScriptu“ som vytvoril JavaScript, ktorý dynamicky vypĺňa prvky SELECT podľa nadradenej kategórie. Dnes vám ukážem, ako sa dá takýto dynamický výber vytvoriť v PHP, teda nebude závislý od JavaScriptu – ani prehliadača. Súčasťou článku je aj ukážka.

K prepísaniu skriptu ma prinútili rozdiely JavaScriptu vo viacerých prehliadačoch. I keď pôvodný dynamický výber v JavaScripte som sa snažil napísať pre väčšinu prehliadačov, niet nad 100 percentné riešenie – generovanie formulárových prvkov pomocou PHP na strane servera. Takto to pobeží aj na historických prehliadačoch bez podpory JavaScriptov, avšak pri každej novo vybratej položke treba požiadavku odoslať na server. Keďže sa však jedná o malé množstvo dát (maximálne 1kB), nemalo by to spôsobiť opätovné zdĺhavé načítavanie.

Zadávanie hodnôt, ktorými budú naplnené prvky SELECT je rovnaké ako pri univerzálnom dynamickom výbere pomocou JavaScriptu, až na malé úpravy pre syntax PHP. Taktiež v posledných SELECToch slúži oddeľovač na oddelenie samotného OPTIONu od URL, na ktorú sa má stránka presmerovať.

$o = „_mk_do_“;
$s[„0“] = „meno“;
  $s[„0.0“] = „mužské“;
    $s[„0.0.0“] = „A“;
      $s[„0.0.0.0“] = „Adam“ . $o . „www.adam.xx“;
      $s[„0.0.0.1“] = „Alan“ . $o . „www.alan.xx“;
      $s[„0.0.0.2“] = „Adolf“ . $o . „www.adolf.xx“;
    $s[„0.0.1“] = „B“;
      $s[„0.0.1.0“] = „Boris“ . $o . „www.boris.xx“;
      $s[„0.0.1.1“] = „Bernard“ . $o . „www.bernard.xx“;
      $s[„0.0.1.2“] = „Bohdan“ . $o . „www.bohdan.xx“;
  $s[„0.1“] = „ženské“;
    $s[„0.1.0“] = „E“;
      $s[„0.1.0.0“] = „Eva“ . $o . „www.eva.xx“;
      $s[„0.1.0.1“] = „Elena“ . $o . „www.elena.xx“;
      $s[„0.1.0.2“] = „Erika“ . $o . „www.erika.xx“;
    $s[„0.1.1“] = „T“;
      $s[„0.1.1.0“] = „Tamara“ . $o . „www.tamara.xx“;
      $s[„0.1.1.1“] = „Tatiana“ . $o . „www.tatiana.xx“;
$s[„1“] = „hudba“;
  $s[„1.0“] = „rock“;
    $s[„1.0.0“] = „ZZ top“;
      $s[„1.0.0.0“] = „lizard life“ . $o . „www.lizard.xx“;
      …
      …
      …

Algoritmus plnenia SELECTu je taktiež podobný ako pri JavaScripte, avšak tu je zmien o niečo viac. Aby som zbytočne nerozpisoval, ako skript funguje, tu je ukážka. Dva rámce používam iba na zobrazenie reklamy na free webhostingu – nechcem, aby sa zobrazovala v phpDO.php. Zakaždým sa zavolá rovnaký súbor phpDO.php, preto na začiatku pošleme hlavičky o tom, aby sa stránka opäť načítala. Potom vložíme súbor data.php, v ktorom je definované vstupné pole, ktorým sa plnia SELECTy.

header („Pragma: no-cache“);
header („Cache-control: no-cache“);
header („Expires: „.gmdate(„D, d m Y H:i:s“).“ GMT“);
require („./data.php“);

V nasledujúcich riadkoch zistíme, z koľkých prvkov SELECT bude dynamický výber tvorený. Najskôr nastavíme ukazovateľ poľa na posledný prvok a pomocou funkcie SubStr_Count zistíme, koľkokrát sa v indexe (funkcia Key) tohto posledného prvku vyskytuje znak „.“ ktorý slúži ako oddeľovač jednotlivých výberov pri indexovaní poľa. V praxi sa asi nevyskytne prípad, že by výber mal viac ako 9 SELECTov. Práve znak „.“ zabezpečuje oddelenie čísel väčších ako 9 od ostatných. Inak by nebolo potrebné používať oddeľovač „.“ v indexe prvkov poľa, ale to by už nebol univerzálny výber, ale iba do 10 prvkov SELECT.

// nastav ukazovatel na posledny prvok pola
End($s);
// celkovy pocet SELECTov
$selectMax = 1 + SubStr_Count( Key($s) , „.“);

Potom pomocou funkcie Parse_Str($HTTP_GET_VARS) rozkódujeme premenné v URL – lepšie povedané vytvoríme pole $selectArray, ktorého prvky budú obsahovať index vybratého OPTIONu indexovaného od 0. Veľkosť tohto poľa nám hovorí, na ktorom prvku SELECT (taktiež indexované od 0) sa práve nachádzame. Túto veľkosť si uložíme do premennej $selectNow.

// vytvori pole $selectArray z $HTTP_GET_VARS v URL
Parse_Str($HTTP_GET_VARS);
// na ktorom SELECTe sa prave nachadzam
$selectNow = Count($selectArray);

Keď postupne vyberieme všetky SELECTy, $selectNow bude rovné $selectMax, čo v našej ukážke znamená vypísanie URL, kam by sme chceli stránku presmerovať. Samozrejme čo sa má urobiť na záver spracovania výberu je už na vás.

if ($selectNow == $selectMax) {
  $e = Explode ($o, $s[ Implode(„.“,$selectArray) ]);
  // DEMO
  echo $e[1];
  exit ();
  // FULL VERSION
  // header („Location: http://“.$e[1]);
  }

Funkcia Explode nám vráti pole reťazcov, ktoré sú od seba oddelené oddeľovačom $o. Opakom funkcie Explode je funkcia Implode, pomocou ktorej zlepíme všetky prvky poľa $selectArray znakom „.“, čím získame index poľa posledného SELECTu.

Na základe všetkých doteraz získaných premenných môžeme generovať výstup stránky. Najskôr zobrazíme všetky už doteraz vybraté SELECTy, ako obyčajný text v bunkách tabuľky s jedným prvkom input typu hidden, kde si uchovávame informácie, ktorý OPTION bol v tomto SELECTe vybratý.

echo „<html><head><title>phpDO</title></head><body>\n“;
echo „<form name=’phpDO’>\n“;
echo „<table border=’0′ cellspacing=’1′ cellpadding=’3′ bgcolor=’#000000’><tr>\n“;
// prechod vsetkymi SELECTami po $selectNow
for($code = „“, $selectID=0 ; $selectID<$selectNow ; $selectID++) {
  if($selectID)
    $code .= „.“;
  $code .= $selectArray[$selectID];
  echo „<td bgcolor=’999900’><b><font face=\“‚ARIAL CE‘, ‚HELVETICA CE‘,’ARIAL‘,’HELVETICA‘, ‚sans-serif’\“ size=‘-1’>“.$s[$code].“</font></b></td>“;
  echo „<input type=’hidden‘ name=’selectArray[]‘ value='“.$selectArray[$selectID].“‚>“;
  }

Teraz je potrebné zobraziť posledný SELECT a všetky jeho OPTIONy. To rieši nasledovný kód:

echo „<td bgcolor=’999900’><select size=1 name=’selectArray[]’>“;
$optionID = 0;
if($code)
  $code .= „.“;
do {
   // OPTION text
  $optionText = $s[$code.$optionID];
  if ($selectID < $selectMax – 1)
    echo „<option value='“.$optionID.“‚>“.$optionText.“\n“;
  else {
    $e = Explode ($o, $optionText);
    echo „<option value='“.$optionID.“‚>“.$e[0].“\n“;
    }
  $optionID++; // idem na dalsi OPTION
  } while($s[$code.$optionID]); // existuje OPTION s takymto code ?
echo „</select></td>\n“;

Na záver zobrazíme tlačítko submit, podľa toho, či sa jedná o posledný výber “ Ok “ alebo “ >> “ pre ďalší výber a korektne ukončíme html stránku.

if ($selectNow < $selectMax – 1)
  echo „<td bgcolor=’999900’><input type=’submit‘ value=‘ >> ‚></td>“;
else
  echo „<td bgcolor=’999900’><input type=’submit‘ value=‘ Ok ‚></td>“;
echo „</tr></table>\n“;
echo „</form>\n“;
echo „</body></html>“;

Takýto výber by mal fungovať aj na extrémne starých prehliadačoch, v ktorých JavaScript nebol zabudovaný. V praxi som to neskúšal, ale problém by mohli robiť neukončené tagy <option> alebo parametrom SELECTED neurčený defaultne vybratý záznam. Ak by ste pospájali všetky útržky zdrojového kódu z článku dostali by ste kompletný zdrojový kód univerzálneho dynamického výberu v PHP.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Žádný příspěvek v diskuzi

Odpovědět