与Model关联的ActiveForm表单

yii2中常规的表单,基于\yii\bootstrap\ActiveForm创建的表单类,需要一个继承自yii\base\Model的ModelForm类,比如有一个保证金初始化表单,可能需要一个保证表单类(DepositInitForm):

model

namespace backend\models;

use Yii;
use yii\base\Model;

/**
 * Login form
 * 保证金初始化
 */
class DepositInitForm extends Model
{
    public $type;
    public $id;
    public $uid;

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['type', 'id', 'uid'], 'safe'],
            [['id'], 'required'],
        ];
    }
}

在初始化表单的view视图中,我们需要创建关联的表单。关联表单的几个好处:

  • 表单的验证

  • 表单在修改的时候自动填充

  • 减少代码量

  • bootstrap提供的自适应特性

view

在init.php视图中我们可以这样创建表单:

<?php
    $form = ActiveForm::begin(['id' => 'deposit-init-form', 'layout' => 'inline', 'method' => 'post', 'action' => Url::to('deposit/init')]);
    echo $form->field($model, 'type')->dropDownList(['0' => '选择拍卖类型', '1' => '拍场', '2' => '拍品']);
    echo $form->field($model, 'id')->textarea(['placeholder' => '请输入拍场id或者拍品id']);
    // 此处用了hidden表单,以后扩展根据用户uid查询
    echo $form->field($model, 'uid')->textarea(['placeholder' => '请输入添加白名单用户id,多个用逗号分隔']);
    echo Html::button('初始化', ['class' => 'btn btn-danger init']);
    echo Html::button('查询', ['class' => 'btn btn-default query']) ?>
    ActiveForm::end();
?>

controller

在DespositController控制器中可以这样写:

/**
 * 白名单,保证金
 */
public function actionInit(){
    $model = new \backend\models\DepositInitForm;

    $model->type = 1; // 下拉列表默认选中设置
    if ($model->load(Yii::$app->request->post()) && $model->validate()) {
        // TODO 处理业务逻辑
        ...
    }
    return $this->render('init',['model' => $model]);
}

基于Html帮助类创建表单

有时候,我们并不想关联一个model,比如我们需要调用rest服务的时候,我们只是想把表单的数据提交到一个url请求去,此时,我们可以选择\yii\helpers\Html帮助类,创建一个简单的表单:

view

<?php

// ...

echo Html::beginForm(Url::to(['statistics/conversion-rate']), 'get', ['id' => 'page-conversion-form', 'class' => 'form-inline', 'role' => 'form']); ?>
<div class="form-group">
    <label class="sr-only" for="type">订单类型</label>
    <?php echo Html::dropDownList('type', $type, ['0' => '所有订单', '1' => '普通订单', '2' => '拍卖订单'], ['class' => 'form-control']); ?>
</div>
<?php echo Html::submitButton('查看', ['class' => 'btn btn-default']);
echo Html::endForm();

// ...
?>

这里写了一个简单的根据订单类型统计转化率的表单,该表单并不复杂,只有一个下拉列表,所以没必要创建一个表单,再者,没必要对type做校验,如果没有传递该参数,控制器中作默认为0的处理。

controller

在StatisticsController控制器中,创建actionConversionRate操作:

 public function actionConversionRate()
 {
        $query['page'] = isset($_GET['page']) ? intval($_GET['page']) : 1;
        $query['perpage'] = isset($_GET['per-page']) && $_GET['per-page'] ? $_GET['per-page'] : 15;
        // type不传递的时候,默认为0,为了在页面显示选择类型,并将其传递到view做视图的渲染
        $query['type'] = isset($_GET['type']) ? intval($_GET['type']) : 0;
        $api = rtrim(Yii::$app->params['statisticsUrl'], '/') . '/statistics/';
        $url = $api . 'getConversionRate?' . http_build_query($query);
        $data = AppHelper::getData($url);
        $count = AppHelper::getData($api . 'getRateCount?type=' . $query['type']);

        // 这里面的是一个数据提供器,先不关心
        $dataProvider = new \backend\extensions\ArrayDataProvider(
            [
                'allModels' => $data,
                'totalCount' => $count,
                'key' => 'ltime',
                'sort' => [
                    'attributes' => [
                        'ltime',
                    ],
                    'defaultOrder' => [
                        'ltime' => SORT_DESC,
                    ],
                ],
                'pagination' => [
                    'pageSize' => 15,
                ],
            ]

        );

        return $this->render('conversionrate', ['dataProvider' => $dataProvider, 'type' => $query['type']]);
    }

纯手工写表单

纯手工写html表单,我相信你会的。我就不写了。

最后,关于ActiveForm和Html的api参看Yii2官网或者中文网站。


Joyven
630 声望34 粉丝

不学无(用之)术,不安于现状,总想鼓捣点什么,或者总想尝试一些什么新鲜事物。