Yii2:验证是否至少选中了一个复选框
Yii2 : validate if at least one checkbox is selected
我有一个用户的多个音乐版本,他想为其创建一个促销,在促销创建表单上我们列出了所有版本,我正在使用一个表单模型来创建促销,我在其中定义了所有规则我在促销表格模型中的几个输入。
我想检查在保存表单时用户是否至少选择了一个版本,但它不起作用,因为复选框是动态创建的。
该字段的表单代码
foreach ($releaseInfo as $releases) {
if (!is_null($releases->releaseSongs)) {
echo "<fieldset><legend>" . \yii\helpers\Html::activeCheckbox($model, 'selected_releases[]', ['id' => 'release_' . $releases->id, 'onclick' => '$("#songs_' . $releases->id . '").toggle()', 'label' => false]) . " " . $releases->name . "</legend>";
foreach ($releases->releaseSongs as $k => $v) {
echo "<div id='songs_" . $releases->id . "' style='display:none'>";
echo "<div>";
echo $v->song->name;
echo "</div>";
echo "</div>";
}
}
}
echo "</fieldset>";
我在模型中的规则
['selected_releases', 'required', 'on' => ['catalog', 'catalog_update'], 'requiredValue' => 1,
'when' => function ($model) {return ($model->scenario == self::SCENARIO_CATALOG_BASED || $model->scenario == self::SCENARIO_CATALOG_BASED_UPDATE);},
'whenClient' => 'function(attribute,value){return ("' . $this->scenario . '"=="' . self::SCENARIO_CATALOG_BASED . '" || "' . $this->scenario . '"=="' . self::SCENARIO_CATALOG_BASED_UPDATE . '")}',
'message' => 'You must select atleast one release',
]
当我提交表单时,发布的输入变量如下所示
[selected_releases] => Array(
[0] => 0
[1] => 0
)
规则中的 requiredValue
不起作用,因为 selected_releases
是一个值数组,它总是表示
You must select atleast one release
我应该如何使用规则的 requiredValue
参数选项来检查复选框的至少一个选择
或
我是否必须制作自定义验证方法并在验证时调用它
我为此使用了自定义验证方法,我的验证规则如下所示
['selected_releases', 'checkreleaseSelection'
, 'on' => ['catalog', 'catalog_update'],
'when' => function ($model) {return ($model->scenario == self::SCENARIO_CATALOG_BASED || $model->scenario == self::SCENARIO_CATALOG_BASED_UPDATE);},
'whenClient' => 'function(attribute,value){return ("' . $this->scenario . '"=="' . self::SCENARIO_CATALOG_BASED . '" || "' . $this->scenario . '"=="' . self::SCENARIO_CATALOG_BASED_UPDATE . '")}',
]
自定义方法
public function checkreleaseSelection()
{
$error = true;
foreach ($this->selected_releases as $selection) {
if ($selection) {
$error = false;
}
}
if ($error) {
$this->addError('selected_releases', 'You must select atleast one of your releases to continue');
}
};
我有一个用户的多个音乐版本,他想为其创建一个促销,在促销创建表单上我们列出了所有版本,我正在使用一个表单模型来创建促销,我在其中定义了所有规则我在促销表格模型中的几个输入。
我想检查在保存表单时用户是否至少选择了一个版本,但它不起作用,因为复选框是动态创建的。
该字段的表单代码
foreach ($releaseInfo as $releases) {
if (!is_null($releases->releaseSongs)) {
echo "<fieldset><legend>" . \yii\helpers\Html::activeCheckbox($model, 'selected_releases[]', ['id' => 'release_' . $releases->id, 'onclick' => '$("#songs_' . $releases->id . '").toggle()', 'label' => false]) . " " . $releases->name . "</legend>";
foreach ($releases->releaseSongs as $k => $v) {
echo "<div id='songs_" . $releases->id . "' style='display:none'>";
echo "<div>";
echo $v->song->name;
echo "</div>";
echo "</div>";
}
}
}
echo "</fieldset>";
我在模型中的规则
['selected_releases', 'required', 'on' => ['catalog', 'catalog_update'], 'requiredValue' => 1,
'when' => function ($model) {return ($model->scenario == self::SCENARIO_CATALOG_BASED || $model->scenario == self::SCENARIO_CATALOG_BASED_UPDATE);},
'whenClient' => 'function(attribute,value){return ("' . $this->scenario . '"=="' . self::SCENARIO_CATALOG_BASED . '" || "' . $this->scenario . '"=="' . self::SCENARIO_CATALOG_BASED_UPDATE . '")}',
'message' => 'You must select atleast one release',
]
当我提交表单时,发布的输入变量如下所示
[selected_releases] => Array(
[0] => 0
[1] => 0
)
规则中的 requiredValue
不起作用,因为 selected_releases
是一个值数组,它总是表示
You must select atleast one release
我应该如何使用规则的 requiredValue
参数选项来检查复选框的至少一个选择
或
我是否必须制作自定义验证方法并在验证时调用它
我为此使用了自定义验证方法,我的验证规则如下所示
['selected_releases', 'checkreleaseSelection'
, 'on' => ['catalog', 'catalog_update'],
'when' => function ($model) {return ($model->scenario == self::SCENARIO_CATALOG_BASED || $model->scenario == self::SCENARIO_CATALOG_BASED_UPDATE);},
'whenClient' => 'function(attribute,value){return ("' . $this->scenario . '"=="' . self::SCENARIO_CATALOG_BASED . '" || "' . $this->scenario . '"=="' . self::SCENARIO_CATALOG_BASED_UPDATE . '")}',
]
自定义方法
public function checkreleaseSelection()
{
$error = true;
foreach ($this->selected_releases as $selection) {
if ($selection) {
$error = false;
}
}
if ($error) {
$this->addError('selected_releases', 'You must select atleast one of your releases to continue');
}
};