在我的表单中,在Yii2 Basic中,如果我尝试检查字段的元素,我会得到模型和表格行的名称
示例
<input id="userlogin-username" class="form-control" name="Userlogin[Username]" maxlength="30" aria-required="true" type="text">
name=
显示的是模型名称:Userlogin
,表格行为Username
。是否可以隐藏模型和表格行的名称,例如name="user"
而不是name="Userlogin[Username]"
。
是否可能或不可能。
谢谢
答案 0 :(得分:1)
您可以通过在模型中实施“formName”来隐藏模型的名称:http://www.yiiframework.com/doc-2.0/yii-base-model.html#formName()-detail
答案 1 :(得分:0)
如果您使用Yii方式,则应使用该模型设置和传递数据。现在要做你需要的事情(通过默默无闻的安全性)你将结束或做一个模型较少的形式或使用DynamicModel
。
要做到这一点,你必须在Controller上做很多额外的工作来阅读字段。
Op1:手工制作 这也是很多工作,你将结束与yii断开的表格。 像
一样手工制作表格<form method="post">
First name:<br>
<input type="text" name="username">
<input type="submit" value="Submit">
</form>
现在,您在Controller中使用$request->post()
读取字段,然后手动将其加载到模型中。
$request = Yii::$app->request;
$post = $request->post();
$model = new User();
$model->username = $post['username'];
Op2:DynamicModel
方式。
通过制作哑模型进入控制器o时,使用DynamicModel
设置字段。
然后当使用$model->load()
时,您将加载DynamicModel
,加载后您必须手动加载$userModel->usewr_name = $dModel->user_name
现在,您的表单将显示DynamicModel[user_name]
。
有了它,你可以隐藏你的模型。
建立你DynamicModel,如:
public function actionForm()
{
$model = DynamicModel::validateData(compact('username'), [
[['username'], 'string', 'max' => 128],
['username'],
]);
if ($model->hasErrors()) {
// validation fails
} else {
// validation succeeds
}
}
我不是说这是最好的方式,它是一种做你需要的方式。希望这会对你有所帮助。
答案 2 :(得分:0)
$name = isset($options['name']) ? $options['name'] : static::getInputName($model, $attribute);
yii / helpers / BaseHtml :: activeInput()的上述行用于为模型字段生成字段名称。因此,可以安全地假设在选项中设置字段名称将完全从字段名称中删除模型名称。 [警告:我从未尝试过。这只是我对代码的有限理解]例子:
$form->field($model, 'username')->textInput(['name' => 'myusername']);
但是,这会产生比解决问题更多的问题。 Model :: load()使用模型的表单名称根据场景和规则设置填充属性(有关详细信息,请参阅安全属性)。这意味着您必须记住在控制器操作中将请求中的所有字段加载到模型中,这在模型发展时从长远来看是不友好的。因此,更好的解决方案是覆盖Model :: formName()方法
public function formName() {
return 'myUser';
}
这将产生myUser[Username]
。
还有其他选项,例如创建一个模型作为表单,您可以选择表单名称和字段名称,并在提交给当前模型时复制值,但这通常不是必需的。