如何为动态表单字段提供隐藏的输入值yii2

时间:2015-12-03 23:02:12

标签: yii2 yii2-advanced-app yii2-basic-app

我对几天的一个问题感到困惑,我无法解决它。我有一个具有不同类的表单,当用户点击添加按钮时,我想生成几个字段。我可以生成字段,但我无法将那些特定的class_id传递给那些动态生成的字段。我正在使用this widget这就是我如何生成动态字段。

仅涉及的模型是Registration形式。除此之外,我只是触发查询并显示数据。一个类可以有多个Registrations

Class      Registration
is         id
name       class_id
           firstname
           lastname

这是我的观看代码

 <?php if (!empty($data)) {
    foreach($data as $event){

        $modelsRegistration = [new Registration()];

        DynamicFormWidget::begin([
            'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
                        'widgetBody' => '.container-items'.$model['id'], // required: css class selector
                        'widgetItem' => '.item'.$model['id'], // required: css class
                        'limit' => 4, // the maximum times, an element can be added (default 999)
                        'min' => 0, // 0 or 1 (default 1)
                        'insertButton' => '.add-item'.$model['id'], // css class
                        'deleteButton' => '.remove-item'.$model['id'], // css class
                        'model' => $modelsRegistration[0],
                        'formId' => 'registration-form',
                        'formFields' => [
                            'firstname',
                            'lastname',
                        ],
        ]);

        ?>
        <div class="container">
            <div class="row">
                <div class="col-lg-9 col-md-9 col-sm-12 col-xs-12">
                    <table class="table table-striped table-bordered">
                        <thead>
                        <tr>
                            <th class="col-lg-4 col-md-4 col-sm-4 col-xs-4">Class Name</th>
                            <th class="col-lg-2 col-md-2 col-sm-2 col-xs-2">Rounds</th>
                        </tr>
                        </thead>
                        <tbody>
                        <tr>
                            <td><?= $event['name'] ?></td>
                            <td><button type="button" id="<?= $event['id'] ?>"  class="add-item<?=$model['id'] ?> btn btn-success btn-xs">Add Rounds <i
                                        class="glyphicon glyphicon-plus"></i></button></td>
                        </tr>
                        </tbody>
                    </table>
                    <div class="row">
                        <div class="container-items<?=$model['id'] ?>"><!-- widgetBody -->
                            <?php foreach ($modelsRegistration as $i => $modelRegistration){

                                ?>
                                <div class="item<?=$model['id'] ?>"><!-- widgetItem -->
                                    <?php
                                    // necessary for update action.
                                    if (!$modelRegistration->isNewRecord) {
                                        echo Html::activeHiddenInput($modelRegistration, "[{$i}]id");
                                    }
                                    ?>
                                    <div class="row">
                                        <div class="col-sm-5">
                                            <?= $form->field($modelRegistration, "[{$i}]firstname")->textInput(['maxlength' => true]) ?>
                                        </div>
                                        <div class="col-sm-5">
                                            <?= $form->field($modelRegistration, "[{$i}]lastname")->textInput(['maxlength' => true]) ?>
                                            <?= $form->field($modelRegistration, "[{$i}]class_id")->hiddenInput(['maxlength' => true])->label(false) ?>
                                        </div>
                                        <div class="col-sm-2">
                                            <button type="button" class="remove-item<?=$model['id'] ?> btn btn-danger btn-xs"><i
                                                    class="glyphicon glyphicon-minus"></i></button>
                                        </div>
                                    </div>
                                    <!-- .row -->
                                </div>
                            <?php } ?>
                        </div>
                    </div>
                </div>
            </div>
        </div>
        <?php
        DynamicFormWidget::end();
    } } ?>

1 个答案:

答案 0 :(得分:1)

如果您的视图只显示一个班级的人(因此,添加更多人意味着他们都是同一个班级),您可以在dynamicform中仅使用名字/姓氏字段并添加此id_class 1}}稍后在控制器中保存之前。

示例:

// load and validation of the model
// ...


foreach ($modelsRegistration as $modelRegistration) {
    $modelRegistration->class_id = $myClassId;
    if (! ($flag = $modelRegistration->save(false))) {
        $transaction->rollBack();
        break;
    }
}

现在,如果在您的视图中,您所有班级的人员按部分划分,并且每个部分都有此添加按钮,我强烈建议您从那里删除此添加按钮,并创建一个新部分,仅用于添加人员(选择为选择一个班级。)

<强>步骤:

  • 删除所有这些部分中 DynamicFormWidget 类中的选项insertButton。并删除html按钮(不再工作)。
  • 添加新部分,如下所示:

    <?php
    $newModelsRegistration = [new Registration()];
    
    DynamicFormWidget::begin([
        'widgetContainer' => 'dynamicform_wrapper_registration', // required: [A-z0-9_]
                    'widgetBody' => '.container-items-registration', // required: css class selector
                    'widgetItem' => '.item-registration', // required: css class
                    'limit' => 1, // the maximum times, an element can be added (default 999)
                    'min' => 0, // 0 or 1 (default 1)
                    'insertButton' => '.add-item-registration', // css class
                    'deleteButton' => '.remove-item-registration', // css class
                    'model' => $newModelsRegistration[0], // 
                    'formId' => 'registration-form',
                    'formFields' => [
                        'firstname',
                        'lastname',
                        'class_id'
                    ],
    ]);
    
    ?>
    <div class="panel-body">
        <button type="button" class="add-item-registration btn btn-success btn-sm pull-right margin-b-base">
            <i class="glyphicon glyphicon-plus"></i> Add
        </button>
        <div class="clearfix"></div>
        <div class="container-items-registration"><!-- widgetBody -->
    
        <?php foreach ($newModelsRegistration as $i => $newModelRegistration): ?>
    
            <div class="item-registration panel panel-default"><!-- widgetItem -->
                <div class="panel-heading">
                    <h3 class="panel-title pull-left">Registration</h3>
                    <div class="pull-right">
                        <button type="button" class="remove-item-registration btn btn-danger btn-xs"><i class="glyphicon glyphicon-minus"></i></button>
                    </div>
                    <div class="clearfix"></div>
                </div>
    
                <div class="panel-body">
                    <div class="form-group row">
                        <div class="col-md-12">
                            <?= $form->field($newModelRegistration, "[{$i}]firstname")->textInput(['maxlength' => true]) ?>
                            <?= $form->field($newModelRegistration, "[{$i}]lastname")->textInput(['maxlength' => true]) ?>
                            <?= $form->field($newModelRegistration, "[{$i}]class_id")->dropDownList(
                                ArrayHelper::map(Class::find()->all(), 'id', 'name'),
                                ['prompt' => 'Select']
                            ) ?>
                        </div>
                    </div>
                </div>
            </div>
    
        <?php endforeach; ?>
    
        </div>
    </div>
    
    <?php DynamicFormWidget::end(); ?>
    
  • 确保 limit 选项设置为1。因此,很容易避免人们试图在同一个类中添加太多注册(如果我理解正确,每个类都有限制注册量)。您可以在注册模型中添加新规则,并检查它是否已达到该类的限制。 find()中使用的dropDownList方法也是如此。

但是如果您仍想在同一视图中添加所有这些添加按钮,您可以随时使用js为您添加该值。

示例:

// begin of form
// ...

<?= $form->field($modelRegistration, "[{$i}]class_id")->hiddenInput(['maxlength' => true, 'class' => 'form-control add-class-id', 'data-event' => $event['id']])->label(false) ?>

// end of form


<?php
$js = <<<JS
$('#registration-form').on('submit', function (e) {
    $('.add-class-id').each(function() {
        $(this).val($(this).attr('data-event'));
    });
});
JS;
$this->registerJs($js);
?>

如果有任何这些想法适合您,请告诉我。

相关问题