我今天在这里搜索了一段时间,但我无法理解为什么我的验证器不能在我的模型中工作。
我在下面的代码中有一个带有模型“页面”的模 block 。
我有 2 个属性需要用来验证模型。它们是 hero_link 和 hero_linked。如果 hero_linked 为真,我想要求 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 属性,并且即使未选中我的复选框也需要。我的语法不正确,还是我遗漏了一个要求?任何帮助表示赞赏,提前致谢!
最佳答案
我想这就是你想要的。
首先使用输入字段的whenClient 中的属性“checked”来获取复选框是否被选中。
复选框的隐藏字段不是问题。
hero_linked(复选框)中的 whenClient 用于在复选框更改时验证 hero_link(文本输入)字段。
因此,您可以立即查看是否需要 hero_link(文本输入)。
如果使用此规则,则表单中不需要任何额外的 js 代码。
但是正如您可能还看到的,由于完整的名称“page-something”,这实际上仅适用于“page”模型,我猜也取决于表单名称。因此,您应该对 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');
}",
],
关于validation - Yii2 自定义验证器未按指南建议工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29888182/