Web front-end (19) - HTML - Tổng quan về form

Bài trước: Web front-end (18) - HTML - Table 2

-----

1.1       Form

Tới đây, chúng ta đã biết cách sử dụng các phần tử HTML để tổ chức trang nội dung và thêm ngữ nghĩa cho tài liệu HTML. Trang nội dung bao gồm văn bản, hình ảnh, bảng dữ liệu, các liên kết. Tuy nhiên, đó vẫn là các nội dung tĩnh, người dùng chỉ có thể đọc các thông tin có sẵn mà không thể tương tác với trang web, cụ thể là không thể nhập dữ liệu, bấm nút, hay đánh dấu chọn.

Trong phần này, chúng ta sẽ tìm hiểu thêm các phần tử HTML khác, nó cho phép người dùng tương tác với trang web. Ví dụ, người dùng có thể nhập thông tin vào một biểu mẫu để mua hàng, tìm kiếm, đặt vé, đăng kí khóa học, hoặc tạo một bài viết.

Form (biểu mẫu) chính là đối tượng được sử dụng để xử lý các tương tác giữa người dùng và trang web. Từ trang web tĩnh, nhờ có form, người lập trình có thể tạo ra trang web động hay ứng dụng web. HTML5 cung cấp rất nhiều các điều khiển (control), các thuộc tính mới, giúp người lập trình dễ dàng tạo ra các giao diện tương tác, và tạo thuận lợi cho người dùng trong việc nhập thông tin và thực hiện các giao dịch trên web.

Phần này sẽ tìm hiểu về các khái niệm, cách hoạt động, cách tạo ra các web form, đồng thời cũng tìm hiểu về cách thiết kế web form.

Lưu ý, trong phần này, hai khái niệm form và web form được coi là tương đương và có thể sử dụng thay thế cho nhau.

1.1.1       Tổng quan về Form

Form làm việc như thế nào?

Hoạt động của form gồm hai phần: phần hiển thị và phần xử lý.

Phần hiển thị là những gì người dùng nhìn thấy ở trên giao diện trang web, phần này được tạo ra bằng các phần tử HTML. Form thường chứa các nút (button), các trường nhập liệu (input field), các mục xổ chọn (drop-down menu), gọi chung là các điều khiển (form control). Form sử dụng các điều khiển để lấy thông tin từ người dùng. Form cũng có thể chứa văn bản (text) và các phần tử khác. Trình duyệt có nhiệm vụ tập hợp các thông tin người dùng đã nhập, đóng gói và gửi về phía web server để xử lý.

Phần xử lý là một chương trình/ứng dụng hoặc đoạn mã xử lý (script) đặt tại máy web server, nó sẽ xử lý các thông tin thu được từ người dùng và trả về kết quả tương ứng. Phần này chúng ta sẽ tìm hiểu trong phần lập trình phía back-end.

Để dễ hiểu hơn về cách thức làm việc của form, chúng ta cùng theo dõi một ví dụ đơn giản: đăng kí để nhận thông báo định kì qua email (mailing list).

Xem hình minh họa,

Diễn giải hình trên,

1. Bạn Tèo mở trang web, sẽ thấy trên giao diện có form gồm hai ô nhập liệu (Tên, Email), và nút Đăng ký

2. Để nhận được thông báo định kì vào email của mình, Tèo cần phải đăng ký bằng cách nhập họ tên và địa chỉ email, sau đó gửi các thông tin này về server (submit) bằng cách bấm vào nút Đăng ký

3. Trình duyệt tập hợp các thông tin mà Tèo vừa nhập, mã hóa (encoding) và gửi chúng tới Ứng dụng web trên server

4. Ứng dụng web nhận thông tin và xử lý, ở ví dụ này, Ứng dụng web sẽ lưu thông tin của Tèo vào cơ sở dữ liệu

5. Ứng dụng web trả kết quả xử lý về cho trình duyệt (response), trong ví dụ này, kết quả là thông báo việc đăng ký đã thành công và lời cám ơn. Trong thực tế, kết quả trả về cũng có thể là thông tin cập nhật trên form, hoặc chuyển người dùng tới form liên quan khác, hoặc thông báo lỗi (nếu có).

Mã hóa dữ liệu của form

Dữ liệu của form sẽ được mã hóa tương tự như mã hóa URL, nghĩa là các khoảng trắng và các kí tự không được phép gửi trực tiếp về server sẽ được chuyển sang dạng giá trị hệ 16 (hexadecimal) tương ứng.

Ví dụ, khoảng trắng sẽ được chuyển thành %20, dấu xuyệt (/) sẽ là %2F. Lập trình viên không cần quan tâm tới việc mã hóa này, vì trình duyệt sẽ thực hiện tự động.

Phần tử form

Sử dụng phần tử form để thêm một form vào trang web. Phần tử form chứa toàn bộ nội dung của form, bao gồm: các điều khiển (form control) như các ô nhập liệu, các nút; các phần tử khối (block element) như h1, p, danh sách. Phần tử form không thể chứa phần tử form khác, hay nói cách khác không được lồng form.

Ví dụ, đoạn mã HTML của form Đăng ký nhận tin,

[HTML]

<!DOCTYPE html>

<html>

 

<head>

            <meta charset="utf-8">

            <title>Đăng ký nhận tin</title>

</head>

 

<body>

  <h1>Đăng ký nhận tin</h1>

  <form action="/dang-ky.php" method="post">

    <fieldset>

      <legend>Gửi thông tin của bạn cho chúng tôi</legend>

      <p>Đăng ký để nhận được các thông tin định kì về giá nông sản</p>

      <ol>

        <li><label for="ho-ten">Tên:</label>

          <input type="text" name="ten" id="ho-ten"></li>

        <li><label for="email">Email:</label>

          <input type="text" name="email" id="email"></li>

      </ol>

      <input type="submit" value="Đăng ký">

    </fieldset>

  </form>

</body>

</html>

Giải thích thêm về đoạn mã HTML ở trên: sử dụng phần tử fieldset để nhóm các control có liên quan với nhau thành một nhóm, đặt nhóm này trong một khung, thông tin chú thích cho nhóm được đặt trong phần tử legend, mỗi control được đặt trong một phần tử ol/li, vì chưa học về CSS, nên tạm thời cứ để các số thứ tự trước mỗi control. Hoặc để đơn giản, chúng ta cũng có thể bỏ đi các thẻ ol/li, dùng thẻ <br> để ngắt dòng mỗi ô nhập liệu. Ví dụ,

<label for="ho-ten">Tên:</label>

            <input type="text" name="ten" id="ho-ten">

            <br>

            <label for="email">Email:</label>

            <input type="text" name="email" id="email">

            <br>

            <input type="submit" value="Đăng ký">

Ngoài vai trò là thùng chứa các control, để giao tiếp/làm việc với ứng dụng web tại server, form còn có thêm một số thuộc tính đi kèm.

Thuộc tính action

Thuộc tính action cho biết địa chỉ (URL) của ứng dụng/chương trình hoặc đoạn mã (tại máy web server) sẽ xử lý thông tin do form gửi về. Như ở ví dụ trên, thông tin của form sẽ được gửi tới đoạn mã nằm trong tập tin dang-ky.php để xử lý. Tập tin dang-ky.php nằm trong thư mục gốc của ứng dụng web (hoặc website) (/).

<form action="/dang-ky.php" method="post">

Phần mở rộng của tập tin là .php cho biết: ứng dụng trên web server để xử lý form được viết bằng ngôn ngữ PHP. Người lập trình có thể sử dụng một trong các ngôn ngữ sau để viết các đoạn mã xử lý tại web server, ví dụ:

– PHP

– C#

– Python

– Golang

– JavaScript

– Java

– Ruby

Mẹo: để không bị chuyển trang khi bấm nút submit, bạn có thể thiết lập giá trị cho action là "#". Ví dụ,  <form action="#" method="post">

Thuộc tính method

Thuộc tính method được sử dụng để xác định cách thức gửi dữ liệu của form về web server. Ví dụ, từ dữ liệu lấy được của form gồm:

ten = Nguyễn Văn Tèo

email = nguyenvanteo@gmail.com

Sau khi được trình duyệt mã hóa, dữ liệu sẽ có dạng:

ten=Nguyễn%20Văn%20Tèo&email=nguyenvanteo%40gmail.com

Hai phương thức thường được dùng để gửi dữ liệu về web server là GET và POST. Thuộc tính method là không bắt buộc (option), nghĩa là có thể không cần khai báo thuộc tính này trong thẻ <form>, khi đó trình duyệt sẽ tự động sử dụng phương thức GET để gửi dữ liệu về web server.

– Phương thức POST: nếu thuộc tính method được thiết lập là POST, trình duyệt sẽ tạo một request riêng để gửi về web server, dữ liệu của form được đặt phần body của request, do vậy có tính bảo mật cao, chiều dài của dữ liệu không bị hạn chế.

– Phương thức GET: nếu thuộc tính method được thiết lập là GET, dữ liệu sau khi được mã hóa sẽ được gắn luôn vào cuối URL (trên thanh địa chỉ), sử dụng dấu “?” để ngăn cách giữa URL và dữ liệu gửi về web server, chiều dài của dữ liệu bị hạn chế theo kích thước của URL. Ví dụ,

…dang-ky.php?ten=Nguyễn%20Văn%20Tèo&email=nguyenvanteo%40gmail.com

Khi gửi yêu cầu để lấy tài nguyên về trình duyệt thì sử dụng phương thức GET, khi tạo mới/cập nhật tài nguyên trên web server thì sử dụng phương thức POST.

Vì không phân biệt chữ hoa và chữ thường, nên chúng ta có thể viết GET và POST ở dạng viết hoa toàn bộ hoặc viết thường toàn bộ (get, post), tùy theo quy ước đặt tên của mỗi nhóm, mỗi công ty.

Biến và nội dung

Web form sử dụng nhiều control khác nhau để người dùng có thể nhập thông tin và thực hiện các lựa chọn.

Các control được chia thành nhiều loại, như: ô nhập văn bản (text entry fields), nút (buttons), trình đơn (menus), và các control đặc biệt khác.

Lập trình viên cần phải hiểu rõ từng control để lựa chọn cho phù hợp, vừa giúp việc lập trình dễ dàng, vừa tạo cảm giác thoải mái cho người dùng.

Thuộc tính name

Lập trình viên sẽ sử dụng các control trong form để lấy thông tin từ người dùng. Như ở ví dụ trên, chúng ta đã sử dụng hai ô nhập văn bản để lấy về họ tên và email của người dùng. Trong thuật ngữ chuyên môn, người ta gọi tenemail là hai biến (variable), tạm hiểu là hai vùng trống để chứa thông tin, ở đây, nó được dùng để chứa nội dung/dữ liệu do người dùng nhập vào. Ví dụ, giá trị của biến ten là “Nguyễn Văn Tèo”, giá trị của biến email là “nguyenvanteo@gmail.com”.

Thuộc tính name được sử dụng để tạo ra các biến cho mỗi control, giá trị của thuộc tính name chính là tên của biến.

Ví dụ,

<textarea name="nhan-xet" rows="4" cols="45" placeholder="Để lại nhận xét của bạn tại đây!"></textarea>

Đoạn mã trên đã tạo ra một ô nhập văn bản, với một biến đi kèm là nhan-xet, khi người dùng nhập dữ liệu (ví dụ “Cuốn sách này rất bổ ích.”) và bấm nút “Gửi”, dữ liệu sẽ được gửi về web server dưới định dạng theo cặp: tên-biến/giá-trị (name/value, hay variable/content), ví dụ,

nhan-xet= Cuốn%20sách%20này%20rất%20bổ%20ích.

Mỗi control của form đều phải có thuộc tính name đi kèm, nhờ đó các chương trình/ứng dụng xử lý form tại web server mới có thể nhận diện và thu thập được thông tin.

Cách đặt tên cho các biến

Việc thiết lập giá trị cho thuộc tính name (hay đặt tên cho biến) không nên làm một cách tùy tiện. Các chương trình/ứng dụng web xử lý các form này thường đã được thiết kế với các tên biến cụ thể. Vì vậy, nếu thiết kế form cho các chương trình/ứng dụng đã có sẵn, thì cần phải xác định chính xác tên các biến tương ứng đã được dùng trong chương trình/ứng dụng, có thể tự đọc tài liệu của ứng dụng, khảo sát ứng dụng đang có, hỏi người lập trình ứng dụng, hoặc hỏi người quản trị hệ thống.

Nếu thiết kế form mới hoàn toàn thì cần đặt tên biến sao cho đơn giản, đúng quy ước, có ý nghĩa, phản ánh được một phần nội dung mà nó sẽ chứa.

Tên biến phải là duy nhất, với tên biến gồm nhiều từ thì nên sử dụng dấu gạch nối (-) (hyphen) hoặc dấu gạch chân ( _ )(underline, underscore) để nối giữa các từ.

-----

Cập nhật: 16/5/2024
-----

Tải tài liệu đầy đủ: Tự học HTML căn bản