嗨,我有两个表/模型公司和合作伙伴。一家公司可以有多个合作伙伴。
我尝试在公司表单中重复合作伙伴字段。
这运行良好,除非我在创建时没有添加任何合作伙伴,则无法在更新时添加合作伙伴,这意味着如果没有合作伙伴,则不会在更新时显示合作伙伴字段。
我的_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
]);
}
}
现在我怎么搞不清这里出了什么问题?但我没有在更新时获得合作伙伴的字段。如果需要更多信息,请告诉我。
如果对我在这里使用的解决方案有更好的解决方案,我将表示欢迎。
谢谢
当然它
不起作用,看看你的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吸引力显示为块。
有更优雅的方法,但需要很长时间才能解释它们是如何工作的。