IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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__ban­kovni_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é 326x (3.38 kB)
Aplikácia je vrátane zdrojových kódov v jazyku php

 

Predchádzajúci článok
Knižnica ArrayUtils pre prácu s poľami v PHP
Všetky články v sekcii
Knižnice pre PHP
Preskočiť článok
(neodporúčame)
Tvorba formulárového frameworku v PHP - Motivácia
Článok pre vás napísal David Hartinger
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
David je zakladatelem ITnetwork a programování se profesionálně věnuje 15 let. Má rád Nirvanu, nemovitosti a svobodu podnikání.
Unicorn university David sa informačné technológie naučil na Unicorn University - prestížnej súkromnej vysokej škole IT a ekonómie.
Aktivity