与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视图中我们可以这样创建表单:
'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
'page-conversion-form', 'class' => 'form-inline', 'role' => 'form']); ?>'所有订单', '1' => '普通订单', '2' => '拍卖订单'], ['class' => 'form-control']); ?>'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表单,我相信你会的。我就不写了。