今天我在这里搜索了一段时间,但是我无法理解为什么我的验证员在我的模型中没有工作。
我有一个带模型的模块" Page"在我的下面的代码中。
我需要使用2个属性来验证模型。他们是hero_link和hero_linked。如果hero_linked为true,我想要求hero_link。
在指南here中,他们解释了这种验证器的正确语法
我在我的模型中使用了这种语法,但它并没有像我期望的那样验证。我也添加了whenClient属性,所以我可以在这里使用客户端验证。
我的相关代码如下:
// Page model
namespace common\modules\page\models;
use Yii;
class Page extends \yii\db\ActiveRecord
{
public function rules()
{
return [
[['hero_linked',], 'boolean'],
[['hero_linked',], 'required'],
[['hero_link',], 'string', 'max' => 255],
[
'hero_link',
'required',
'when' => function($model) {
return $model->hero_linked == true;
},
'whenClient' => "function (attribute, value) {
return $('#page-hero_linked').val() == '1';
}",
],
];
}
}
// _form view
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'hero_linked')->checkbox() ?>
<?= $form->field($model, 'hero_link')->textInput(['maxlength' => 255]) ?>
<?php ActiveForm::end(); ?>
正确应用了所需的验证器,但它似乎忽略了when属性,并且即使取消选中我的复选框也需要。我的语法不正确,还是我错过了一项要求?任何帮助表示赞赏,提前致谢!
答案 0 :(得分:1)
我想这就是你想要的。 首先使用输入字段的whenClient中的“checked”属性来获取是否选中了复选框。
复选框的隐藏字段不是问题。
hero_linked(复选框)中的whenClient用于在更改复选框时验证hero_link(textinput)字段。 因此,您可以立即查看是否需要hero_link(textinput)。
如果您使用此规则,则表单中不需要任何其他js代码。
但是你可能也会看到,由于完整的名称“page-something”,这实际上仅固定在“页面”模型上,我猜也取决于表单名称。所以你应该在form.php的两个字段中使用一些其他固定的“id”,所以如果你将你的页面模型扩展到另一个类,这也会有效。
[
'hero_linked', 'required',
'whenClient' => "function (attribute, value) {
$('form').yiiActiveForm('validateAttribute', 'page-hero_link');
return true;
}",
],
[['hero_link',], 'string', 'max' => 255],
[
'hero_link', 'required', 'when' => function ($model) {
return $model->hero_linked == true;
},
'whenClient' => "function (attribute, value) {
return $('#page-hero_linked').prop('checked');
}",
],
答案 1 :(得分:0)
我发现了如何使这项工作。如果使用复选框,则不能仅使用服务器或客户端验证。我必须同时使用whenClient和whenClient。我必须在我的视图中注册一个脚本,以便在复选框上更新checked属性。
$('label > #page-hero_linked').click(function(event) {
var checked = $(this).attr('checked');
if (checked) {
$(this).removeAttr('checked');
}else{
$(this).attr('checked', '');
};
});
以下是我的验证规则。
[['hero_link'],
'required',
'when' => function($model) {
return $model->hero_linked == true;
},
'whenClient' => "function (attribute, value) {
return $('#page-hero_linked').attr('checked');
}",],
总而言之,这个非常简单的代码可以让它发挥作用,但对我来说并不是很明显,文档需要这么多。