diff --git a/docs/guide-vi/start-forms.md b/docs/guide-vi/start-forms.md new file mode 100644 index 0000000000..00046d98e0 --- /dev/null +++ b/docs/guide-vi/start-forms.md @@ -0,0 +1,238 @@ +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:
+ +