2

我使用了动态表单小部件。表单字段如下图所示。如您所见,有一个名为取消的复选框。我想要的是如果cancel单击该复选框,它将只需要检查号,并允许其余部分为空。when在不使用动态表单的情况下,我可以使用和验证器轻松实现此功能,whenClient因为我可以准确地获得name复选框。

name这里的问题是动态表单为复选框生成了这种系列......

TblDvBub[0][is_cancelled][]
TblDvBub[1][is_cancelled][]
TblDvBub[2][is_cancelled][]

在此处输入图像描述

4

2 回答 2

2

我认为您可以使用 'whenClient' => 'function(attribute, value){}' 参数中的 'attribute.name' 提取 is_cancelled 复选框的名称。'attribute' 的 console.log - 必须有一个具有 'name' 属性的对象 - 在那里你可能会得到当前 TblDvBub 的数量(使用正则表达式)。顺便说一句,你为什么要使用多个 is_cancelled[] 字段——它不是已经属于特定的 TblDvBub 子数组了吗?

于 2015-06-23T18:22:06.167 回答
-1

1) 在表单中,你必须重写 fieldClass

<?php $form = ActiveForm::begin([
  'fieldClass' => 'backend\widgets\ActiveField'
]); ?>

2)覆盖方法

<?php
class ActiveField extends \yii\widgets\ActiveField
{
    protected function getClientOptions()
    {
        $attribute = Html::getAttributeName($this->attribute);
        if (!in_array($attribute, $this->model->activeAttributes(), true)) {
            return [];
        }
        $enableClientValidation = $this->enableClientValidation || $this->enableClientValidation === null && $this->form->enableClientValidation;
        $enableAjaxValidation = $this->enableAjaxValidation || $this->enableAjaxValidation === null && $this->form->enableAjaxValidation;
        if ($enableClientValidation) {
            $validators = [];
            foreach ($this->model->getActiveValidators($attribute) as $validator) {
                /* @var $validator \yii\validators\Validator */
                $js = $validator->clientValidateAttribute($this->model, $attribute, $this->form->getView());
                if ($validator->enableClientValidation && $js != '') {
                    if ($validator->whenClient !== null) {
                        $js = "if (({$validator->whenClient})(attribute, value, '{$this->form->id}')) { $js }";
                    }
                    $validators[] = $js;
                }
            }
        }
        if (!$enableAjaxValidation && (!$enableClientValidation || empty($validators))) {
            return [];
        }
        $options = [];
        $inputID = $this->getInputId();
        $options['id'] = $inputID;
        $options['name'] = $this->attribute;
        $options['container'] = isset($this->selectors['container']) ? $this->selectors['container'] : ".field-$inputID";
        $options['input'] = isset($this->selectors['input']) ? $this->selectors['input'] : "#$inputID";
        if (isset($this->selectors['error'])) {
            $options['error'] = $this->selectors['error'];
        } elseif (isset($this->errorOptions['class'])) {
            $options['error'] = '.' . implode('.', preg_split('/\s+/', $this->errorOptions['class'], -1, PREG_SPLIT_NO_EMPTY));
        } else {
            $options['error'] = isset($this->errorOptions['tag']) ? $this->errorOptions['tag'] : 'span';
        }
        $options['encodeError'] = !isset($this->errorOptions['encode']) || $this->errorOptions['encode'];
        if ($enableAjaxValidation) {
            $options['enableAjaxValidation'] = true;
        }
        foreach (['validateOnChange', 'validateOnBlur', 'validateOnType', 'validationDelay'] as $name) {
            $options[$name] = $this->$name === null ? $this->form->$name : $this->$name;
        }
        if (!empty($validators)) {
            $options['validate'] = new JsExpression("function (attribute, value, messages, deferred, \$form) {" . implode('', $validators) . '}');
        }
        // only get the options that are different from the default ones (set in yii.activeForm.js)
        return array_diff_assoc($options, [
            'validateOnChange' => true,
            'validateOnBlur' => true,
            'validateOnType' => false,
            'validationDelay' => 500,
            'encodeError' => true,
            'error' => '.help-block',
        ]);
    }
}
?>

3)可以使用验证

<?php
'whenClient' => "function(attribute, value, form) {
                    $("form# " + form + " > attribute")
                }"
?>
于 2016-02-29T13:50:34.943 回答