Yii2:从相关模型重复字段

时间:2014-12-26 09:57:39

标签: javascript php jquery yii2

您好我有两张桌子/模特公司和合作伙伴。一家公司可以拥有多个合作伙伴。

我试图以公司形式重复合作伙伴字段。

这很有效,除非条件是如果我在创建时没有添加任何合作伙伴,我无法在更新时添加合作伙伴,这意味着如果没有合作伙伴,则不会显示任何字段伙伴。

我的_form.php代码是这样的:

<script type="text/javascript">

    function addNewSection(divToAppend, modelName) {
        $cloneDiv = $("#" + divToAppend).children().last().clone();
        updateControlId($cloneDiv, modelName);
        $cloneDiv.find('#divDelete').removeClass('dnone').addClass('dblock');
        $cloneDiv.find("#divDelete").removeClass('hidden');
        $cloneDiv.appendTo("#" + divToAppend);
    }

    function updateControlId($cloneDiv, modelName) {
        $cloneDiv.find("[name*='" + modelName + "']").each(function() {
            var name = $(this).attr('name');
            var id = $(this).attr('id');
            var splittedStr = id.split("-");
            var modelName = 'Partners';           
            var index = parseInt(splittedStr[1]) + 1;
            var newId = modelName + "-" + index;
            var newName = modelName + "[" + index;
            var ind = name.indexOf("]");
            //update the id 
            id = id.replace(id.substr(0, modelName.length + 2), newId);
            //update the name
            name = name.replace(name.substr(0, ind), newName);
            $(this).attr('id', id);
            $(this).attr('name', name);
            $(this).val('');
        });
    }

    function deleteSection(obj, parentDiv) {
        if ($("#" + parentDiv + " > div").length > 1) {
            $(obj).parent().parent().remove();
        }
    }
</script>

<style>
    .dnone {
        display: none !important;
    }
    .dblock {
        display: block !important;
    }
</style>

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;

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

<div class="company-form">

    <?php $form = ActiveForm::begin(); ?>
    <?= $form->field($model, 'name')->textInput(['maxlength' => 255]) ?>
    <?= $form->field($model, 'address')->textInput() ?>
    <?= $form->field($model, 'phone')->textInput(['maxlength' => 55]) ?>
    <?= $form->field($model, 'email')->textInput(['maxlength' => 255]) ?>

    <div id="companyPartners">
        <?php $id = 0; ?>       
        <?php foreach ($partnerModels as $partner) { ?> 
            <div id="language" class="work-data-pad brdr-work marbtm10 row">
                <div class="col-md-3">     
                    <?= $form->field($partner, '[' . $id . ']' . 'name')->textInput(['maxlength' => 255]) ?>      
                </div>
                <div class="col-md-3">   
                    <?= $form->field($partner, '[' . $id . ']' . 'email')->textInput(['maxlength' => 255]) ?>      
                </div>
                <div class="col-md-3">     
                    <?= $form->field($partner, '[' . $id . ']' . 'mobile')->textInput(['maxlength' => 255]) ?>      
                </div>
                <div style="margin-top: 30px;" class="col-md-3 <?php echo ($id < 1) ? 'dnone' : 'dblock'; ?>" id="divDelete" class="row-fluid">           
                <a class="ft11 btn-remove" onclick="deleteSection(this, 'companyPartners');"><span class="marleft18">Remove</span></a>               
                </div>  
            </div>
         <?php $id++; ?> 
        <?php } ?>
    </div>

    <div class="row">
        <div class="col-md-12">
            <button type="button" class="btn btn-primary sec-btn marbtm10" onclick="addNewSection('companyPartners', 'Partners')">+ Add Partner</button>
        </div>
    </div>

    <div class="row" style="margin-top: 20px;">
        <div class="col-md-12">
            <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
        </div>
    </div>
    <?php ActiveForm::end(); ?>

</div>

我的控制器更新操作中的代码如下:

public function actionUpdate($id) {
        $model = $this->findModel($id);
        $partnerModels = $model->partners;

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            \app\models\Partners::deleteAll('company_id = '. $model->id);

            foreach ($_POST['Partners'] as $partner) {
                if (!empty($partner['name']) && !is_null($partner['name'])) {
                    $partnerModel = new \app\models\Partners();
                    $partnerModel->attributes = $partner;
                    $partnerModel->company_id = $model->id;
                    $partnerModel->save();
                }
            }
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('update', [
                        'model' => $model,
                        'partnerModels' => $partnerModels
            ]);
        }
    }

现在我怎么能弄清楚这里出了什么问题?但我没有为合作伙伴提供更新的字段。 如果需要更多信息,请告诉我。

如果我在这里使用的解决方案有更好的解决方案,我将不胜感激。

由于

1 个答案:

答案 0 :(得分:1)

当然它不起作用,查看你的javascript,你克隆最后一行添加一个新行,你没有最后一行,因为你没有合作伙伴在列表中。

有几个选项,最简单的选项可能是在顶部添加一个隐藏的行。通过这种方式,您将始终拥有最后一行。请记住在克隆时使行可见。

这样的东西
<div id="companyPartners">
        <?php $id = 0; ?>
        <?php $partner = new \app\models\Partners(); ?>
            <div style="display: none;" id="language" class="work-data-pad brdr-work marbtm10 row">
                <div class="col-md-3">     
                    <?= $form->field($partner, '[' . $id . ']' . 'name')->textInput(['maxlength' => 255]) ?>      
                </div>
                <div class="col-md-3">   
                    <?= $form->field($partner, '[' . $id . ']' . 'email')->textInput(['maxlength' => 255]) ?>      
                </div>
                <div class="col-md-3">     
                    <?= $form->field($partner, '[' . $id . ']' . 'mobile')->textInput(['maxlength' => 255]) ?>      
                </div>
                <div style="margin-top: 30px;" class="col-md-3 <?php echo ($id < 1) ? 'dnone' : 'dblock'; ?>" id="divDelete" class="row-fluid">           
                <a class="ft11 btn-remove" onclick="deleteSection(this, 'companyPartners');"><span class="marleft18">Remove</span></a>               
                </div>  
            </div>

        <?php foreach ($partnerModels as $partner) { ?> 
            <div id="language" class="work-data-pad brdr-work marbtm10 row">
                <div class="col-md-3">     
                    <?= $form->field($partner, '[' . $id . ']' . 'name')->textInput(['maxlength' => 255]) ?>      
                </div>
                <div class="col-md-3">   
                    <?= $form->field($partner, '[' . $id . ']' . 'email')->textInput(['maxlength' => 255]) ?>      
                </div>
                <div class="col-md-3">     
                    <?= $form->field($partner, '[' . $id . ']' . 'mobile')->textInput(['maxlength' => 255]) ?>      
                </div>
                <div style="margin-top: 30px;" class="col-md-3 <?php echo ($id < 1) ? 'dnone' : 'dblock'; ?>" id="divDelete" class="row-fluid">           
                <a class="ft11 btn-remove" onclick="deleteSection(this, 'companyPartners');"><span class="marleft18">Remove</span></a>               
                </div>  
            </div>
         <?php $id++; ?> 
        <?php } ?>
    </div>

然后在你的函数addNewSection(divToAppend,modelName){ 你可以添加一行来使$ cloneDiv attr显示为块。

有更优雅的方式,但需要很长时间来解释它们是如何工作的。