API pro formuláře v drupalu je velmi mocný nástroj dovolující návrh, validaci, potvrzování formulářů. Snadno můžete elementy odebírat, přidávat, nebo upravovat. V následujících řádkách si něco o API povíme.
Ještě než se do tvorby pustíme nutno dodat, že následující návod platí pouze pro Drupal verze 6.x
Vytváření formulářůVeškeré formuláře vytváříme ve formátu polí. Vždy přiřazujeme určitému klíči jednotlivé hodnoty. Raději si to ukažme na příkladu, tento kus kódu zobrazí texotvý formulář: <?php '#type' => 'textfield', '#title' => t('bar'), '#default_value' => $object['foo'], '#size' => 60, '#maxlength' => 64, '#description' => t('baz'), ); ?>
%3C%3Fphp%0A%20%20%20%20%20%24form%5B%27foo%27%5D%20%3D%20array%28%0A%C2%A0%C2%A0%27%23type%27%20%3D%3E%20%27textfield%27%2C%20%0A%20%20%C2%A0%C2%A0%27%23title%27%20%3D%3E%20t%28%27bar%27%29%2C%0A%20%C2%A0%C2%A0%27%23default_value%27%20%3D%3E%20%24object%5B%27foo%27%5D%2C%0A%20%C2%A0%C2%A0%27%23size%27%20%3D%3E%2060%2C%0A%20%C2%A0%C2%A0%27%23maxlength%27%20%3D%3E%2064%2C%20%0A%20%C2%A0%C2%A0%27%23description%27%20%3D%3E%20t%28%27baz%27%29%2C%0A%29%3B%0A%3F%3E a k němu připojíme potvrzovací tlačítko <?php '#type' => 'submit', '#value' => t('Save'), ); ?>
%3C%3Fphp%0A%20%20%20%20%20%24form%5B%27submit%27%5D%20%3D%20array%28%0A%20%C2%A0%20%27%23type%27%20%3D%3E%20%27submit%27%2C%0A%20%C2%A0%C2%A0%27%23value%27%20%3D%3E%20t%28%27Save%27%29%2C%0A%29%3B%0A%3F%3E Nyní tedy pár poznámek ke kódu: Jméno elementu se deklaruje v poli $form, pole může být vícerozměrné, například takto: <div class="codeblock"> <?php $form['nastaveni_uctu']['uzivatelske_jmeno'];?>
%3Cdiv%20class%3D%22codeblock%22%3E%20%3C%3Fphp%0A%20%20%20%20%20%20%20%24form%5B%27nastaveni_uctu%27%5D%5B%27uzivatelske_jmeno%27%5D%3B%3F%3E Poté je název daného formulářového pole'uzivatelske_jmeno', tento klíč je poté k dispozici pod proměnou $form_state['values'] - Typ elementu se nachází pod klíčem #type
- Vlastnosti a atributy vždy začínají znakem # a vždy jsou to řetězce (string)
- Pořadí jednotlivých atributů a vlastností může být náhodné, a nemusí být vždy uvedeny všechny vlastnosti.
- Nepoužívejte vždy #value hodnotu, místo toho lze použít #default_value
Nyní se podíváme na složitější příklad využití formulářů: <?php function test_form($form_state) { // Access log settings: $options = array('1' => t ('Enabled'), '0' => t ('Disabled')); '#type' => 'fieldset', '#title' => t('Access log settings'), '#tree' => TRUE, ); $form['access']['log'] = array( '#type' => 'radios', '#title' => t('Log'), '#default_value' => variable_get('log', 0), '#options' => $options, '#description' => t('The log.'), ); $period = drupal_map_assoc (array(3600, 10800, 21600, 32400, 43200, 86400, 172800, 259200, 604800, 1209600, 2419200, 4838400, 9676800), 'format_interval'); $form['access']['timer'] = array( '#type' => 'select', '#title' => t('Discard logs older than'), '#default_value' => variable_get('timer', 259200), '#options' => $period, '#description' => t('The timer.'), ); // Description $form['details'] = array( '#type' => 'fieldset', '#title' => t('Details'), '#collapsible' => TRUE, '#collapsed' => TRUE, ); $form['details']['description'] = array( '#type' => 'textarea', '#title' => t('Describe it'), '#default_value' => variable_get('description', ''), '#cols' => 60, '#rows' => 5, '#description' => t('Log description.'), ); $form['details']['admin'] = array( '#type' => 'checkbox', '#title' => t('Only admin can view'), '#default_value' => variable_get('admin', 0), ); '#type' => 'textfield', '#title' => t('Name'), '#size' => 30, '#maxlength' => 64, '#description' => t('Enter the name for this group of settings'), ); $form['hidden'] = array('#type' => 'value', '#value' => 'is_it_here'); $form['submit'] = array('#type' => 'submit', '#value' => t ('Save')); return $form; } function test_page() { return drupal_get_form('test_form'); } ?>
%3C%3Fphp%0Afunction%20test_form%28%24form_state%29%20%7B%0A%20%C2%A0%C2%A0%2F%2F%20Access%20log%20settings%3A%0A%20%C2%A0%C2%A0%24options%20%3D%20array%28%271%27%20%3D%3E%20t%28%27Enabled%27%29%2C%20%270%27%20%3D%3E%20t%28%27Disabled%27%29%29%3B%0A%20%C2%A0%C2%A0%24form%5B%27access%27%5D%20%3D%20array%28%0A%20%C2%A0%C2%A0%C2%A0%20%27%23type%27%20%3D%3E%20%27fieldset%27%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23title%27%20%3D%3E%20t%28%27Access%20log%20settings%27%29%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23tree%27%20%3D%3E%20TRUE%2C%0A%20%C2%A0%C2%A0%29%3B%0A%20%C2%A0%C2%A0%24form%5B%27access%27%5D%5B%27log%27%5D%20%3D%20array%28%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23type%27%20%3D%3E%20%27radios%27%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23title%27%20%3D%3E%20t%28%27Log%27%29%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23default_value%27%20%3D%3E%C2%A0%C2%A0variable_get%28%27log%27%2C%200%29%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23options%27%20%3D%3E%20%24options%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23description%27%20%3D%3E%20t%28%27The%20log.%27%29%2C%0A%20%C2%A0%C2%A0%29%3B%0A%20%C2%A0%C2%A0%24period%20%3D%20drupal_map_assoc%28array%283600%2C%2010800%2C%2021600%2C%2032400%2C%2043200%2C%2086400%2C%20172800%2C%20259200%2C%20604800%2C%201209600%2C%202419200%2C%204838400%2C%209676800%29%2C%20%27format_interval%27%29%3B%0A%20%C2%A0%C2%A0%24form%5B%27access%27%5D%5B%27timer%27%5D%20%3D%20array%28%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23type%27%20%3D%3E%20%27select%27%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23title%27%20%3D%3E%20t%28%27Discard%20logs%20older%20than%27%29%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23default_value%27%20%3D%3E%20variable_get%28%27timer%27%2C%20259200%29%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23options%27%20%3D%3E%20%24period%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23description%27%20%3D%3E%20t%28%27The%20timer.%27%29%2C%0A%20%C2%A0%C2%A0%29%3B%0A%20%C2%A0%C2%A0%2F%2F%20Description%0A%20%C2%A0%C2%A0%24form%5B%27details%27%5D%20%3D%20array%28%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23type%27%20%3D%3E%20%27fieldset%27%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23title%27%20%3D%3E%20t%28%27Details%27%29%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23collapsible%27%20%3D%3E%20TRUE%2C%20%0A%20%C2%A0%20%C2%A0%C2%A0%27%23collapsed%27%20%3D%3E%20TRUE%2C%0A%20%C2%A0%C2%A0%29%3B%0A%20%C2%A0%C2%A0%24form%5B%27details%27%5D%5B%27description%27%5D%20%3D%20array%28%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23type%27%20%3D%3E%20%27textarea%27%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23title%27%20%3D%3E%20t%28%27Describe%20it%27%29%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23default_value%27%20%3D%3E%C2%A0%C2%A0variable_get%28%27description%27%2C%20%27%27%29%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23cols%27%20%3D%3E%2060%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23rows%27%20%3D%3E%205%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23description%27%20%3D%3E%20t%28%27Log%20description.%27%29%2C%0A%20%C2%A0%C2%A0%29%3B%0A%20%C2%A0%C2%A0%24form%5B%27details%27%5D%5B%27admin%27%5D%20%3D%20array%28%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23type%27%20%3D%3E%20%27checkbox%27%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23title%27%20%3D%3E%20t%28%27Only%20admin%20can%20view%27%29%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23default_value%27%20%3D%3E%20variable_get%28%27admin%27%2C%200%29%2C%0A%20%C2%A0%C2%A0%29%3B%0A%20%C2%A0%C2%A0%24form%5B%27name%27%5D%20%3D%20array%28%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23type%27%20%3D%3E%20%27textfield%27%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23title%27%20%3D%3E%20t%28%27Name%27%29%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23size%27%20%3D%3E%2030%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23maxlength%27%20%3D%3E%2064%2C%20%0A%20%C2%A0%C2%A0%C2%A0%C2%A0%27%23description%27%20%3D%3E%20t%28%27Enter%20the%20name%20for%20this%20group%20of%20settings%27%29%2C%0A%20%C2%A0%C2%A0%29%3B%0A%20%C2%A0%C2%A0%24form%5B%27hidden%27%5D%20%3D%20array%28%27%23type%27%20%3D%3E%20%27value%27%2C%20%27%23value%27%20%3D%3E%20%27is_it_here%27%29%3B%0A%20%C2%A0%C2%A0%24form%5B%27submit%27%5D%20%3D%20array%28%27%23type%27%20%3D%3E%20%27submit%27%2C%20%27%23value%27%20%3D%3E%20t%28%27Save%27%29%29%3B%0A%20%C2%A0%C2%A0return%20%24form%3B%0A%20%20%20%20%20%20%20%7D%0A%0Afunction%20test_page%28%29%20%7B%0A%20%C2%A0%C2%A0return%20drupal_get_form%28%27test_form%27%29%3B%0A%20%20%20%20%20%20%20%7D%0A%3F%3E Tento kus kódu ukazuje, jak mohou být formuláře vytvářeny v hierarchické struktuře rozšiřováním pole. Vidíme dvě funkce. První která vytváří formulář a druhá, která zobrazuje daný formulář pomocí funkce drupal_get_form(). Všimněme si, že první vrstva je ze dvou skupin 'acces' a 'details'. V každé skupine se nacházejí jednotlivé elementy. Pořadí konstrukce je zde důležité. Pořadí elementů v poli odpovídá následnému pořadí zobrazených prvků na stránkách. U skupin "acces" a "details" je parametr #type nastaven na fieldset Funkce drupal_get_form() je klíčová ve formulářovém API. Její použití je jednoduché. Má pouze jeden atribut. Je to řetězec, který je shodný s názvem funkce která tvoří jednotlivé prvky formuláře, v našem případě je název atributu test_form. drupal_get_form() obsluhuje následující věci: - Začíná celý proces vytváření formuláře
- Překládá $form['name'] položku do aktuálního formulářového elementu
- Odesílá formulář, pokud je je funkce pro odesílání formuláře deklarována
- Volá funkce pro šablonování formulářů, pokud byly vytvořeny
- Vrací HTML řetězec pro zobrazení formulářů
Šablonování formulářů Vytvářet vzhled formulářů je možné pomocí dvou základních metod: - První možností je vkládání přímo jednotlivých elementů jako atributy pole
- při vytváření takovýchto formulářů používáme #prefix a #sufix, jak už z názvu vyplývá, jedná se o element před a za formulářem, podívejme se na příklad:
<?php '#type' => 'fieldset', '#title' => t('Access log settings'), '#prefix' => '<div class="foo">', '#suffix' => '</div>', ); ?>
%3C%3Fphp%0A%24form%5B%27access%27%5D%20%3D%20array%28%0A%20%C2%A0%20%20%20%20%20%20%20%20%20%20%27%23type%27%20%3D%3E%20%27fieldset%27%2C%20%0A%20%C2%A0%C2%A0%27%23title%27%20%3D%3E%20t%28%27Access%20log%20settings%27%29%2C%20%0A%20%C2%A0%C2%A0%27%23prefix%27%20%3D%3E%20%27%3Cdiv%20class%3D%22foo%22%3E%27%2C%20%0A%20%C2%A0%C2%A0%27%23suffix%27%20%3D%3E%20%27%3C%2Fdiv%3E%27%2C%0A%29%3B%0A%3F%3E - Dále je zde typ #markup, který může být umístěn kamkoliv do formuláře, jeho hodnota pak bude rendrována ve specifikované pozici
<?php $form['div_tag'] = array('#type' => 'markup', '#value' => '<div class="foo">'); ?>
%3C%3Fphp%0A%20%24form%5B%27div_tag%27%5D%20%3D%20array%28%27%23type%27%20%3D%3E%20%27markup%27%2C%20%27%23value%27%20%3D%3E%20%27%3Cdiv%20class%3D%22foo%22%3E%27%29%3B%0A%3F%3E - Tento markup element je přístupný přes jeho jméno v poli (div_tag)
- Rozdělení jednotlivých značek do separátních funkcí.To je uděláno vytvořením šablonové funkce přiřazené k ID formuláře. V případě, že chcete jeden styl přiřazovat více formulářům, můžeme použít volitelný argument funkce drupal_get_form(), v tomto případě bude třetí argument funkce řetězec obsahující jméno funkce, která volá kód pro tvorbu formuláře. Zní to možná trochu nepřehledně, proto si raději ukažme příklad, který bude šablonou pro náší funkci test_form uvedenou o něco výše.
<?php function theme_test_form($form) { $output = ''; $output .= drupal_render($form['name']); $output .= '<div class="foo">'; $output .= drupal_render($form['access']); $output .= '<div class="bar">'; $output .= drupal_render($form['details']); $output .= '</div></div>'; $output .= drupal_render($form); return $output; } ?>
%3C%3Fphp%0Afunction%20theme_test_form%28%24form%29%20%7B%0A%20%C2%A0%C2%A0%24output%20%3D%20%27%27%3B%0A%20%C2%A0%C2%A0%24output%20.%3D%20drupal_render%28%24form%5B%27name%27%5D%29%3B%0A%20%C2%A0%C2%A0%24output%20.%3D%20%27%3Cdiv%20class%3D%22foo%22%3E%27%3B%0A%20%C2%A0%C2%A0%24output%20.%3D%20drupal_render%28%24form%5B%27access%27%5D%29%3B%0A%20%C2%A0%C2%A0%24output%20.%3D%20%27%3Cdiv%20class%3D%22bar%22%3E%27%3B%0A%20%C2%A0%C2%A0%24output%20.%3D%20drupal_render%28%24form%5B%27details%27%5D%29%3B%0A%20%C2%A0%C2%A0%24output%20.%3D%20%27%3C%2Fdiv%3E%3C%2Fdiv%3E%27%3B%0A%20%C2%A0%C2%A0%24output%20.%3D%20drupal_render%28%24form%29%3B%0A%20%C2%A0%C2%A0return%20%24output%3B%0A%20%20%20%20%20%20%20%7D%0A%3F%3E
Pár poznámek ke kódu: - funkce začíná prefixem theme_
- Má jeden argument, který je názvem pole, ve kterém je formulář
- Vytváříme a vracíme jeden dlouhý řetězec ($output)
- Forumláře jsou rendrovány pomocí funkce drupal_render
- Pokud pomocí funkce drupal_render vykreslujeme pole nastavené jako fieldset, budou vykresleny všechny elementy v pořadí, jaké je uvedeno ve funkci test_form
- Pořadí můžeme měnit voláním funkce drupal_render s argumentem $form['name'] v místě kde chceme prvek s názvem 'name' umístit
- Formulář může výt vykreslen pouze jednou.
To je k vytváření a šablonování formulářů vše. Příští článek bude o validování a odesílání formulářů Článek byl přeložen z oficiálních stránek drupal.org
|