YII2活动表格中的双模型验证

时间:2015-04-21 09:30:46

标签: php validation yii yii2

我是这个社区的新手,我刚开始用yii编写网页应用程序。

我在一个表单中组合2个不同的模型时遇到问题。 我有以下代码:

 <?php

use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\helpers\ArrayHelper;
use app\models\Company;
use app\models\Hosting;

/* @var $this yii\web\View */
/* @var $website app\models\Website */
/* @var $hosting app\models\Hosting */
/* @var $form yii\bootstrap\ActiveForm */
?>
<div class="website-form">
    <?php
        $form = ActiveForm::begin([
            'layout' => 'horizontal',
            'options' =>
                [
                    'enctype' => 'multipart/form-data',
                    'class' => 'well',
                ],
        ])
    ?>
    <?php
        $companyOpdions = ['prompt' => ''];
        if(isset(Yii::$app->request->queryParams['company_id'])) {
            $companyOpdions['disabled'] = true;
        }
        $hostingList = ArrayHelper::map(Hosting::find()->select(['id', 'name'])->where(['approved' => 'Yes'])->all(), 'id', 'name');
        $hostingList['addAdditionalHosting'] = Yii::t('app', 'Add Additional Hosting');
    ?>
    <?=
        $form->field($website, 'company_id')->dropDownList(
            ArrayHelper::map(Company::find()->select(['id', 'name'])->where(['user_id' => \Yii::$app->user->id])->all(), 'id', 'name'),
            $companyOpdions
        )->label(Yii::t('app', 'Company'))
    ?>
    <?= $form->field($website, 'hosting_id')->dropDownList($hostingList, ['prompt' => ''])->label(Yii::t('app', 'Hosting')) ?>
        <div id="addAdditionalHostingContainer" class="form-group" style="display:none;">
            <div class="text-center">
                <?= $form->field($hosting, 'name')->textInput(['readonly' => true])->label(Yii::t('app', 'Hosting Name')) ?>
                <?= $form->field($hosting, 'domain')->textInput(['readonly' => true])->label(Yii::t('app', 'Hosting Domain')) ?>
                <?= Html::a(Yii::t('app', 'Cancel'), null, ['class' => 'btn btn-primary', 'id' => 'cancelAdditionalHostingButton']) ?>
            </div>
        </div>
    <?= $form->field($website, 'url')->textInput(['maxlength' => 255]) ?>
    <?= $form->field($website, 'incomingMonthlyTraffic')->textInput() ?>
    <div class="form-group">
        <?= Html::submitButton($website->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $website->isNewRecord ? 'btn btn-lg btn-block btn-success' : 'btn btn-primary']) ?>
    </div>
    <?php ActiveForm::end(); ?>
</div>
<?php
    $this->registerJs("$(document).ready(function () {

        $('#website-hosting_id').on('change', function() {
            if($(this).val() == 'addAdditionalHosting') {
                $('#website-hosting_id').prop('disabled', true);
                $('#website-hosting_id').attr('disabled', true);
                $('#hosting-name').prop('readonly', false);
                $('#hosting-domain').attr('readonly', false);
                $(this).parents('.form-group').hide();
                $('#addAdditionalHostingContainer').show('slow');
            }
        });

        $('#cancelAdditionalHostingButton').on('click', function() {
            $('#hosting-name').prop('readonly', true);
            $('#hosting-domain').attr('readonly', true);
            $('#website-hosting_id').prop('disabled', false);
            $('#website-hosting_id').attr('disabled', false);
            $('#website-hosting_id').parents('.form-group').show();
            $('#addAdditionalHostingContainer').hide('slow');
        });

    });");
?>

这个想法是:您可以选择主机的表单列表,也可以添加另一个。 问题是JS验证已经生成,当我从列表中选择一些主机时。 我无法提交表单,因为验证正在验证这个隐藏的字段。

1 个答案:

答案 0 :(得分:0)

我认为您需要在验证码中使用 ,例如:

['Field1', 'required', 'when' => function ($model) {
      return $model->Feild2 == 'VALUE';
},   'whenClient' => "function (attribute, value) {
return $('#FORMID-Field2').val() == 'value';
}"],

注意:如上所述,你不应该在你的视图中包含这样的逻辑,例如你在视图中检查GET参数,这是错误的。这样的代码应该在控制器内部。