与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表单,我相信你会的。我就不写了。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。