在我的 Yii 2 项目中,我有一个使用 yii2-dynamicform 的嵌套动态表单延期。我可以让它在 wiki guide 之后工作, 但我不得不在 this StackOverflow question 中寻求帮助使其正常工作。 但是当我尝试添加更多字段时,我在更新时遇到了一个小问题。
我的问题:
更新一条记录,当我点击添加一个新的插槽字段时,它不是只添加一个,而是添加我已经添加的组数。
例如: 在上图中,我有两个组(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>
最佳答案
关于javascript - 使用 Yii2-dynamicforms 更新(嵌套动态表单),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32650802/