# בניית אפליקציית בנקאות חלק 2: יצירת טופס כניסה והרשמה
## שאלון לפני השיעור
[שאלון לפני השיעור](https://ff-quizzes.netlify.app/web/quiz/43)
האם אי פעם מילאתם טופס אונליין והוא דחה את פורמט האימייל שלכם? או איבדתם את כל המידע כשניסיתם לשלוח אותו? כולנו נתקלנו בחוויות מתסכלות כאלה.
טפסים הם הגשר בין המשתמשים שלכם לבין הפונקציונליות של האפליקציה שלכם. כמו הפרוטוקולים המדויקים שמשתמשים בהם פקחי טיסה כדי להנחות מטוסים בבטחה ליעדם, טפסים מעוצבים היטב מספקים משוב ברור ומונעים טעויות יקרות. טפסים גרועים, לעומת זאת, יכולים להרחיק משתמשים מהר יותר מאי הבנה בשדה תעופה עמוס.
בשיעור הזה, נהפוך את אפליקציית הבנקאות הסטטית שלכם לאפליקציה אינטראקטיבית. תלמדו לבנות טפסים שמאמתים את קלט המשתמש, מתקשרים עם שרתים ומספקים משוב מועיל. חשבו על זה כעל בניית ממשק שליטה שמאפשר למשתמשים לנווט בתכונות האפליקציה שלכם.
בסיום השיעור, תהיה לכם מערכת כניסה והרשמה מלאה עם אימות שמכוונת את המשתמשים להצלחה במקום לתסכול.
## דרישות מוקדמות
לפני שנתחיל לבנות טפסים, בואו נוודא שהכל מוגדר כראוי. השיעור הזה ממשיך בדיוק מהמקום שבו עצרנו בשיעור הקודם, אז אם דילגתם קדימה, אולי כדאי לחזור אחורה ולהפעיל את הבסיס קודם.
### הגדרות נדרשות
| רכיב | סטטוס | תיאור |
|------|-------|-------|
| [תבניות HTML](../1-template-route/README.md) | ✅ נדרש | מבנה בסיסי של אפליקציית הבנקאות שלכם |
| [Node.js](https://nodejs.org) | ✅ נדרש | סביבת ריצה של JavaScript לשרת |
| [שרת API של הבנק](../api/README.md) | ✅ נדרש | שירות אחורי לאחסון נתונים |
> 💡 **טיפ לפיתוח**: תפעילו שני שרתים נפרדים בו-זמנית – אחד לאפליקציית הבנקאות הקדמית שלכם ואחד לשרת ה-API האחורי. הגדרה זו משקפת פיתוח בעולם האמיתי שבו שירותי קדימה ואחורה פועלים באופן עצמאי.
### הגדרת שרת
**סביבת הפיתוח שלכם תכלול:**
- **שרת קדמי**: מספק את אפליקציית הבנקאות שלכם (בדרך כלל פורט `3000`)
- **שרת API אחורי**: מטפל באחסון ושליפת נתונים (פורט `5000`)
- **שני השרתים** יכולים לפעול בו-זמנית ללא התנגשויות
**בדיקת חיבור ה-API שלכם:**
```bash
curl http://localhost:5000/api
# Expected response: "Bank API v1.0.0"
```
**אם אתם רואים את תגובת גרסת ה-API, אתם מוכנים להמשיך!**
---
## הבנת טפסי HTML ושליטה
טפסי HTML הם הדרך שבה משתמשים מתקשרים עם האפליקציה שלכם. חשבו עליהם כמערכת הטלגרף שחיברה מקומות רחוקים במאה ה-19 – הם פרוטוקול התקשורת בין כוונת המשתמש לתגובת האפליקציה. כאשר הם מעוצבים בצורה מחושבת, הם תופסים טעויות, מנחים את עיצוב הקלט ומספקים הצעות מועילות.
טפסים מודרניים מתקדמים בהרבה מקלטי טקסט בסיסיים. HTML5 הציגה סוגי קלט מיוחדים שמטפלים באימות אימייל, עיצוב מספרים ובחירת תאריכים באופן אוטומטי. שיפורים אלה מועילים גם לנגישות וגם לחוויות משתמשים ניידים.
### רכיבי טופס חיוניים
**אבני הבניין שכל טופס צריך:**
```html
```
**מה הקוד הזה עושה:**
- **יוצר** מיכל טופס עם מזהה ייחודי
- **מציין** את שיטת HTTP לשליחת נתונים
- **מקשר** תוויות עם קלטים לנגישות
- **מגדיר** כפתור שליחה לעיבוד הטופס
### סוגי קלט מודרניים ותכונות
| סוג קלט | מטרה | דוגמת שימוש |
|---------|------|------------|
| `text` | קלט טקסט כללי | `` |
| `email` | אימות אימייל | `` |
| `password` | קלט טקסט מוסתר | `` |
| `number` | קלט מספרי | `` |
| `tel` | מספרי טלפון | `` |
> 💡 **יתרון HTML5 מודרני**: שימוש בסוגי קלט ספציפיים מספק אימות אוטומטי, מקלדות ניידות מתאימות ותמיכה טובה יותר בנגישות ללא JavaScript נוסף!
### סוגי כפתורים והתנהגותם
```html
```
**מה כל סוג כפתור עושה:**
- **כפתורי שליחה**: מפעילים שליחת טופס ושולחים נתונים לנקודת הקצה שצוינה
- **כפתורי איפוס**: משחזרים את כל שדות הטופס למצבם ההתחלתי
- **כפתורים רגילים**: אינם מספקים התנהגות ברירת מחדל ודורשים JavaScript מותאם אישית לפונקציונליות
> ⚠️ **הערה חשובה**: אלמנט `` הוא סגור בעצמו ואינו דורש תג סגירה. הפרקטיקה המודרנית היא לכתוב `` ללא הסלאש.
### יצירת טופס כניסה
עכשיו ניצור טופס כניסה מעשי שמדגים את שיטות העבודה המודרניות של טפסי HTML. נתחיל עם מבנה בסיסי ונשפר אותו בהדרגה עם תכונות נגישות ואימות.
```html
Bank App
Login
```
**פירוט מה קורה כאן:**
- **מארגן** את הטופס עם אלמנטים סמנטיים של HTML5
- **מקבץ** אלמנטים קשורים באמצעות מיכלי `div` עם מחלקות משמעותיות
- **מקשר** תוויות עם קלטים באמצעות תכונות `for` ו-`id`
- **כולל** תכונות מודרניות כמו `autocomplete` ו-`placeholder` לחוויית משתמש טובה יותר
- **מוסיף** `novalidate` כדי לטפל באימות עם JavaScript במקום ברירת המחדל של הדפדפן
### כוחם של תוויות נכונות
**מדוע תוויות חשובות לפיתוח ווב מודרני:**
```mermaid
graph TD
A[Label Element] --> B[Screen Reader Support]
A --> C[Click Target Expansion]
A --> D[Form Validation]
A --> E[SEO Benefits]
B --> F[Accessible to all users]
C --> G[Better mobile experience]
D --> H[Clear error messaging]
E --> I[Better search ranking]
```
**מה תוויות נכונות משיגות:**
- **מאפשרות** לקוראי מסך להכריז על שדות הטופס בצורה ברורה
- **מרחיבות** את שטח הלחיצה (לחיצה על התווית ממקדת את הקלט)
- **משפרות** את השימושיות בנייד עם מטרות מגע גדולות יותר
- **תומכות** באימות טופס עם הודעות שגיאה משמעותיות
- **משפרות** SEO על ידי מתן משמעות סמנטית לאלמנטים של הטופס
> 🎯 **מטרה לנגישות**: כל קלט טופס צריך להיות מקושר לתווית. פרקטיקה פשוטה זו הופכת את הטפסים שלכם לשימושיים עבור כולם, כולל משתמשים עם מוגבלויות, ומשפרת את החוויה עבור כל המשתמשים.
### יצירת טופס ההרשמה
טופס ההרשמה דורש מידע מפורט יותר כדי ליצור חשבון משתמש מלא. בואו נבנה אותו עם תכונות HTML5 מודרניות ונגישות משופרת.
```html
Register
```
**בקטע הקוד לעיל:**
- **ארגנו** כל שדה במיכלי div לשיפור העיצוב והפריסה
- **הוספנו** תכונות `autocomplete` מתאימות לתמיכה במילוי אוטומטי של הדפדפן
- **כללנו** טקסט עזר ב-`placeholder` להנחיית קלט המשתמש
- **הגדרנו** ערכי ברירת מחדל באמצעות תכונת `value`
- **יישמנו** תכונות אימות כמו `required`, `maxlength`, ו-`min`
- **השתמשנו** ב-`type="number"` לשדה היתרה עם תמיכה בעשרונים
### חקר סוגי קלט והתנהגותם
**סוגי קלט מודרניים מספקים פונקציונליות משופרת:**
| תכונה | יתרון | דוגמה |
|-------|-------|-------|
| `type="number"` | מקלדת מספרית בנייד | הזנת יתרה קלה יותר |
| `step="0.01"` | שליטה בדיוק עשרוני | מאפשר סנטים במטבע |
| `autocomplete` | מילוי אוטומטי של הדפדפן | השלמת טופס מהירה יותר |
| `placeholder` | רמזים הקשריים | מנחה את ציפיות המשתמש |
> 🎯 **אתגר נגישות**: נסו לנווט בטפסים באמצעות המקלדת בלבד! השתמשו ב-`Tab` כדי לעבור בין שדות, `Space` כדי לסמן תיבות, ו-`Enter` כדי לשלוח. חוויה זו תעזור לכם להבין כיצד משתמשי קוראי מסך מתקשרים עם הטפסים שלכם.
## הבנת שיטות שליחת טפסים
כשמישהו ממלא את הטופס שלכם ולוחץ על שלח, הנתונים צריכים להגיע לאנשהו – בדרך כלל לשרת שיכול לשמור אותם. יש כמה דרכים שונות שזה יכול לקרות, וידיעת הדרך הנכונה יכולה לחסוך לכם כאבי ראש בהמשך.
בואו נבחן מה באמת קורה כשמישהו לוחץ על כפתור השליחה.
### התנהגות ברירת מחדל של טופס
ראשית, נבחן מה קורה עם שליחת טופס בסיסית:
**בדקו את הטפסים הנוכחיים שלכם:**
1. לחצו על כפתור *הרשמה* בטופס שלכם
2. שימו לב לשינויים בשורת הכתובת של הדפדפן שלכם
3. שימו לב כיצד הדף נטען מחדש והנתונים מופיעים בכתובת ה-URL

### השוואת שיטות HTTP
```mermaid
graph TD
A[Form Submission] --> B{HTTP Method}
B -->|GET| C[Data in URL]
B -->|POST| D[Data in Request Body]
C --> E[Visible in address bar]
C --> F[Limited data size]
C --> G[Bookmarkable]
D --> H[Hidden from URL]
D --> I[Large data capacity]
D --> J[More secure]
```
**הבנת ההבדלים:**
| שיטה | שימוש | מיקום נתונים | רמת אבטחה | מגבלת גודל |
|------|-------|-------------|-----------|------------|
| `GET` | שאילתות חיפוש, מסננים | פרמטרים ב-URL | נמוכה (גלויה) | ~2000 תווים |
| `POST` | חשבונות משתמשים, נתונים רגישים | גוף הבקשה | גבוהה (מוסתרת) | ללא מגבלה מעשית |
**הבנת ההבדלים הבסיסיים:**
- **GET**: מוסיף נתוני טופס לכתובת ה-URL כפרמטרים (מתאים לפעולות חיפוש)
- **POST**: כולל נתונים בגוף הבקשה (חיוני למידע רגיש)
- **מגבלות GET**: מגבלות גודל, נתונים גלויים, היסטוריית דפדפן מתמשכת
- **יתרונות POST**: קיבולת נתונים גדולה, הגנה על פרטיות, תמיכה בהעלאת קבצים
> 💡 **פרקטיקה מומלצת**: השתמשו ב-`GET` לטפסי חיפוש ומסננים (שליפת נתונים), השתמשו ב-`POST` להרשמת משתמשים, כניסה ויצירת נתונים.
### הגדרת שליחת טופס
בואו נגדיר את טופס ההרשמה שלכם לתקשר כראוי עם שרת ה-API האחורי באמצעות שיטת POST:
```html
```
**הבנת הוולידציה המשופרת:**
- **משלב** אינדיקטורים לשדות חובה עם תיאורים מועילים
- **כולל** מאפייני `pattern` לוולידציה של פורמטים
- **מספק** מאפייני `title` לנגישות וטיפים
- **מוסיף** טקסט עזר להנחיית הקלט של המשתמש
- **משתמש** במבנה HTML סמנטי לנגישות טובה יותר
### כללי ולידציה מתקדמים
**מה כל כלל ולידציה משיג:**
| שדה | כללי ולידציה | יתרון למשתמש |
|-----|--------------|--------------|
| שם משתמש | `required`, `minlength="3"`, `maxlength="20"`, `pattern="[a-zA-Z0-9_]+"` | מבטיח מזהים תקינים וייחודיים |
| מטבע | `required`, `maxlength="3"`, `pattern="[A-Z$€£¥₹]+"` | מקבל סמלי מטבע נפוצים |
| יתרה | `min="0"`, `step="0.01"`, `type="number"` | מונע יתרות שליליות |
| תיאור | `maxlength="100"` | מגבלות אורך סבירות |
### בדיקת התנהגות ולידציה
**נסה את תרחישי הוולידציה הבאים:**
1. **שלח** את הטופס עם שדות חובה ריקים
2. **הכנס** שם משתמש קצר מ-3 תווים
3. **נסה** תווים מיוחדים בשדה שם המשתמש
4. **הכנס** סכום יתרה שלילי

**מה שתראה:**
- **הדפדפן מציג** הודעות ולידציה מקוריות
- **שינויים בעיצוב** מבוססי `:valid` ו-`:invalid`
- **שליחת הטופס** נמנעת עד שכל הוולידציות עוברות
- **הפוקוס עובר אוטומטית** לשדה הראשון שאינו תקין
### ולידציה בצד לקוח מול ולידציה בצד שרת
```mermaid
graph LR
A[Client-Side Validation] --> B[Instant Feedback]
A --> C[Better UX]
A --> D[Reduced Server Load]
E[Server-Side Validation] --> F[Security]
E --> G[Data Integrity]
E --> H[Business Rules]
A -.-> I[Both Required]
E -.-> I
```
**למה צריך את שתי השכבות:**
- **ולידציה בצד לקוח**: מספקת משוב מיידי ומשפרת את חוויית המשתמש
- **ולידציה בצד שרת**: מבטיחה אבטחה ומטפלת בכללים עסקיים מורכבים
- **גישה משולבת**: יוצרת אפליקציות חזקות, ידידותיות למשתמש ובטוחות
- **שיפור פרוגרסיבי**: עובד גם כאשר JavaScript מושבת
> 🛡️ **תזכורת אבטחה**: לעולם אל תסמוך רק על ולידציה בצד לקוח! משתמשים זדוניים יכולים לעקוף בדיקות בצד לקוח, ולכן ולידציה בצד שרת חיונית לאבטחה ושלמות נתונים.
---
---
## אתגר סוכן GitHub Copilot 🚀
השתמש במצב סוכן כדי להשלים את האתגר הבא:
**תיאור:** שפר את טופס ההרשמה עם ולידציה מקיפה בצד לקוח ומשוב למשתמש. אתגר זה יעזור לך לתרגל ולידציה לטפסים, טיפול בשגיאות ושיפור חוויית המשתמש עם משוב אינטראקטיבי.
**הנחיה:** צור מערכת ולידציה מלאה לטופס ההרשמה הכוללת: 1) משוב ולידציה בזמן אמת לכל שדה בזמן שהמשתמש מקליד, 2) הודעות ולידציה מותאמות שמופיעות מתחת לכל שדה קלט, 3) שדה אישור סיסמה עם ולידציה של התאמה, 4) אינדיקטורים חזותיים (כמו סימני וי ירוקים לשדות תקינים ואזהרות אדומות לשדות לא תקינים), 5) כפתור שליחה שמופעל רק כאשר כל הוולידציות עוברות. השתמש במאפייני ולידציה של HTML5, CSS לעיצוב מצבי הוולידציה, ו-JavaScript להתנהגות אינטראקטיבית.
למידע נוסף על [מצב סוכן](https://code.visualstudio.com/blogs/2025/02/24/introducing-copilot-agent-mode) כאן.
## 🚀 אתגר
הצג הודעת שגיאה ב-HTML אם המשתמש כבר קיים.
הנה דוגמה לאיך עמוד ההתחברות הסופי יכול להיראות לאחר מעט עיצוב:

## מבחן לאחר ההרצאה
[מבחן לאחר ההרצאה](https://ff-quizzes.netlify.app/web/quiz/44)
## סקירה ולימוד עצמי
מפתחים הפכו יצירתיים מאוד במאמצי בניית הטפסים שלהם, במיוחד בכל הנוגע לאסטרטגיות ולידציה. למד על זרימות טפסים שונות על ידי עיון ב-[CodePen](https://codepen.com); האם תוכל למצוא טפסים מעניינים ומעוררי השראה?
## משימה
[עצב את אפליקציית הבנק שלך](assignment.md)
---
**הצהרת אחריות**:
מסמך זה תורגם באמצעות שירות תרגום AI [Co-op Translator](https://github.com/Azure/co-op-translator). למרות שאנו שואפים לדיוק, יש לקחת בחשבון שתרגומים אוטומטיים עשויים להכיל שגיאות או אי דיוקים. המסמך המקורי בשפתו המקורית צריך להיחשב כמקור סמכותי. למידע קריטי, מומלץ להשתמש בתרגום מקצועי אנושי. איננו אחראים לאי הבנות או לפרשנויות שגויות הנובעות משימוש בתרגום זה.