Вообщем танцы с бубном привели меня к выводу что ActiveForm совсем не заточен для динамических полей формы
Код: Выделить всё
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
?>
<?php $form = ActiveForm::begin(); ?>
<h3>Товар</h3><br/>
<?= $form->field($model->product, 'name')->textInput()->label('Название') ?>
<?= $form->field($model->product, 'description')->textarea()->label('Описание') ?>
<br/><h3>Варианты</h3><br/>
<div class="productVariants">
<div class="row">
<div class="col-xs-4">
<?= Html::label('Название', '', ['class' => 'control-label']) ?>
</div>
<div class="col-xs-3">
<?= Html::label('Артикул', '', ['class' => 'control-label']) ?>
</div>
<div class="col-xs-2">
<?= Html::label('Цена', '', ['class' => 'control-label']) ?>
</div>
<div class="col-xs-2">
<?= Html::label('Наличие', '', ['class' => 'control-label']) ?>
</div>
<div class="col-xs-1">
<?= Html::label(' ', '', ['class' => 'control-label']) ?>
</div>
</div>
<div class="productVariantsBody">
<?php foreach($model->variants as $i => $variant): ?>
<div class="row productVariant" style="margin-bottom: 10px;">
<div class="col-xs-4">
<?= Html::hiddenInput($model->variants[0]->formName() . '['.$i.'][id]', $variant->id) ?>
<?= $form->field($variant, '['.$i.']name')->label(false) ?>
</div>
<div class="col-xs-3">
<?= $form->field($variant, '['.$i.']sku')->label(false) ?>
</div>
<div class="col-xs-2">
<?= $form->field($variant, '['.$i.']price')->label(false) ?>
</div>
<div class="col-xs-2">
<?= $form->field($variant, '['.$i.']stock')->label(false) ?>
</div>
<div class="col-xs-1">
<?= Html::button('Удалить', ['class' => 'btn btn-danger removeVariant']) ?>
</div>
</div>
<?php endforeach; ?>
</div>
</div>
<div class="form-group">
<?= Html::button('Добавить вариант', ['class' => 'btn btn-warning addVariant']) ?>
<?= Html::submitButton('Сохранить', ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
<?php
$this->registerJs("
$(document).on('click', '.removeVariant', function() { $(this).closest('.row').remove() });
var regexID = /(\w+?)(-\d-{1,}|--\d{1,}-)/;
var regexName = /(\w+)(\[\d{1,}\]|\[-\d{1,}\])/;
var variantIndex = -1;
var variantTemplate = $('.productVariant:last').clone(false);
$('.addVariant').on('click', function() {
$(variantTemplate).clone(false).appendTo('.productVariantsBody');
$('.productVariant:last').html(
$('.productVariant:last').html()
.replace(new RegExp(regexName,'gi'), '$1['+ variantIndex +']')
.replace(new RegExp(regexID,'gi'), '$1-'+ variantIndex +'-')
);
$('.productVariant:last input').each(function(i,e) {
$(e).val('');
addValidator(e);
});
variantIndex = variantIndex-1;
});
function addValidator(field) {
// тут добавляем некое условие что бы понять есть ли у данного поля валидаторы
// адскими усилиями можно достать их по примеру ActiveForm
if( условие ){
$(field).closest('form').yiiActiveForm('add', {
id: $(field).attr('id'),
name: $(field).attr('name'),
container: $(field).parent(),
input: $(field),
error: $(field).parent().find('.help-block'),
validate: function (attribute, value, messages, deferred, $form) {
yii.validation.required(value, messages, {message: 'Validation Message Here'});
// ...
}
});
}
}
");
?>
сама функция крайне бессмысленная)))
Код: Выделить всё
$(field).closest('form').yiiActiveForm('add', {
id: $(field).attr('id'),
name: $(field).attr('name'),
container: $(field).parent(),
input: $(field),
error: $(field).parent().find('.help-block'),
validate: function (attribute, value, messages, deferred, $form) {
yii.validation.required(value, messages, {message: 'Validation Message Here'});
// ...
}
});
было бы куда проще если бы ею можно было воспользоваться как то так
Код: Выделить всё
$('input[name*=VariantForn][name*=name]').yiiActiveForm('add', {
validate: function (attribute, value, messages, deferred, $form) {
yii.validation.required(value, messages, {message: 'Validation Message Here'});
// ...
}
}
или еще лучше - указать в настройках формы 'мультиполя' и что бы правила прописывались не к каждому полю а для группы полей