yii2 валидация формы

595
30 апреля 2017, 00:31

Есть форма, где динамический формируется поля. Проблема в том что не работает валидация полей на клиентской части. Если заполнить поле и нажать на сабмит, то срабатывает валидация и выдается сообщение о том что поле обязательна для заполнения и соответственно нельзя ничего сохранить. Проблема началась после того как пытался реализовать проверку на уникальность с помощью ajax, примерно как тут http://stackoverflow.com/questions/34305964/yii2-activeform-unique-validation-not-show-error-message но ничего не вышло и решил вернуть все как было. Кстати если по relations нет записей и срабатывает вот это условие

'modelsDiapazons' => (empty($modelsAddress)) ? [new Vdns] : $modelsAddress,

то тогда все ок, валидация работает как надо

Сама Форма

<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\ArrayHelper;
use wbraganca\dynamicform\DynamicFormWidget;
$js = '
jQuery(".dynamicform_wrapper").on("afterInsert", function(e, item) {
    jQuery(".dynamicform_wrapper .panel-title-address").each(function(index) {
        jQuery(this).html("Address: " + (index + 1))
    });
});
jQuery(".dynamicform_wrapper").on("afterDelete", function(e) {
    jQuery(".dynamicform_wrapper .panel-title-address").each(function(index) {
        jQuery(this).html("Address: " + (index + 1))
    });
});
';
$this->registerJs($js);
$KtService = ArrayHelper::map(common\models\KtService::find()->asArray()->all(), 'id', 'name');
?>
<div class="padding-top-10">
    <?php $form = ActiveForm::begin([
        'id' => 'dynamic-form'
    ]); ?>
    <?php DynamicFormWidget::begin([
        'widgetContainer' => 'dynamicform_wrapper', // required: only alphanumeric characters plus "_" [A-Za-z0-9_]
        'widgetBody' => '.container-items', // required: css class selector
        'widgetItem' => '.item', // required: css class
        'limit' => 4, // the maximum times, an element can be cloned (default 999)
        'min' => 0, // 0 or 1 (default 1)
        'insertButton' => '.add-item', // css class
        'deleteButton' => '.remove-item', // css class
        'model' => $modelsDiapazons[0],
        'formId' => 'dynamic-form',
        'formFields' => [
            'full_name',
            'address_line1',
            'address_line2',
            'city',
            'state',
            'postal_code',
        ],
    ]); ?>
    <div class="panel panel-default">
        <div class="panel-heading">
            Диапазоны
            <button type="button" class="pull-right add-item btn btn-success btn-xs"><i class="fa fa-plus"></i> Добавить</button>
            <div class="clearfix"></div>
        </div>
        <div class="panel-body container-items"><!-- widgetContainer -->
            <?php foreach ($modelsDiapazons as $index => $modelDiapazons): ?>
                <div class="item panel panel-default"><!-- widgetBody -->
                    <div class="panel-heading">
                        <button type="button" class="pull-right remove-item btn btn-danger btn-xs"><i class="fa fa-minus"></i></button>
                        <div class="clearfix"></div>
                    </div>
                    <div class="panel-body">
                        <?php
                            // necessary for update action.
                            if (!$modelDiapazons->isNewRecord) {
                                echo Html::activeHiddenInput($modelDiapazons, "[{$index}]vdn");
                            }
                        ?>
                        <div class="col-md-6 ">
                            <?= $form->field($modelDiapazons, "[{$index}]service")->dropDownList($KtService) ?>
                        </div>
                        <div class="col-md-6 ">
                            <?= $form->field($modelDiapazons, "[{$index}]vdn")->textInput() ?>
                        </div>
                    </div>
                </div>
            <?php endforeach; ?>
        </div>
    </div>
    <?php DynamicFormWidget::end(); ?>
    <?= Html::submitButton($model->isNewRecord ? 'Создать' : 'Изменить', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
     <?= Html::a('Отмена', ['index'], ['class' => 'btn btn-primary']) ?>
    <?php ActiveForm::end(); ?>
</div>

model

namespace common\models;
use Yii;
use yii\db\ActiveRecord;
class Vdns extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'app.vdns';
    }

    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
            [['vdn'], 'required', 'message'=>'* не может быть пустым.'],
            [['vdn'], 'integer'],
            [['vdn', 'service'], 'safe'],
        ];
    }
    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'vdn' => 'Виртуальный номер',
            'service' => 'Служба',
            'region_id' => 'Регион',
        ];
    }
}

Модель с relations

namespace common\models;
use Yii;
use yii\db\ActiveRecord;
use common\models\Vdns;
class Region extends \yii\db\ActiveRecord
{
    /**
     * @inheritdoc
     */
    public static function tableName()
    {
        return 'dictionaries.region';
    }
    /**
     * @inheritdoc
     */
    public function rules()
    {
        return [
        ];
    }
    /**
     * @inheritdoc
     */
    public function attributeLabels()
    {
        return [
            'region_id'  => 'ID',
            'region_name'  => 'Наименование региона',
            'town_code'  => 'Town code',
            'town_name'  => 'Наименование региона',
            'sys_creation_dae'  => 'Дата создания',
            'sys_update_date'   => 'Дата обновления',
            'office_id'         => 'Филиал',
        ];
    }
    public function getVdns()
    {
        return $this->hasMany(Vdns::className(), ['region_id' => 'region_id']);
    }
}

Контроллер

public function actionUpdate($id)
{
    $modelCustomer = $this->findModel($id);
    $modelsAddress = $modelCustomer->vdns;

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

        $oldIDs = ArrayHelper::map($modelsAddress, 'vdn', 'vdn');

        $modelsAddress = Model::createMultipleVdns(Vdns::classname(), $modelsAddress);
        Model::loadMultiple($modelsAddress, Yii::$app->request->post());
        $deletedIDs = array_diff($oldIDs, array_filter(ArrayHelper::map($modelsAddress, 'vdn', 'vdn')));
        // validate all models
        $valid = $modelCustomer->validate();
        $valid = Model::validateMultiple($modelsAddress) && $valid;
        if ($valid) {
            $transaction = \Yii::$app->db->beginTransaction();
            try {
                if ($flag = $modelCustomer->save(false)) {
                    if (!empty($deletedIDs)) {
                        Vdns::deleteAll(['vdn' => $deletedIDs]);
                    }
                    foreach ($modelsAddress as $modelAddress) {
                        $modelAddress->region_id = $id;
                        if (! ($flag = $modelAddress->save(false))) {
                            $transaction->rollBack();
                            break;
                        }
                    }
                }
                if ($flag) {
                    $transaction->commit();
                    return $this->redirect(['view', 'id' => $id]);
                }
            } catch (Exception $e) {
                $transaction->rollBack();
            }
        }
    }
    return $this->render('update', [
        'model' => $modelCustomer,
        'modelsDiapazons' => (empty($modelsAddress)) ? [new Vdns] : $modelsAddress,
    ]);
}
READ ALSO
Как получить значение из функции и вывести в объект?

Как получить значение из функции и вывести в объект?

Как вывести значение $username & $photos из функции в $dataToBePassed (сейчас выводит null):

258
Создание thumbnail для записи

Создание thumbnail для записи

Подскажите, допустим с помощью парсера получаю url картинки на сайте, с которого нужно скопировать картинкиИ нужно создать thumbnail для определённой...

226
Denwer и mkdir() функция

Denwer и mkdir() функция

На локальном хостинге использую denwer, пытаюсь создать папку с помощью функции mkdir(), ошибку не выдаёт но и ни чего не создаётМожет в php

287
Подсчёт обращений к php файлу через ajax

Подсчёт обращений к php файлу через ajax

Всем доброго времени сутокподскажите кто может, как можно подсчитать количество обращений к php файлу через ajax ? Имеются 2 страницы - 01

239