javascript - 使用 Yii2-dynamicforms 更新(嵌套动态表单)

标签 javascript php jquery yii2

在我的 Yii 2 项目中,我有一个使用 yii2-dynamicform 的嵌套动态表单延期。我可以让它在 wiki guide 之后工作, 但我不得不在 this StackOverflow question 中寻求帮助使其正常工作。 但是当我尝试添加更多字段时,我在更新时遇到了一个小问题。

在解释之前,让我展示一下我的场景: enter image description here

enter image description here

我的问题:

更新一条记录,当我点击添加一个新的插槽字段时,它不是只添加一个,而是添加我已经添加的组数。

例如: 在上图中,我有两个组(group1 和group2)。如果我点击添加一个插槽,它会一次添加两个(组数)插槽。

谁能帮帮我,好吗?

我在 Controller 中的 actionUpdate:

public function actionUpdate($id)
{

    $model = $this->findModel($id);


    $oldGrupoIds = MissaoGrupo::find()->select('id')->where(['missao_id' => $id])->asArray()->all();
    $oldGrupoIds = ArrayHelper::getColumn($oldGrupoIds, 'id');
    $modelsGrupos = MissaoGrupo::findAll(['id' => $oldGrupoIds]);
    $modelsGrupos = (empty($modelsGrupos)) ? [new MissaoGrupo] : $modelsGrupos;


    $oldSlotIds = [];
    foreach ($modelsGrupos as $i => $modelGrupo) {
        $oldSlots = MissaoSlot::findAll(['grupo_id' => $modelGrupo->id]);
        $modelsSlots[$i] = $oldSlots;
        $oldSlotIds = array_merge($oldSlotIds, ArrayHelper::getColumn($oldSlots, 'id'));
        $modelsSlots[$i] = (empty($modelsSlots[$i])) ? [new MissaoSlot] : $modelsSlots[$i];
    }


    if ($model->load(Yii::$app->request->post())) {


        $modelsGrupos = Model::createMultiple(MissaoGrupo::classname(), $modelsGrupos);
        Model::loadMultiple($modelsGrupos, Yii::$app->request->post());
        $newGrupoIds = ArrayHelper::getColumn($modelsGrupos, 'id');


        $newSlotIds = [];
        $loadsData['_csrf'] =  Yii::$app->request->post()['_csrf'];
        $i = 0;
        foreach ($modelsGrupos as $id => $value) {
            $loadsData['MissaoSlot'] =  Yii::$app->request->post()['MissaoSlot'][$i];
            if (!isset($modelsSlots[$id])) {
                $modelsSlots[$id] = [new MissaoSlot];
            }
            $modelsSlots[$id] = Model::createMultiple(MissaoSlot::classname(), $modelsSlots[$id], $loadsData);
            Model::loadMultiple($modelsSlots[$id], $loadsData);
            $newSlotIds = array_merge($newSlotIds, ArrayHelper::getColumn($loadsData['MissaoSlot'], 'id'));
            $i++;
        }


        $delSlotIds = array_diff($oldSlotIds, $newSlotIds);
        if (! empty($delSlotIds)) MissaoSlot::deleteAll(['id' => $delSlotIds]);
        $delGrupoIds = array_diff($oldGrupoIds, $newGrupoIds);
        if (! empty($delGrupoIds)) MissaoGrupo::deleteAll(['id' => $delGrupoIds]);


        $valid = $model->validate();
        $valid = $this->validaMissao($modelsGrupos, $modelsSlots) && $valid;

        if ($valid) { 
            if ($this->saveMissao($model, $modelsGrupos, $modelsSlots)) {
                return $this->redirect(['view', 'id' => $model->id]);
            }
        }
    }

    return $this->render('update', [
        'model' => $model,
        'modelsGrupos' => $modelsGrupos,
        'modelsSlots' => $modelsSlots,
    ]);
}

protected function saveMissao($modelMissao, $modelsGrupos, $modelsSlots)
{
    $transaction = \Yii::$app->db->beginTransaction();
    try {
        if ($go = $modelMissao->save(false)) {

            foreach ($modelsGrupos as $i => $modelGrupo) {
                // Salva os Grupos
                $modelGrupo->missao_id = $modelMissao->id;
                if ($go = $modelGrupo->save(false)) {

                    foreach ($modelsSlots[$i] as $j => $modelSlot) {
                        // Salva os Slots
                        $modelSlot->grupo_id = $modelGrupo->id;
                        if (! ($go = $modelSlot->save(false))) {
                            $transaction->rollBack();
                            break;
                        }

                    }

                }
            }

        }
        if ($go) {
            $transaction->commit();
        }
    } catch (Exception $e) {
        $transaction->rollBack();
    }

    return $go;
}

我的表格:

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use wbraganca\dynamicform\DynamicFormWidget;

/* @var $this yii\web\View */
/* @var $model app\models\Missao */
/* @var $form yii\widgets\ActiveForm */
?>

<div class="missao-form">

    <?php $form = ActiveForm::begin(['id' => 'frm_missao']); ?>

    <?= $form->errorSummary($model) ?>

    <!-- Nav tabs -->
    <ul class="nav nav-tabs" role="tablist">
        <li role="presentation" class="active">
            <a href="#aba-detalhes-missao" aria-controls="home" role="tab" data-toggle="tab"><i class="fa fa-info-circle"></i> Detalhes da missão</a>
        </li>
        <li role="presentation">
            <a href="#aba-slots" aria-controls="profile" role="tab" data-toggle="tab"><i class="fa fa-users"></i> Slots</a>
        </li>
    </ul>

    <div class="tab-content">
        <div role="tabpanel" class="tab-pane active" id="aba-detalhes-missao">
            <br/>
            <?= $form->field($model, 'nome')->textInput(['maxlength' => true]) ?>
            <?= $form->field($model, 'desc')->textInput(['maxlength' => true]) ?>
        </div>
        <div role="tabpanel" class="tab-pane" id="aba-slots">
            <br/>
            <div class="panel panel-default">
                <div class="panel-body">
                    <?php DynamicFormWidget::begin([
                        'widgetContainer' => 'dynamicform_wrapper',
                        'widgetBody' => '.container-grupos',
                        'widgetItem' => '.grupo',
                        //'limit' => 4,
                        'min' => 1,
                        'insertButton' => '.add-grupo',
                        'deleteButton' => '.remove-grupo',
                        'model' => $modelsGrupos[0],
                        'formId' => 'frm_missao',
                        'formFields' => [
                            'nome',
                        ],
                    ]); ?>
                    <div class="panel panel-default">
                        <div class="panel-heading">Grupos / Slots</div>
                        <div class="panel-body container-grupos">
                            <?php foreach ($modelsGrupos as $i => $modelGrupo): ?>
                            <div class="row grupo"> <!-- Item Grupo - INICIO -->
                                <table class="table">
                                    <tr>
                                        <th style="width:5%">#</th>
                                        <th>Grupo</th>
                                        <th>Slot</th>
                                    </tr>
                                    <tr>
                                        <td><button class="btn btn-danger remove-grupo"><i class="fa fa-minus"></i></button></td>
                                        <td class="col-md-4">
                                            <?php
                                            // necessary for update action.
                                            if (! $modelGrupo->isNewRecord) {
                                                echo Html::activeHiddenInput($modelGrupo, "[{$i}]id");
                                            }
                                            ?>
                                            <?= $form->field($modelGrupo, "[{$i}]nome")->textInput(['maxlength' => true, 'placeholder' => 'Nome do Grupo'])->label(false) ?>
                                        </td>
                                        <td><!-- Slots -->
                                            <?php DynamicFormWidget::begin([
                                                'widgetContainer' => 'dynamicform_inner',
                                                'widgetBody' => '.container-slots',
                                                'widgetItem' => '.slot',
                                                //'limit' => 10,
                                                'min' => 1,
                                                'insertButton' => '.add-slot',
                                                'deleteButton' => '.remove-slot',
                                                'model' => $modelsSlots[$i][0],
                                                'formId' => 'frm_missao',
                                                'formFields' => [
                                                    'nome',
                                                ],
                                            ]); ?>
                                            <table class="table container-slots">
                                                <?php foreach ($modelsSlots[$i] as $j => $modelSlot): ?>
                                                <tr class="slot">
                                                    <td>
                                                        <?php
                                                        // necessary for update action.
                                                        if (! $modelSlot->isNewRecord) {
                                                            echo Html::activeHiddenInput($modelSlot, "[{$i}][{$j}]id");
                                                        }
                                                        ?>
                                                        <?= $form->field($modelSlot, "[{$i}][{$j}]nome")->textInput(['maxlength' => true, 'placeholder' => 'Nome do Slot'])->label(false) ?>
                                                    </td>
                                                    <td style="width:5%"><button class="btn btn-danger btn-xs remove-slot"><i class="fa fa-minus"></i></button></td>
                                                </tr>
                                                <?php endforeach; ?>
                                                <tfoot>
                                                <tr>
                                                    <td colspan="2"><button class="btn btn-info btn-xs add-slot"><i class="fa fa-plus"></i> Novo Slot</button></td>
                                                </tr>
                                                </tfoot>
                                            </table>
                                            <?php DynamicFormWidget::end(); ?>
                                        </td><!--Slots - fim -->
                                    </tr>
                                </table>
                            </div> <!-- Item Grupo - FIM -->
                            <?php endforeach; ?>
                        </div>
                        <div class="panel-footer">
                            <button class="btn btn-primary btn-xs add-grupo"><i class="fa fa-plus"></i> Novo Grupo</button>
                        </div>
                    </div>
                    <?php DynamicFormWidget::end(); ?>
                </div>
            </div>
        </div>
    </div>

    <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? 'Cadastrar' : 'Atualizar', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?>

</div>

最佳答案

问题解决了!

作者 Yii 2 Dynamic Forms扩展没有更新 Packagist 代码(参见 issue #91 )。

用 GitHub 代码替换正常!

关于javascript - 使用 Yii2-dynamicforms 更新(嵌套动态表单),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32650802/

相关文章:

javascript - 将 Firebase 数据库值连接到 Firebase Web 应用

javascript - 在 javascript 文件中使用 php

php - PHP mysql 中的数据未更新

javascript - Jquery 选择一个 Div 并触发另一个隐藏的 div

javascript - 如何在 jquery success 方法中接收 json 并使用该 json 构建 html 内容

javascript - 组合两个变量

javascript - yii2中通过javascript获取相关模型

javascript - ReactJS:状态上的 Switch 语句与显式状态声明

php - Tagmanager Jquery - ajax 文件必须是什么样子?

php - 仅显示部分文件缩略图