7. diel - Dokončenie knižnice ArrayUtils v PHP
V minulej lekcii, Knižnica ArrayUtils pre prácu s poľami v PHP , sme rozpísali knižnicu ArrayUtils pre prácu s poľami v PHP. Dnes knižnicu doplníme o ďalšie užitočné metódy a tým ju dokončíme.
Pridanie a odstránenie prefixu kľúčov
O prefixy sme sa už krátko zmienili. Predstavme si vloženie adresy z formulára do databázy. Názvy formulárových polí budú samozrejme opäť korešpondovať s názvami stĺpcov v tabuľke.
Html časť
... Ulice: <input type="text" name="ulice" /><br /> Č. popisné: <input type="text" name="cislo_popisne" /><br /> Č. orientační: <input type="text" name="cislo_orientacni" /><br /> Město: <input type="text" name="mesto" /><br /> PSČ: <input type="text" name="psc" /><br /> ...
Php časť
$kliceAdresa = array('ulice', 'cislo_popisne', 'cislo_orientacni', 'mesto', 'psc'); $adresa = ArrayUtils::filterKeys($_POST, $kliceAdresa); Db::insert('adresa', $adresa);
Občas dáta ale dorazia z nejakého zložitejšieho formulára, v ktorom máme napr. 2 adresy - fakturačné a dodacie. Aby sa nám kontrolky neplietli, predsadíme dodaciu adresu prefixom "dodaci_". Formulár by vyzeral napr. Takto:
Html časť
... <h2>Fakturační adresa</h2> Ulice: <input type="text" name="ulice" /><br /> Č. popisné: <input type="text" name="cislo_popisne" /><br /> Č. orientační: <input type="text" name="cislo_orientacni" /><br /> Město: <input type="text" name="mesto" /><br /> PSČ: <input type="text" name="psc" /><br /> ... <h2>Dodací adresa</h2> Ulice: <input type="text" name="dodaci_ulice" /><br /> Č. popisné: <input type="text" name="dodaci_cislo_popisne" /><br /> Č. orientační: <input type="text" name="dodaci_cislo_orientacni" /><br /> Město: <input type="text" name="dodaci_mesto" /><br /> PSČ: <input type="text" name="dodaci_psc" /><br /> ...
Php časť
V PHP budeme chcieť z $ _POST vytiahnuť časť bez prefixov a časť s prefixy, u tej potom prefixy odstrániť a uložiť obe adresy do tabuľky "adresa". Kód bude vyzerať takto:
$kliceAdresa = array('ulice', 'cislo_popisne', 'cislo_orientacni', 'mesto', 'psc'); $fakturacniAdresa = ArrayUtils::filterKeys($_POST, $kliceAdresa); // Získání jen polí s prefixem $dodaciAdresa = ArrayUtils::filterKeysPrefix('dodaci_', $_POST); // Odstranění prefixu $dodaciAdresa = ArrayUtils::removePrefix('dodaci_', $dodaciAdresa); // Filtrování $dodaciAdresa = ArrayUtils::filterKeys($dodaciAdresa, $kliceAdresa); // Vložení adres do databáze Db::insert('adresa', $fakturacniAdresa); Db::insert('adresa', $dodaciAdresa);
Uveďme si kód metód addPrefix () a removePrefix (). Všimnite si, že sú napísané tak, aby fungovali aj rekurzívne.
public static function addPrefix($prefix, array $input) { $output = array(); foreach ($input as $key => $value) { $key = $prefix . $key; if (is_array($value)) $value = self::addPrefix($prefix, $value); $output[$key] = $value; } return $output; } public static function removePrefix($prefix, array $input) { $output = array(); foreach ($input as $key => $value) { if (strpos($key, $prefix) === 0) $key = substr($key, mb_strlen($prefix)); if (is_array($value)) $value = self::removePrefix($prefix, $value); $output[$key] = $value; } return $output; }
Zmena ťavej notácie na podtržítkovou a naopak
V MySQL databáze je zvykom pomenovávať tabuľky podtržítkovou_notací (snake_case). Jednak sa vyhneme problémom s veľkými / malými písmenami na linuxových serveroch a tiež nám napr. PHPMyAdmin zoskupuje tabuľky podľa dvoch podčiarkovníkov, napr. Uzivatel__adresa, uzivatel__bankovni_ucet a podobne. V PHP však používame skôr VelbloudíNotaci (CamelCase). Niekedy je užitočné previesť kľúče poľa z jednej notácie na druhú. A práve to robia 2 nižšie uvedené funkcie. K samotnému prevodu je použitá knižnica StringUtils, ktorú sme dokončili minule.
public static function camelToSnake($inputArray) { $outputArray = array(); foreach ($inputArray as $key => $value) { $key = StringUtils::camelToSnake($key); if (is_array($value)) $value = self::camelToSnake($value); $outputArray[$key] = $value; } return $outputArray; } public static function snakeToCamel($inputArray) { $outputArray = array(); foreach ($inputArray as $key => $value) { $key = StringUtils::snakeToCamel($key); if (is_array($value)) $value = self::snakeToCamel($value); $outputArray[$key] = $value; } return $outputArray; }
Prevod do XML
Pri spolupráci s externými systémami často pracujeme s formátmi JSON alebo XML. Obidva tieto formáty je výhodné generovať z poľa, pričom pre generovanie poľa do JSON az JSON PHP obsahuje skvelé funkcie. Generovanie polia do XML bohužiaľ chýba a preto si na účely tejto i spätné konverzie pridáme metódy. Uveďme si najprv kód metódy xmlEncode ():
public static function xmlEncode(array $input, $root) { $doc = new DOMDocument('1.0', 'UTF-8'); $doc->formatOutput = true; $rootElement = $doc->createElement($root); $doc->appendChild($rootElement); self::xmlEncodeElement($input, $rootElement); return $doc->saveXML(); } private static function xmlEncodeElement(array $input, DOMElement $parent) { foreach ($input as $key => $value) { $element = $parent->ownerDocument->createElement($key); $parent->appendChild($element); if (is_array($value)) self::xmlEncodeElement($value, $element); else { $text = $parent->ownerDocument->createTextNode($value); $element->appendChild($text); } } }
Metóda prijíma vstupné pole a názov koreňového XML elementu. Následne vytvorí nový dokument a pridá doň koreňový element. Ďalej spustí privátne metódu xmlEncodeElement (). Tá prijíma polia a element, do ktorého má prvky z poľa privesiť. Druhú metódu sme vytvorili kvôli uľahčeniu rekurzia, budeme chcieť, aby bolo možné ponoriť pole do seba. Pre každý kľúč poľa tu vytvoríme element a do toho buď vložíme rovno text alebo zavoláme metódu rekurzívne znovu pre prípad, že je vkladanú hodnotu opäť poľa.
Metódu môžeme vyskúšať:
$uzivatele = array( 'administrator' => array( 'uzivatel_id' => 1, 'jmeno' => 'Jan Novák', 'email' => '[email protected]', ), 'redaktor' => array( 'uzivatel_id' => 2, 'jmeno' => 'Jana Nováková', 'email' => '[email protected]', ), ); echo ArrayUtils::xmlEncode($uzivatele, 'uzivatele');
A výslednej XML:
<?xml version="1.0" encoding="UTF-8"?> <uzivatele> <administrator> <uzivatel_id>1</uzivatel_id> <jmeno>Jan Novák</jmeno> <email>[email protected]</email> </administrator> <redaktor> <uzivatel_id>2</uzivatel_id> <jmeno>Jana Nováková</jmeno> <email>[email protected]</email> </redaktor> </uzivatele>
Pozn .: Pri tvorbe XML z poľa sme samozrejme limitovaní tým, že každý kľúč môže byť v poli len raz. Niektoré XML teda poľom nevytvoríme, ale inokedy nám ušetrí veľa práce.
Pre úplnosť dodajme aj spätnú konverziu. Tentoraz využijeme malého hacku a to že metóda json_encode () dokáže prijímať objekt typu SimpleXMLElement. Výsledný JSON potom prevedieme na pole pomocou json_decode ():
public static function xmlDecode($xml) { $simpleXMLElement = simplexml_load_string($xml); $json = json_encode($simpleXMLElement); return json_decode($json, TRUE); }
A máme hotovo Kompletné a zdokumentovanú triedu nájdete ako vždy k stiahnutiu nižšie. Nabudúce, v lekcii Tvorba formulárového frameworku v PHP - Motivácia , sa pozrieme na formulárový framework.
Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami
Stiahnuté 329x (3.38 kB)
Aplikácia je vrátane zdrojových kódov v jazyku php