【问题标题】:yii2 disable the rules if a checkbox is selectedyii2 如果选中了复选框,则禁用规则
【发布时间】:2015-06-22 02:58:48
【问题描述】:

在活动表单中,我有 3 个文本输入和一个复选框。 所有 3 个文本输入都有不能为空的规则。我想要的是如果单击该复选框,它将禁用规则并将空记录保存在数据库中。

这里是活动表单的屏幕截图..

【问题讨论】:

  • 您可以检查复选框状态并相应地设置执行此操作的场景
  • 设置场景是什么意思?我该怎么做?
  • 表示指定 2 个场景,例如 1) 已检查 2) 未检查。当复选框值被选中时,将场景设置为 chekced ,反之亦然。当复选框值未选中时,通过将场景设置为“未选中”来强制属性。否则不要强迫他们。现在收到了吗?
  • 我明白你的意思。我已经可以确定它是否被检查了..我只是不知道如何使用 yii2 规则来实现它..

标签: yii2 rules active-form


【解决方案1】:

你可以这样定义规则(使用when):

public function rules()
{
    return [            
        ['cancelled',   'boolean'],
        ['checkNumber', 'required'],
        ['payee',       'required', 'when' => function ($model) {return !$model->cancelled;}],
        ['particulars', 'required', 'when' => function ($model) {return !$model->cancelled;}],
    ];
}

您可能还想添加whenClient 以让浏览器在提交表单之前对其进行检查。

【讨论】:

  • @nerison Here 就是一个例子。
  • 我想你已经给了我正确的答案,但我使用的是link dynamic forms,我无法指定复选框的 ID。你知道如何以动态形式处理这个问题吗?
  • @nerison 不,很遗憾没有。我不确定它是否适用。
【解决方案2】:

你可以这样做:

$model = new SomeForm();
if ($model->load(Yii::$app->request->post())){
if ($model->checkbox == true) $model->scenario = 'checked';
}
// your model rules:
[['name', 'email', 'subject', 'body'], 'safe', 'on' => 'checked']

或者您也可以这样做:

 if ($model->checkbox == true) $model->save(false); //this will disable any validation so be carefull

编辑: 如果你需要客户端验证开关,你必须使用这个:

[['name', 'email', 'subject', 'body'], 'required', 'when' => function ($model) {
                return $model->cancelled == '0';
            }, 'whenClient' => new JsExpression("function (attribute, value) {  return $('#mailform-cancelled').val() == '0';}")]

【讨论】:

  • 这似乎发生在表单提交之后。我希望浏览器首先检查验证。你对此有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 2014-07-11
  • 2020-06-22
  • 1970-01-01
  • 2015-11-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多