我是这个社区的新手,我刚开始用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验证已经生成,当我从列表中选择一些主机时。 我无法提交表单,因为验证正在验证这个隐藏的字段。
答案 0 :(得分:0)
我认为您需要在验证码中使用 ,例如:
['Field1', 'required', 'when' => function ($model) {
return $model->Feild2 == 'VALUE';
}, 'whenClient' => "function (attribute, value) {
return $('#FORMID-Field2').val() == 'value';
}"],
注意:如上所述,你不应该在你的视图中包含这样的逻辑,例如你在视图中检查GET参数,这是错误的。这样的代码应该在控制器内部。