<commit_before>使用表单
==================

本章节介绍如何创建一个让用户提交数据的表单页。
该页将显示一个包含 name 输入框和 email 输入框的表单。
当提交这两部分信息后，页面将会显示用户所输入的信息。

为了实现这个目标，除了创建一个[操作](structure-controllers.md)和两个[视图](structure-views)外，
还需要创建一个[模型](structure-models.md)。

通过本教程，你将会学到：

* 创建一个[模型](structure-models.md)代表用户通过表单输入的数据
* 声明规则去验证输入的数据
* 在[视图](structure-views.md)中生成一个 HTML 表单


创建模型 <span id="creating-model"></span>
----------------

模型类 `EntryForm` 代表从用户那请求的数据，
该类如下所示并存储在 `models/EntryForm.php` 文件中。
请参考[类自动加载](concept-autoloading.md)章节获取更多关于类命名约定的介绍。

```php
<?php

namespace app\models;

use Yii;
use yii\base\Model;

class EntryForm extends Model
{
    public $name;
    public $email;

    public function rules()
    {
        return [
            [['name', 'email'], 'required'],
            ['email', 'email'],
        ];
    }
}
```

该类继承自Yii 提供的一个基类 [[yii\base\Model]]，
该基类通常用来表示数据。

> Info: [[yii\base\Model]] 被用于普通模型类的父类并与数据表**无关**。[[yii\db\ActiveRecord]] 
  通常是普通模型类的父类但与数据表有关联（译注：[[yii\db\ActiveRecord]] 类其实也是继承自 [[yii\base\Model]]，增加了数据库处理）。

`EntryForm` 类包含 `name` 和 `email` 两个公共成员，
用来储存用户输入的数据。它还包含一个名为 `rules()` 的方法，
用来返回数据验证规则的集合。上面声明的验证规则表示：

* `name` 和 `email` 值都是必须的
* `email` 的值必须满足email规则验证

如果你有一个处理用户提交数据的 `EntryForm` 对象，
你可以调用它的 [[yii\base\Model::validate()|validate()]] 方法触发数据验证。
如果有数据验证失败，将把 [[yii\base\Model::hasErrors|hasErrors]] 属性设为 ture，
想要知道具体发生什么错误就调用 [[yii\base\Model::getErrors|getErrors]]。

```php
<?php
$model = new EntryForm();
$model->name = 'Qiang';
$model->email = 'bad';
if ($model->validate()) {
    // 验证成功！
} else {
    // 失败！
    // 使用 $model->getErrors() 获取错误详情
}
```


创建动作 <span id="creating-action"></span>
------------------

下面你得在 `site` 控制器中创建一个 `entry` 操作用于新建的模型。
操作的创建和使用已经在[说一声你好](start-hello.md)小节中解释了。

```php
<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\EntryForm;

class SiteController extends Controller
{
    // ...现存的代码...

    public function actionEntry()
    {
        $model = new EntryForm;

        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            // 验证 $model 收到的数据
<commit_msg>Fixed constructor style in docs [skip ci]<commit_after>使用表单
==================

本章节介绍如何创建一个让用户提交数据的表单页。
该页将显示一个包含 name 输入框和 email 输入框的表单。
当提交这两部分信息后，页面将会显示用户所输入的信息。

为了实现这个目标，除了创建一个[操作](structure-controllers.md)和两个[视图](structure-views)外，
还需要创建一个[模型](structure-models.md)。

通过本教程，你将会学到：

* 创建一个[模型](structure-models.md)代表用户通过表单输入的数据
* 声明规则去验证输入的数据
* 在[视图](structure-views.md)中生成一个 HTML 表单


创建模型 <span id="creating-model"></span>
----------------

模型类 `EntryForm` 代表从用户那请求的数据，
该类如下所示并存储在 `models/EntryForm.php` 文件中。
请参考[类自动加载](concept-autoloading.md)章节获取更多关于类命名约定的介绍。

```php
<?php

namespace app\models;

use Yii;
use yii\base\Model;

class EntryForm extends Model
{
    public $name;
    public $email;

    public function rules()
    {
        return [
            [['name', 'email'], 'required'],
            ['email', 'email'],
        ];
    }
}
```

该类继承自Yii 提供的一个基类 [[yii\base\Model]]，
该基类通常用来表示数据。

> Info: [[yii\base\Model]] 被用于普通模型类的父类并与数据表**无关**。[[yii\db\ActiveRecord]] 
  通常是普通模型类的父类但与数据表有关联（译注：[[yii\db\ActiveRecord]] 类其实也是继承自 [[yii\base\Model]]，增加了数据库处理）。

`EntryForm` 类包含 `name` 和 `email` 两个公共成员，
用来储存用户输入的数据。它还包含一个名为 `rules()` 的方法，
用来返回数据验证规则的集合。上面声明的验证规则表示：

* `name` 和 `email` 值都是必须的
* `email` 的值必须满足email规则验证

如果你有一个处理用户提交数据的 `EntryForm` 对象，
你可以调用它的 [[yii\base\Model::validate()|validate()]] 方法触发数据验证。
如果有数据验证失败，将把 [[yii\base\Model::hasErrors|hasErrors]] 属性设为 ture，
想要知道具体发生什么错误就调用 [[yii\base\Model::getErrors|getErrors]]。

```php
<?php
$model = new EntryForm();
$model->name = 'Qiang';
$model->email = 'bad';
if ($model->validate()) {
    // 验证成功！
} else {
    // 失败！
    // 使用 $model->getErrors() 获取错误详情
}
```


创建动作 <span id="creating-action"></span>
------------------

下面你得在 `site` 控制器中创建一个 `entry` 操作用于新建的模型。
操作的创建和使用已经在[说一声你好](start-hello.md)小节中解释了。

```php
<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
use app\models\EntryForm;

class SiteController extends Controller
{
    // ...现存的代码...

    public function actionEntry()
    {
        $model = new EntryForm();

        if ($model->load(Yii::$app->request->post()) && $model->validate()) {
            // 验证 $model 收到的数据

{'fraction_non_alphanumeric': 0.19090478446234013, 'fraction_numerical': 0.0, 'mean_word_length': 3.9976331360946746, 'pattern_counts': {'":': 0, '<': 17, '<?xml version=': 0, '>': 29, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '3806625', 'n_tokens_mistral': 2185, 'n_tokens_neox': 2393, 'n_words': 290}