Práce s poli
Jste zde
Pro přehlednost si nejprve namísto objektu $user
vypište pouze jeho uživatelské role:
global $user; //dpm($user); $roles = $user->roles; //Vypíšeme strukturu pole $roles pomocí funkce dpm() dpm($roles);
Pokud pracujete s čistou instalací Drupalu a jste přihlášeni jako hlavní administrátor webu, aniž byste přidávali další role, bude výstup (po rozbalení) vypadat jako na obrázku:
Teď si nejprve ukážeme, jak vypsat názvy jednotlivých rolí, což ozřejmí strukturu pole. K roli authenticated user se dostaneme následovně:
global $user; //dpm($user); $roles = $user->roles; //Vypíšeme strukturu pole $roles pomocí funkce dpm() dpm($roles); print $roles[2];
Výsledek:
Jistě pro vás nebude problém odvodit si, jak analogicky vypsat název druhé role (namísto čísla 2
uvedete 3
). Ne nadarmo se číslu v hranaté závorce říká klíč. Můžete si to klidně představit tak, že skutečně slouží k „odemknutí“ hodnoty - jinak se k ní nedostanete.
V našem příkladu s rolemi máme pole, které obsahuje 2 hodnoty (jsou to data typu string). Každá z nich má unikátní klíč (v tomto případě číslo):
2
- klíč pro authenticated user
3
- klíč pro administrator
Výpis pole pomocí funkce dpm()
všechny tyto informace obsahuje, navíc velmi přehledně uspořádané.
Kde se v Drupalu vzaly klíče k jednotlivým hodnotám uživatelských rolí? V tomto případě jsou klíče unikátní identifikační čísla rolí, označovaná zkratkou RID. Toto číslo Drupal přiděluje každé (původní i nově vytvořené) roli.
Výstup našeho příkladu s výpisem rolí zatím není moc užitečný - pouze nám řekne, jaká role patří k určitému klíči. To v praxi potřebujeme jen málokdy. Lepší by bylo například vypsat všechny role uživatele, nebo zjistit, zda má určitou roli (např., zda je administrátor). Ovšem dříve než se do toho pustíme, je třeba doplnit ještě pár informací o struktuře polí a o tom, jak mohou vypadat.
Zkusíme si pro srovnání vytvořit nějaké velmi podobné pole, popisující třeba funkce v týmu (v tuto chvíli nemá nic společného s Drupalem, je to jen příklad na procvičení polí v PHP). Zároveň si ukážeme, jak se pole vytvářejí. Nové pole nazveme $my_roles
.
Nejprve jej vytvoříme tak, aby mělo naprosto stejný obsah, jako pole $roles
z předchozího příkladu, a vypíšeme opět pomocí dpm()
.
<?php $my_roles = array( '2' => 'authenticated user', '3' => 'administrator', ); dpm($my_roles); ?>
Pokud si vypíšete pole $roles
a $my_roles
za sebe, měli byste vidět 2 stejné výsledky.
Nyní si vyzkoušejte, že hodnotám můžete přiřadit libovolný klíč v podobě řetězce:
<?php $my_roles = array( 'prvni-role' => 'authenticated user', 'druha-role' => 'administrator', ); dpm($my_roles); ?>
Výsledek:
A dále si vyzkoušejte, co se stane, když hodnotám žádné klíče nepřiřadíte:
<?php $my_roles = array('authenticated user','administrator'); dpm($my_roles); ?>
Výsledek:
Jak vidíte, klíče k hodnotám pole se vytvořily automaticky, přičemž tvoří vzestupnou číselnou řadu, která začíná nulou. Protože s vypisováním hodnot z podobně vytvořených polí se setkáte velmi často, zapamatujte si: číslování začíná od nuly, proto:
Pro výpis první hodnoty v pořadí zadáte: print $nejake_pole[0];
Pro výpis druhé hodnoty v pořadí zadáte: php print $nejake_pole[1];
... atd.
V PHP existují 2 druhy klíčů - číselné a asociativní. Zatímco číselné klíče vyjadřují pouze pořadí prvku v poli (nemají k němu žádný další vztah ani nenesou žádný další význam), asociativní klíče se nějak vztahují k prvku, ke kterému patří.
Vraťme se zpět k poli $roles
, které obsahuje role uživatele v Drupalu: má toto pole číselné, nebo asociativní klíče?
Správná odpověď zní: asociativní, přestože jsou to čísla. Mají totiž význam ve vztahu k jednotlivým prvkům - označují vždy RID příslušné role. Pochopit rozdíl je důležité k tomu, abyste uměli s různými poli dobře pracovat.
Neřekli jsme, ještě, že číselné klíče v PHP začínají vždy od nuly, ale to už by byla příliš silná nápověda :-)
Vícerozměrná pole
Při práci s PHP kódem a s Drupalem se velmi často setkáte s tzv. vícerozměrnými poli. Jsou to pole, kde prvky nejsou jednoduché hodnoty, ale opět další pole. Zkusme se podívat na příklad z Drupalu, tentokrát z uzlu (objekt $node
).
Ve vaší testovací instalaci Drupalu upravte typ obsahu Článek (article): pro pole field_image
povolte neomezený počet hodnot.
Nyní vytvořte testovací článek (typ article) a do pole pro obrázek vložte 2 pokusné obrázky. Uložte. Klikněte na záložku Devel.
Uvnitř struktury objektu $node
, který se vám zobrazuje, rozklikněte všechny části, které jsou ukryty pod odkazem field_image
. Dostanete stejnou strukturu, jako je na obrázku (pochopitelně s odlišnými daty):
Obrázek znázorňuje příklad vícerozměrného pole. Projděme si jeho strukturu:
Hodnota field_image
je pole, které obsahuje hodnoty pro různé jazyky. V našem případě má pouze jeden prvek s klíčem und
(znamená undefined - tedy nedefinovaný jazyk). Jeho hodnotou je další pole s jednotlivými obrázky. Toto pole má číselné klíče - používá se automatické číslování od 0
. Prvků je tolik, kolik obrázků jste nahráli. Každá z hodnot je sama o sobě další pole, které obsahuje jednotlivé informace o obrázku (fid
- číslo souboru, alt
, title
... atd.).
Ke stejné struktuře dospějete, když si vypíšete pouze pole s obrázky, pomocí následujícího kódu (bude to částečně opakování práce s objekty, seznámíte se však s jednou novou funkcí):
//Nejprve si zjistěte NID uzlu, kam jste nahráli obrázky. V našem příkladu je to 2, vy použijte skutečné NID z vašeho webu. //Nyní načteme celý objekt uzlu pomocí známého NID a funkce node_load() $node = node_load(2); //Získáme obsah pole field_image, což je část objektu $node $images = $node->field_image; //Vypíšeme strukturu proměnné $images, což je pole dpm($images);
Výstupem je stejná struktura jako na předchozím obrázku (pochopitelně - zobrazili jsme stejná data, pouze jsme vynechali zobrazení ostatních částí objektu $node
).
Vypsání hodnot vícerozměrného pole
V principu se neliší od vypsání hodnot jednorozměrného pole. V syntaxi pouze vypisujete klíče za sebou tak dlouho, až se „prokoušete“ strukturou pole k požadované hodnotě:
$hodnota = $pole[KLÍČ1][KLÍČ2][KLÍČ3][...];
Budeme chtít například vypsat velikost prvního obrázku:
//Nejprve si zjistěte NID uzlu, kam jste nahráli obrázky. V našem příkladu je to 2, vy použijte skutečné NID z vašeho webu. //Nyní načteme celý objekt uzlu pomocí známého NID a funkce node_load() $node = node_load(2); //Získáme obsah pole field_image, což je část objektu $node $images = $node->field_image; //Vypíšeme strukturu proměnné $images dpm($images); $image_size = $images['und'][0]['filesize']; print 'Velikost prvního obrázku: ' . $image_size;
Všimněte si, že klíče, které jsou zadány jako řetězce, musí být uvedeny v apostrofech.
Získat jednotlivé hodnoty z pole už tedy umíte. V následující části se naučíte, jak projít všechny prvky pole.