Làm việc với Forms ================== Ở phần này sẽ hướng dẫn làm thế nào để tạo mới trang Web cho phép ứng dụng lấy các thông tin về user từ form. Trang này sẽ có chức năng hiển thị form cho user cùng với các input như name (tên người dùng) và email. Sau khi nhận hai thông tin về user, trang web sẽ hiển thị thông tin tới user. Để làm được trang web này, bên cạnh tạo ra [action](structure-controllers.md) và hai giao diện [views](structure-views.md), bạn cần phải tạo ra đối tượng [model](structure-models.md) để xử lý các nghiệp vụ logic truy xuất CSDL. Trong phần này, bạn sẽ được tìm hiểu về: * Tạo đối tượng [model](structure-models.md) nhận thông tin từ user được nhập từ form * Khai báo rules để xách minh dữ liệu nhập vào * Xây dựng form HTML ở [view](structure-views.md) Tạo Model ---------------- Dữ liệu của user cần xử lý sẽ đại diện bởi lớp model `EntryForm` sau đây và được lưu ở file `models/EntryForm.php`. Tham khảo thêm về phần [Class Autoloading](concept-autoloading.md) để biết thêm chi tiết về quy tắc đặt tên cho các lớp. ```php Lưu ý: [[yii\base\Model]] là lớp cơ sở cho việc tương tác với các lớp dữ liệu và nó *không* liên quan tới các bảng trong CSDL. [[yii\db\ActiveRecord]] là lớp thường được dùng với CSDL mỗi lớp này sẽ tương xứng với các bảng trong CSDL. Lớp `EntryForm` chứa hai biến ở phạm vi toàn cục (public), `name` và `email`, Các biến này sẽ được dùng để lưu trữ dữ liệu khi người dùng nhập và gửi lên. Lớp này đồng thời chứa phương thức là `rules()`, phương thức này trả về tập quy tắc để xác thực dữ liệu. Các quy tắc chứng thực được khai báo ở phần trên với ý nghĩa rằng. * cả hai giá trị `name` và `email` cần phải có * giá trị `email` phải đúng cú pháp là địa chỉ email Nếu đã có đối tượng `EntryForm` cùng với dữ liệu user đã nhập, bạn có thể sử dụng phương thức [[yii\base\Model::validate()|validate()]] để xác thực dữ liệu mỗi khi user gửi lên. Việc xác thực dữ liệu sai sẽ thiết lập thuộc tính [[yii\base\Model::hasErrors|hasErrors]] thành "true", và bạn có thể xem thông tin về việc xác thực lỗi từ phương thức [[yii\base\Model::getErrors|errors]]. ```php name = 'Qiang'; $model->email = 'bad'; if ($model->validate()) { // Xác thực thành công! } else { // Xác thực lỗi! // Use $model->getErrors() } ``` Tạo Action ------------------ Tiếp theo, trong controller `site` bạn sẽ tạo action là `entry` action này cần dùng tới model. Quy trình và cách tạo mới action đã được hướng dẫn ở mục [Saying Hello](start-hello.md). ```php load(Yii::$app->request->post()) && $model->validate()) { // valid data received in $model // do something meaningful here about $model ... return $this->render('entry-confirm', ['model' => $model]); } else { // either the page is initially displayed or there is some validation error return $this->render('entry', ['model' => $model]); } } } ``` Action này sẽ tạo đối tượng `EntryForm`. Sau khi được khởi tạo, nó sẽ lấy các thông tin thông qua biến `$_POST`, biến này được Yii cung cấp [[yii\web\Request::post()]]. Nếu dữ liệu gửi đến cho model thành công(chẳng hạn., khi user gửi thông tin từ HTML form), action sẽ gọi phương thức [[yii\base\Model::validate()|validate()]] để chắc chắn rằng những giá trị được nhập vào là hợp lý. > Thông tin thêm: Thành phần `Yii::$app` được mô tả ở mục [application](structure-applications.md), Thành phần này là một mẫu thiết kế singleton cho phép truy cập ở toàn cục. Được hoạt động như một [service locator](concept-service-locator.md) that để cung cấp các thành phần như `request`, `response`, `db`, vv. nhằm để hỗ trợ thêm các chức năng đặc biệt. Ở đoạn code trên, component `request` được khởi tạo bỏi ứng dụng dùng để truy cập dữ liệu từ `$_POST`. Nếu không có lỗi gì, action sẽ trả về (render) view tên là `entry-confirm` để xác nhận dữ liệu được gửi lên. . Nếu dữ liệu trống hoặc gặp lỗi, dữ liệu sẽ được gửi về view `entry`, chứa form HTML, cùng với các thông điệp ở việc xác thực bị lỗi. > Lưu ý: ở bài hướng dẫn này, chúng ta chỉ xác nhận trang khi có dũ liệu hợp lệ. Bài thực hành này, bạn cần lưu ý việc sử dụng các phương thức [[yii\web\Controller::refresh()|refresh()]] hoặc [[yii\web\Controller::redirect()|redirect()]] nhằm để tránh [form resubmission problems](http://en.wikipedia.org/wiki/Post/Redirect/Get). Tạo Views -------------- Cuối cùng, chúng ta tạo mới 2 tập tin view có tên là `entry-confirm` và `entry`. Những view này sẽ được trả về như được mô tả ở trên từ action `entry`. View `entry-confirm` đơn giản chỉ hiển thị dữ liệu cho 2 thuộc tính name và email . View này được lưu trữ ở tập tin `views/site/entry-confirm.php`. ```php
Bạn đã nhập với những thông tin như sau: