【问题标题】:Yii2 - Show/Hide Fields on Form based on dropDown selection on formYii2 - 根据表单上的下拉选择在表单上显示/隐藏字段
【发布时间】:2021-09-11 12:11:44
【问题描述】:

我是 Yii2 的新手,我一直在尝试研究如何根据带有客户端验证的 dropDownList 选择来隐藏/显示表单上的某些字段。

基本上我有一个模型和表单视图来收集与“候选人”相关的信息,我希望应用以下逻辑:

  1. 仅当 'qualification_id' 的 dropDownList 选择 = 2 时才显示字段 'assigned_to' 和 'phone'。

  2. 如果 '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-&gt;field($model, 'assigned_to)-&gt; ...(asigned_to 之后的结束撇号(=')在哪里?)。其次:您是否尝试过一个简单的 javascript/jquery 脚本来隐藏输入? How can I show and hide elements based on selected option with jQuery?
  • 谢谢,幸运的是结束撇号在我的代码中。我在下面的 SmartMan21Sen 响应中尝试了 Javascript,但无法使其正常工作。
  • 什么没用?你尝试了什么?使用当前代码更新您的问题。还有什么可以帮助你的?您的问题与 Yii2 本身没有太大关系。只是您使用该框架。您的问题是 “当我在下拉列表中选择值 '2' 时,如何通过 JavaScript 隐藏 HTML 元素”。据我所知,您似乎在为您不知道使用$form-&gt;field($model, 'assigned_to)-&gt;textInput(['maxlength' =&gt; true]) 生成的输入的ID(撇号错字直到今天仍然存在)这一事实而苦苦挣扎。在浏览器中使用 HTML 检查器。
  • 您好绝对不是 Rafal,感谢您对我的坚持。你是对的,因为我被困在 javascript 方面。我已经用我正在使用的当前代码更新了这个问题。我仍然面临的问题是javascript函数似乎没有被识别。我想知道我是否将它错误地添加到视图中,或者我是否需要在 yii2 中启用 js 或其他东西。任何帮助将不胜感激。谢谢,Adsar
  • 在继续之前:您了解每行添加的含义吗?因为我不认为你这样做。例如:$('#assigned_to') 命令在当前文档中搜索带有id="assigned_to" 的 HTML 元素。我 99.99999% 确信 $form-&gt;field($model, 'assigned_to')-&gt;textInput(['maxlength' =&gt; true]) 不会生成具有该 id 的 HTML 元素,因此什么也没发生。您需要查看生成的 HTML 并检查正在生成的 ID,这就是您需要使用的,而不是仅仅假设生成的 ID 是 assigned_to

标签: javascript php conditional-statements yii2-validation


【解决方案1】:

请这样尝试

在视图中

<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' => 'qualification_id', 'onchange' => 'changeQualificationType()']
        ) ?>
    
        <?= $form->field($model, 'assigned_to)->textInput(['id' => 'assigned_to_Input', 'maxlength' => true]) ?>
    
        <?= $form->field($model, 'phone')->textInput(['id' => 'phone_input', 'maxlength' => true]) ?>
    
        <div class="form-group">
            <?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
        
        </div>
    
        <?php ActiveForm::end(); ?>
    
    </div>



<?php
$script = <<<JS
    function changeQualificationType() {
      if ($('#qualification_id').val() == 2) {
       $('#assigned_to_input').closest('.form-group').show();
       $('#phone_input').closest('.form-group').show();
      } else {
       $('#assigned_to_input').closest('.form-group').hide();
       $('#phone_input').closest('.form-group').hide();
      }
    }
JS;
$this->registerJs($script);

在模型中

public function rules()
    {
        return [
            [['candidate_id', 'qualification_id', 'name'], 'required']
            [['candidate_id', 'qualification_id'], 'integer'],
            [['name', 'assignedTo, 'phone’], 'string'],

            [['assignedTo', 'phone'],'required','when'=>function($model){
            
                return ($model->qualification_id == 2);
                },
                                    
            'whenClient'=>"function(attribute, value){
                    return $('#qualification_id').val() == 2; 
                                    
                 }"],

不要忘记在 ActiveFormField 中设置自定义 id。所有字段id都需要与Jquery和Model的函数相匹配。

【讨论】:

  • 嗨 SmartMan21Sen,
  • 您好 SmartMan21Sen,非常感谢您的帮助。不幸的是,它仍然没有按预期运行。我要隐藏的字段显示在 dropDownList 选择之前,无论是 == 2 还是其他选项,选择时似乎都没有发生任何事情。如果qualification_id selection == 2,我只想显示这些字段。我错过了什么吗?
  • 你好阿萨。我可以远程帮你吗?
  • 请检查附加的javascript代码是否正常工作
  • SmartMan21Sen,Javascript 似乎无法正常工作。它不会根据条件隐藏和显示字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多