# Vytvoření bankovní aplikace část 2: Vytvoření přihlašovacího a registračního formuláře
```mermaid
journey
title Vaše cesta vývojem formulářů
section Základy HTML
Pochopit prvky formuláře: 3: Student
Naučit se typy vstupů: 4: Student
Ovládnout přístupnost: 4: Student
section Integrace JavaScriptu
Zpracovat odeslání formuláře: 4: Student
Implementovat AJAX komunikaci: 5: Student
Zpracovat odpovědi serveru: 5: Student
section Validace systémů
Vytvořit vícestupňovou validaci: 5: Student
Zlepšit uživatelský zážitek: 5: Student
Zajistit integritu dat: 5: Student
```
## Přednáškový kvíz
[Přednáškový kvíz](https://ff-quizzes.netlify.app/web/quiz/43)
Už jste někdy vyplňovali formulář online a formulář vám odmítl váš formát e-mailu? Nebo jste ztratili všechny informace po kliknutí na odeslat? S těmito frustrujícími zážitky se setkal asi každý.
Formuláře jsou mostem mezi vašimi uživateli a funkcionalitou vaší aplikace. Stejně jako pečlivé protokoly, které používají letečtí dispečeři, aby bezpečně naváděli letadla na letiště, dobře navržené formuláře poskytují jasnou zpětnou vazbu a zabraňují nákladným chybám. Naopak špatné formuláře mohou uživatele odradit rychleji, než jakékoliv nedorozumění na rušném letišti.
V této lekci proměníme vaši statickou bankovní aplikaci v interaktivní aplikaci. Naučíte se stavět formuláře, které validují uživatelský vstup, komunikují se servery a poskytují užitečnou zpětnou vazbu. Přemýšlejte o tom jako o vytváření ovládacího rozhraní, které umožní uživatelům navigovat funkcemi vaší aplikace.
Na konci budete mít kompletní systém přihlášení a registrace s validací, která uživatele vede ke zdaru místo frustrace.
```mermaid
mindmap
root((Vývoj formulářů))
HTML Základy
Sémantické prvky
Typy vstupů
Přístupnost
Asociace štítků
Uživatelská zkušenost
Odezva validace
Prevence chyb
Stav načítání
Zprávy o úspěchu
Integrace JavaScriptu
Zpracování událostí
AJAX komunikace
Zpracování dat
Správa chyb
Validace vrstev
HTML5 validace
Logika na klientovi
Bezpečnost na serveru
Progresivní vylepšení
Moderní vzory
Fetch API
Async/Await
Form Data API
Zpracování Promise
```
## Předpoklady
Než začneme s tvorbou formulářů, ujistěme se, že máte vše správně nastaveno. Tato lekce navazuje přímo na předchozí, takže pokud jste přeskakovali dopředu, možná budete chtít se vrátit a nejprve zajistit, že základ funguje.
### Požadované nastavení
| Komponenta | Stav | Popis |
|-----------|--------|-------------|
| [HTML šablony](../1-template-route/README.md) | ✅ Požadováno | Základní struktura vaší bankovní aplikace |
| [Node.js](https://nodejs.org) | ✅ Požadováno | JavaScript runtime pro server |
| [Bankovní API server](../api/README.md) | ✅ Požadováno | Backendová služba pro ukládání dat |
> 💡 **Tip pro vývoj**: Budete současně spouštět dva oddělené servery – jeden pro front-end bankovní aplikace a druhý pro backend API. Toto nastavení odpovídá reálnému vývoji, kde frontend a backend služby fungují nezávisle.
### Konfigurace serveru
**Vaše vývojové prostředí bude obsahovat:**
- **Frontendový server**: Serveruje vaši bankovní aplikaci (obvykle port `3000`)
- **Backendový API server**: Zpracovává ukládání a načítání dat (port `5000`)
- **Oba servery** mohou běžet současně bez konfliktů
**Testování připojení k API:**
```bash
curl http://localhost:5000/api
# Očekávaná odpověď: "Bank API v1.0.0"
```
**Pokud vidíte odpověď s verzí API, můžete pokračovat!**
---
## Porozumění HTML formulářům a ovládacím prvkům
HTML formuláře jsou způsob, jak uživatelé komunikují s vaší webovou aplikací. Představte si je jako telegrafní systém, který v 19. století spojoval vzdálená místa – jsou to komunikační protokoly mezi záměrem uživatele a reakcí aplikace. Pokud jsou navrženy promyšleně, zachytí chyby, poradí s formátem vstupu a nabídnou užitečné návrhy.
Moderní formuláře jsou výrazně sofistikovanější než základní textová pole. HTML5 zavedlo specializované typy inputů, které automaticky řeší validaci e-mailu, formátování čísel a výběr datumu. Tyto vylepšení zlepšují přístupnost i uživatelskou zkušenost na mobilech.
### Základní prvky formuláře
**Stavební kameny, které každý formulář potřebuje:**
```html
```
**Co tento kód dělá:**
- **Vytvoří** kontejner formuláře s unikátním identifikátorem
- **Určí** HTTP metodu pro odeslání dat
- **Propojí** popisky s inputy pro přístupnost
- **Definuje** tlačítko pro odeslání formuláře
### Moderní typy vstupů a atributy
| Typ vstupu | Účel | Příklad použití |
|------------|---------|---------------|
| `text` | Obecný textový vstup | `` |
| `email` | Validace e-mailu | `` |
| `password` | Skrytý textový vstup | `` |
| `number` | Numerický vstup | `` |
| `tel` | Telefonní čísla | `` |
> 💡 **Výhoda moderního HTML5**: Použití konkrétních typů vstupů poskytuje automatickou validaci, vhodné klávesnice na mobilech a lepší podporu přístupnosti bez potřeby JavaScriptu navíc!
### Typy tlačítek a jejich chování
```html
```
**Co každý typ tlačítka dělá:**
- **Tlačítka submit**: Spustí odeslání formuláře a pošlou data na uvedený endpoint
- **Tlačítka reset**: Obnoví všechna pole formuláře do počátečního stavu
- **Běžná tlačítka**: Nemají žádné výchozí chování, vyžadují vlastní JavaScript
> ⚠️ **Důležitá poznámka**: Element `` je samo-uzavírací a nevyžaduje uzavírací tag. Moderní doporučený zápis je `` bez lomítka.
### Vytvoření přihlašovacího formuláře
Nyní vytvoříme praktický přihlašovací formulář, který ukáže moderní postupy tvorby HTML formulářů. Začneme základní strukturou a postupně přidáme prvky pro přístupnost a validaci.
```html
Bank App
Login
```
**Rozbor toho, co se zde děje:**
- **Strukturuje** formulář pomocí semantických HTML5 prvků
- **Seskupuje** související prvky do `div` kontejnerů s významnými třídami
- **Propojuje** popisky s inputy pomocí atributů `for` a `id`
- **Zahrnuje** moderní atributy jako `autocomplete` a `placeholder` pro lepší UX
- **Přidává** `novalidate` pro řízení validace pomocí JavaScriptu místo výchozích prohlížečových
### Síla správných popisků
**Proč jsou popisky důležité pro moderní webový vývoj:**
```mermaid
graph TD
A[Popisek prvku] --> B[Podpora čtečky obrazovky]
A --> C[Rozšíření cíle kliknutí]
A --> D[Validace formuláře]
A --> E[Výhody pro SEO]
B --> F[Přístupné pro všechny uživatele]
C --> G[Lepší mobilní zážitek]
D --> H[Jasné chybové zprávy]
E --> I[Lepší pozice ve vyhledávání]
```
**Co správné popisky přináší:**
- **Umožňuje** čtečkám obrazovky jasně oznámit pole formuláře
- **Zvětšuje** klickující oblast (kliknutí na popisek zaostří input)
- **Zlepšuje** použitelnost na mobilech s většími dotykovými oblastmi
- **Podporuje** validaci s významnými chybovými hláškami
- **Zvyšuje** SEO poskytnutím sémantického významu prvkům formuláře
> 🎯 **Cíl přístupnosti**: Každý vstup ve formuláři by měl mít přiřazený popisek. Tento jednoduchý zvyk dělá formuláře použitelnými pro všechny, včetně uživatelů s handicapem, a zlepšuje zážitek pro všechny.
### Vytvoření registračního formuláře
Registrační formulář vyžaduje podrobnější údaje pro vytvoření kompletního uživatelského účtu. Postavme ho s využitím moderních HTML5 funkcí a lepší přístupností.
```html
Register
```
**Výše jsme:**
- **Uspořádali** každé pole do kontejnerů `div` pro lepší stylování a rozvržení
- **Přidali** vhodné atributy `autocomplete` pro podporu automatického vyplňování
- **Zařadili** užitečné výplňové texty (placeholder), které uživatele vedou
- **Nastavili** smysluplné výchozí hodnoty pomocí atributu `value`
- **Použili** validační atributy jako `required`, `maxlength` a `min`
- **Využili** `type="number"` pro pole saldo s podporou desetinných čísel
### Prozkoumání typů vstupů a jejich chování
**Moderní typy vstupů zlepšují funkcionalitu:**
| Funkce | Výhoda | Příklad |
|---------|---------|----------|
| `type="number"` | Numerická klávesnice na mobilu | Usnadňuje zadání zůstatku |
| `step="0.01"` | Kontrola desetinných míst | Umožňuje haléře u měny |
| `autocomplete` | Automatické doplňování prohlížečem | Rychlejší vyplňování formuláře |
| `placeholder` | Kontextové nápovědy | Vedou uživatele k správnému formátu |
> 🎯 **Výzva přístupnosti**: Zkuste formuláře obsáhnout pouze klávesnicí! Použijte `Tab` pro přechod mezi poli, `Space` pro zaškrtnutí políček a `Enter` pro odeslání. Tento test vám pomůže pochopit, jak s formuláři pracují uživatelé čteček obrazovky.
### 🔄 **Pedagogická kontrola**
**Porozumění základům formulářů**: Před implementací JavaScriptu si ověřte:
- ✅ Jak semantické HTML vytváří přístupné struktury formulářů
- ✅ Proč typy vstupů jsou důležité pro mobilní klávesnice a validaci
- ✅ Vztah mezi popisky a ovládacími prvky formuláře
- ✅ Jak atributy formuláře ovlivňují výchozí chování prohlížeče
**Krátký sebetest**: Co se stane, když odešlete formulář bez JavaScriptové obsluhy?
*Odpověď: Prohlížeč provede výchozí odeslání, obvykle přesměrováním na URL z atributu action*
**Výhody HTML5 formulářů**: Moderní formuláře nabízejí:
- **Vestavěnou validaci**: Automatickou kontrolu formátu e-mailu a čísel
- **Optimalizaci pro mobily**: Vhodné klávesnice pro různé typy vstupů
- **Přístupnost**: Podporu čteček obrazovky a navigace klávesnicí
- **Postupné vylepšování**: Fungují i při vypnutém JavaScriptu
## Porozumění metodám odesílání formulářů
Když uživatel vyplní váš formulář a stiskne odeslat, data musí někam jít – obvykle na server, který je uloží. Existuje několik způsobů, jak to může proběhnout, a znát, který použít, vám může později ušetřit problémy.
Podívejme se, co se vlastně stane po kliknutí na tlačítko odeslat.
### Výchozí chování formuláře
Nejdříve si ukažme, co se stane při základním odeslání formuláře:
**Otestujte své formuláře:**
1. Klikněte na tlačítko *Registrace* ve vašem formuláři
2. Sledujte změny v adresním řádku prohlížeče
3. Všimněte si, jak se stránka znovu načte a data jsou v URL

### Porovnání HTTP metod
```mermaid
graph TD
A[Odeslání formuláře] --> B{HTTP Metoda}
B -->|GET| C[Data v URL]
B -->|POST| D[Data v těle požadavku]
C --> E[Viditelné v adresním řádku]
C --> F[Omezená velikost dat]
C --> G[Možnost uložit do záložek]
D --> H[Skryté z URL]
D --> I[Velká kapacita dat]
D --> J[Bezpečnější]
```
**Pochopení rozdílů:**
| Metoda | Případ použití | Umístění dat | Úroveň zabezpečení | Limit velikosti |
|--------|----------|---------------|----------------|-------------|
| `GET` | Vyhledávací dotazy, filtry | Parametry v URL | Nízká (viditelná) | cca 2000 znaků |
| `POST` | Uživatelské účty, citlivá data | Tělo požadavku | Vyšší (skrytá) | Prakticky neomezený |
**Základní rozdíly:**
- **GET**: Přidává data formuláře do URL jako parametry (vhodné pro vyhledávání)
- **POST**: Posílá data v těle požadavku (nutné pro citlivé informace)
- **Omezení GET**: Omezení velikosti, viditelnost dat, ukládání do historie prohlížeče
- **Výhody POST**: Větší kapacita dat, ochrana soukromí, podpora nahrávání souborů
> 💡 **Doporučený postup:** Pro vyhledávací formuláře a filtry používejte `GET`, pro registraci uživatelů, přihlašování a tvorbu dat používejte `POST`.
### Konfigurace odeslání formuláře
Nakonfigurujme váš registrační formulář tak, aby správně komunikoval s backendovým API pomocí metody POST:
```html
```
**Co vylepšená validace obsahuje:**
- **Kombinuje** indikátory povinných polí s užitečnými popisy
- **Zahrnuje** atributy `pattern` pro kontrolu formátu
- **Poskytuje** atributy `title` pro přístupnost a tooltipy
- **Přidává** pomocný text pro usměrnění uživatele
- **Používá** sémantickou HTML strukturu pro lepší přístupnost
### Pokročilá validační pravidla
**Co jednotlivá pravidla validace dělají:**
| Pole | Pravidla validace | Uživatelský přínos |
|-------|-------------------|--------------------|
| Uživatelské jméno | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | Zajišťuje platné a unikátní identifikátory |
| Měna | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | Přijímá běžné měnové symboly |
| Stav účtu | `min="0"`, `step="0.01"`, `type="number"` | Zabraňuje záporným stavům |
| Popis | `maxlength="100"` | Rozumné omezení délky |
### Testování chování validace
**Vyzkoušejte tyto validační scénáře:**
1. **Odešlete** formulář s prázdnými povinnými poli
2. **Zadejte** uživatelské jméno kratší než 3 znaky
3. **Zkuste** speciální znaky v poli uživatelského jména
4. **Zadejte** zápornou částku stavu účtu

**Co uvidíte:**
- **Prohlížeč zobrazí** nativní validační zprávy
- **Styling se změní** podle stavů `:valid` a `:invalid`
- **Odeslání formuláře** je zablokováno, dokud všechny validace neprojdou
- **Fokus se automaticky** přesune na první neplatné pole
### Validace na klientské a serverové straně
```mermaid
graph LR
A[Validace na straně klienta] --> B[Okamžitá zpětná vazba]
A --> C[lepší uživatelský zážitek]
A --> D[Snížené zatížení serveru]
E[Validace na straně serveru] --> F[Bezpečnost]
E --> G[Integrita dat]
E --> H[Obchodní pravidla]
A -.-> I[Oboje nutné]
E -.-> I
```
**Proč potřebujete obě vrstvy:**
- **Klientská validace**: Poskytuje okamžitou zpětnou vazbu a zlepšuje uživatelský zážitek
- **Serverová validace**: Zajišťuje bezpečnost a zvládá složité obchodní pravidla
- **Kombinovaný přístup**: Vyvíjí robustní, uživatelsky přívětivé a bezpečné aplikace
- **Postupné vylepšování**: Funguje i bez JavaScriptu
> 🛡️ **Bezpečnostní připomínka**: Nikdy nespoléhejte pouze na klientskou validaci! Zlovolní uživatelé mohou obejít kontroly na klientovi, proto je serverová validace nezbytná pro bezpečnost a integritu dat.
### ⚡ **Co můžete stihnout za 5 minut**
- [ ] Otestovat formulář se špatnými daty a sledovat validační zprávy
- [ ] Zkusit odeslat formulář s vypnutým JavaScriptem a zkontrolovat HTML5 validaci
- [ ] Otevřít nástroje pro vývojáře a zkontrolovat odesílaná data
- [ ] Experimentovat s různými typy vstupů a sledovat změny mobilní klávesnice
### 🎯 **Co zvládnete během této hodiny**
- [ ] Dokončit kvíz po lekci a pochopit koncepty zpracování formulářů
- [ ] Implementovat komplexní validaci s okamžitou zpětnou vazbou
- [ ] Přidat CSS stylování pro profesionálně vypadající formuláře
- [ ] Vytvořit zpracování chyb pro duplicitní uživatelská jména a chyby serveru
- [ ] Přidat pole pro potvrzení hesla s odpovídající validací
### 📅 **Váš týdenní plán zvládnutí formulářů**
- [ ] Dokončit kompletní bankovní aplikaci s pokročilými funkcemi formulářů
- [ ] Implementovat možnost nahrávání souborů pro profilové fotografie či dokumenty
- [ ] Přidat vícestupňové formuláře s indikátory postupu a správou stavu
- [ ] Vytvořit dynamické formuláře, které se přizpůsobují na základě výběrů uživatele
- [ ] Zajistit automatické ukládání a obnovu formulářů pro lepší UX
- [ ] Přidat pokročilou validaci jako ověřování emailu a formátování telefonních čísel
### 🌟 **Měsíční plán zvládnutí frontend vývoje**
- [ ] Vyvíjet komplexní formulářové aplikace s podmíněnou logikou a workflow
- [ ] Naučit se knihovny a frameworky pro rychlý vývoj formulářů
- [ ] Ovládnout zásady přístupnosti a inkluzivního designu
- [ ] Implementovat internacionalizaci a lokalizaci formulářů
- [ ] Vytvářet znovupoužitelné knihovny komponent a designové systémy
- [ ] Přispívat do open source projektů zaměřených na formuláře a sdílet osvědčené postupy
## 🎯 Časová osa vašeho zvládnutí vývoje formulářů
```mermaid
timeline
title Vývoj formulářů & průběh učení uživatelského zážitku
section Základy HTML (15 minut)
Sémantické formuláře: Prvky formuláře
: Typy vstupů
: Štítky a přístupnost
: Postupné zlepšování
section Integrace JavaScriptu (25 minut)
Zpracování událostí: Odeslání formuláře
: Sbírání dat
: AJAX komunikace
: Async/await vzory
section Validacní systémy (35 minut)
Vícevrstvá bezpečnost: Validace HTML5
: Logika na straně klienta
: Ověření na straně serveru
: Zpracování chyb
section Uživatelský zážitek (45 minut)
Vylepšení rozhraní: Stav načítání
: Zprávy o úspěchu
: Obnova po chybě
: Funkce přístupnosti
section Pokročilé vzory (1 týden)
Profesionální formuláře: Dynamická validace
: Vícekrokové pracovní postupy
: Nahrávání souborů
: Zpětná vazba v reálném čase
section Firemní dovednosti (1 měsíc)
Produkční aplikace: Knihovny formulářů
: Testovací strategie
: Optimalizace výkonu
: Nejlepší praxe v bezpečnosti
```
### 🛠️ Shrnutí nástrojů pro vývoj formulářů
Po dokončení této lekce ovládáte:
- **HTML5 formuláře**: Sémantická struktura, typy vstupů a přístupnost
- **JavaScriptové zpracování formulářů**: Správa událostí, sběr dat a AJAX komunikace
- **Architekturu validace**: Vícevrstevná validace pro bezpečnost a UX
- **Asynchronní programování**: Moderní fetch API a vzory async/await
- **Řízení chyb**: Komplexní zpracování chyb a systémy zpětné vazby
- **Návrh uživatelského zážitku**: Stavy načítání, zprávy o úspěchu a obnovení po chybách
- **Postupné vylepšování**: Formuláře fungující ve všech prohlížečích a podmínkách
**Praktické použití**: Vaše dovednosti použijete v:
- **E-commerce aplikacích**: Procesy nákupu, registrace a formuláře plateb
- **Podnikových softwarech**: Systémy pro zadávání dat, reportování a workflow
- **Systémech pro správu obsahu**: Publikační platformy, uživatelsky generovaný obsah administrace
- **Finančních aplikacích**: Bankovní rozhraní, investiční platformy, transakční systémy
- **Zdravotních systémech**: Portály pacientů, plánování schůzek, lékařské formuláře
- **Vzdělávacích platformách**: Registrace kurzů, nástroje pro hodnocení a LMS
**Získané profesionální dovednosti**: Umíte nyní:
- **Navrhovat** přístupné formuláře fungující pro všechny uživatele, včetně handicapovaných
- **Implementovat** bezpečnou validaci zamezující poškození dat a bezpečnostním rizikům
- **Vytvářet** responzivní UI s jasnou zpětnou vazbou a vedením uživatele
- **Ladit** komplexní interakce formulářů pomocí nástrojů pro vývojáře a analýzy sítě
- **Optimalizovat** výkon formulářů pomocí efektivní správy dat a validace
**Ovládnuté koncepty frontendového vývoje**:
- **Architektura řízená událostmi**: Zpracování uživatelských akcí a systém reflexí
- **Asynchronní programování**: Nezablokující komunikace se serverem a zpracování chyb
- **Validace dat**: Bezpečnostní a integritní kontroly na klientovi i serveru
- **Návrh UX**: Intuitivní rozhraní vedoucí uživatele k úspěchu
- **Inženýrství přístupnosti**: Inkluzivní design vhodný pro různorodé potřeby uživatelů
**Další krok**: Jste připraveni prozkoumat pokročilé knihovny formulářů, implementovat složitá validační pravidla nebo budovat podnikové systémy sběru dat!
🌟 **Ocenění získáno**: Vytvořili jste kompletní systém zpracování formulářů s profesionální validací, zpracováním chyb a vzory zpětné vazby!
---
---
## Výzva GitHub Copilot Agenta 🚀
Použijte režim Agenta k dokončení následující výzvy:
**Popis:** Vylepšete registrační formulář o komplexní klientskou validaci a zpětnou vazbu uživatele. Tato výzva vám pomůže procvičit validaci formulářů, zpracování chyb a zlepšení uživatelské zkušenosti s interaktivní zpětnou vazbou.
**Vyžádání:** Vytvořte kompletní systém ověřování formuláře pro registrační formulář, který zahrnuje: 1) Aktivní zpětnou vazbu ověřování pro každé pole během psaní uživatele, 2) Vlastní validační zprávy, které se zobrazují pod každým vstupním polem, 3) Pole pro potvrzení hesla s ověřováním shody, 4) Vizuální indikátory (například zelené fajfky pro platná pole a červená varování pro neplatná pole), 5) Tlačítko odeslání, které se aktivuje pouze, když všechny validace projdou. Použijte atributy HTML5 pro validaci, CSS pro stylování stavů validace a JavaScript pro interaktivní chování.
Více informací o [režimu agenta](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) najdete zde.
## 🚀 Výzva
Zobrazte chybovou zprávu v HTML, pokud uživatel již existuje.
Zde je příklad, jak může finální přihlašovací stránka vypadat po malé úpravě stylů:

## Kvíz po přednášce
[Kvíz po přednášce](https://ff-quizzes.netlify.app/web/quiz/44)
## Přehled a samostudium
Vývojáři jsou velmi kreativní ve svých snahách o tvorbu formulářů, zejména pokud jde o strategie validace. Prozkoumejte různé způsoby vytváření formulářů prohlížením [CodePen](https://codepen.com); dokážete najít nějaké zajímavé a inspirativní formuláře?
## Zadání
[Stylujte svou bankovní aplikaci](assignment.md)
---
**Disclaimer**:
Tento dokument byl přeložen pomocí AI překladatelské služby [Co-op Translator](https://github.com/Azure/co-op-translator). Přestože usilujeme o přesnost, mějte prosím na paměti, že automatizované překlady mohou obsahovat chyby nebo nepřesnosti. Originální dokument v jeho rodném jazyce by měl být považován za autoritativní zdroj. Pro zásadní informace se doporučuje profesionální lidský překlad. Nejsme odpovědní za jakékoli nedorozumění nebo nesprávné interpretace vyplývající z použití tohoto překladu.