【发布时间】:2021-09-11 12:11:44
【问题描述】:
我是 Yii2 的新手,我一直在尝试研究如何根据带有客户端验证的 dropDownList 选择来隐藏/显示表单上的某些字段。
基本上我有一个模型和表单视图来收集与“候选人”相关的信息,我希望应用以下逻辑:
-
仅当 'qualification_id' 的 dropDownList 选择 = 2 时才显示字段 'assigned_to' 和 'phone'。
-
如果 'qualification_id' = 2(其他可选),则需要字段 'assigned_to' 和 'phone'
我的代码如下,虽然没有按我的需要工作。客户端验证不起作用(即当qualification_id = 2 时不需要'assigned_to' 和'phone')。我无法弄清楚如何根据“qualification_id”选择动态隐藏/显示字段。我认为这需要一些 javascript。
任何帮助将不胜感激!
型号:
namespace frontend\models;
use Yii;
/**
* This is the model class for table "candidate".
*
* @property int $candidate_id
* @property string $name
* @property int $qualification_id
* @property string $assigned_to
* @property string $phone
public static function tableName()
{
return 'candidate';
}
public function rules()
{
return [
[['candidate_id', 'qualification_id', 'name'], 'required']
[['candidate_id', 'qualification_id'], 'integer'],
[['name', 'assigned_to’, 'phone’], 'string'],
[['assigned_to', 'phone'],'required','when'=>function($model){
return ($model->qualification_id == 2);
},
'whenClient'=>"function(attribute, value){
return $('#qualification_id').val() == 2;
}"],
查看(表格):
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
use frontend\models\QualificationType;
/* @var $this yii\web\View */
/* @var $model frontend\models\Candidate */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="candidate-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'name')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'qualification_id')->dropDownList(
ArrayHelper::map(QualificationType::find()->all(),'qualification_id','qualification'),
[
'prompt'=>'Select...',
'id' => 'review_type_id',
'onchange' => 'changeQualification()'
]
) ?>
<?= $form->field($model, 'assigned_to')->textInput(['maxlength' => true]) ?>
<?= $form->field($model, 'phone')->textInput(['maxlength' => true]) ?>
<div class="form-group">
<?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
<?php
$script = <<<JS
function changeQualification() {
if ($('#qualification_id').val() == 2) {
$('#assigned_to').show();
$('#name).show();
} else {
$('#assigned_to).hide();
$('#name).hide();
}
}
JS;
$this->registerJs($script);
?>
【问题讨论】:
-
首先有一个错字,我希望这只是在这里,而不是在你的实际代码中:
... $form->field($model, 'assigned_to)-> ...(asigned_to 之后的结束撇号(=')在哪里?)。其次:您是否尝试过一个简单的 javascript/jquery 脚本来隐藏输入? How can I show and hide elements based on selected option with jQuery? -
谢谢,幸运的是结束撇号在我的代码中。我在下面的 SmartMan21Sen 响应中尝试了 Javascript,但无法使其正常工作。
-
什么没用?你尝试了什么?使用当前代码更新您的问题。还有什么可以帮助你的?您的问题与 Yii2 本身没有太大关系。只是您使用该框架。您的问题是 “当我在下拉列表中选择值 '2' 时,如何通过 JavaScript 隐藏 HTML 元素”。据我所知,您似乎在为您不知道使用
$form->field($model, 'assigned_to)->textInput(['maxlength' => true])生成的输入的ID(撇号错字直到今天仍然存在)这一事实而苦苦挣扎。在浏览器中使用 HTML 检查器。 -
您好绝对不是 Rafal,感谢您对我的坚持。你是对的,因为我被困在 javascript 方面。我已经用我正在使用的当前代码更新了这个问题。我仍然面临的问题是javascript函数似乎没有被识别。我想知道我是否将它错误地添加到视图中,或者我是否需要在 yii2 中启用 js 或其他东西。任何帮助将不胜感激。谢谢,Adsar
-
在继续之前:您了解每行添加的含义吗?因为我不认为你这样做。例如:
$('#assigned_to')命令在当前文档中搜索带有id="assigned_to"的 HTML 元素。我 99.99999% 确信$form->field($model, 'assigned_to')->textInput(['maxlength' => true])不会生成具有该 id 的 HTML 元素,因此什么也没发生。您需要查看生成的 HTML 并检查正在生成的 ID,这就是您需要使用的,而不是仅仅假设生成的 ID 是assigned_to。
标签: javascript php conditional-statements yii2-validation