неожиданный сабмит формы

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Nobilik
Сообщения: 76
Зарегистрирован: 2014.11.28, 09:19

неожиданный сабмит формы

Сообщение Nobilik »

Доброго дня!

Есть форма, среди полей формы вставлен div c гридом с фильтрами. После ввода любого значения в фильтр, по нажатию enter, либо по выходу из фокуса, поиска не происходит, а происходит сабмит всей формы. Это происходит независимо от того, обернут ли грид в pjax, или нет. Хотелось бы понять, почему это происходит и как с этим бороться.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: неожиданный сабмит формы

Сообщение astronin »

код
Nobilik
Сообщения: 76
Зарегистрирован: 2014.11.28, 09:19

Re: неожиданный сабмит формы

Сообщение Nobilik »

код формы

Код: Выделить всё

    <?php $form = ActiveForm::begin(); ?>
     <?= $form->field($model, 'name')->textInput(['maxlength' => 45]) ?>
     ....
     <div class="col-sm-1">
                <?= Html::button('<span class="glyphicon glyphicon-list"></span>',['id' => 'showDescrGridBtn',
                    'data-value'=> Yii::$app->getUrlManager()->createUrl(['rooms/choosedescr']),
                    'class'=>'btn btn-info descrBtn',
                    'title'=> 'Choose description']);

                $js=new \yii\web\JsExpression("
                $('#showDescrGridBtn').click(function(){
                    $('#descrView').show();
                    $.ajax({
                        type: 'POST',
                        url: $(this).data('value'),
                        success: function(html){
                            $('#descrView').html(html);
                        }
                    });
                });
                ");   
                <div class="col-sm-12" style="display: none" id="descrView"></div>
                .....
                <div class="form-group">
        <?= Html::submitButton($model->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
    </div>

    <?php ActiveForm::end(); ?>
код грида:

Код: Выделить всё

<?php \yii\widgets\Pjax::begin(['id'=>'descrGrid', 'enablePushState' => false, 'timeout' => 3000]); ?>
<?= GridView::widget([
        'dataProvider' => $dataProvider,
        'filterModel' => $searchModel,

        'columns' => [

            ['class' => 'yii\grid\SerialColumn'],

            //'id',
            [
                'attribute' => 'description',
                'format' => 'html',
            ],
            ['class' => 'yii\grid\ActionColumn',
                'template' => '{choose}',
                'buttons' => [
                    'choose' => function($url, $model, $key){
                            $url = Yii::$app->getUrlManager()->createUrl(['rooms/choosedescr']);
                            return Html::a('<span class="glyphicon glyphicon-ok"></span>', $url, [
                                'title' => Yii::t('yii', 'Choose'),
                                'data-description' => $model->description,
                                'data-id' => $model->id,
                                'class' => 'okbtn',
                                'data-pjax' => '0',
                                'data-value' => $url,
                            ]);
                        }
                ]
            ],
        ],
    ]);

    $js=new \yii\web\JsExpression("
       $('.okbtn').click(function(event){
           event.preventDefault();
           var descr=$(this).data('description');
           var id=$(this).data('id');
           $('#rooms-descriptionid').val(id);
           $('#dynamic-description').html(descr);
           $.ajax({
                type: 'POST',
                url: $(this).data('value'),
                success: function(html){
                    $('#descrView').html(html);
                }
           });
           $('#descrView').hide();
           $('#dynamic-description').show();
        });
    ");
    $this->registerJs($js);
    ?>

    <?php  \yii\widgets\Pjax::end(); ?>
ну и к примеру, апдейт в контроллере:

Код: Выделить всё

 public function actionUpdate($id)
    {
        $model = $this->findModel($id);
        $dataProvider = new ActiveDataProvider(['query' => $model->getPriceplans()]);

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            return $this->redirect(['view', 'id' => $model->id]);
        } else {
            return $this->render('update', [
                'model' => $model,
                'dataProvider' => $dataProvider,
            ]);
        }
    }
Последний раз редактировалось Nobilik 2015.02.24, 16:49, всего редактировалось 1 раз.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: неожиданный сабмит формы

Сообщение astronin »

желательно корректный код, иначе ничего не понятно
вижу
<?php \yii\widgets\Pjax::end(); ?>
а где же начало?
Nobilik
Сообщения: 76
Зарегистрирован: 2014.11.28, 09:19

Re: неожиданный сабмит формы

Сообщение Nobilik »

astronin писал(а):желательно корректный код, иначе ничего не понятно
вижу
<?php \yii\widgets\Pjax::end(); ?>
а где же начало?
криво скопировал, потерял первую строчку. поправил в предыдущем посте.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: неожиданный сабмит формы

Сообщение astronin »

пропишите для submitButton:
'data-pjax' => '0', или 'data-pjax' => false
возможно pjax захватывает вашу форму
Nobilik
Сообщения: 76
Зарегистрирован: 2014.11.28, 09:19

Re: неожиданный сабмит формы

Сообщение Nobilik »

это я уже пробовал. эффекта нет. да и странно, не должен pjax вне обертки события видеть
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: неожиданный сабмит формы

Сообщение Demon_id »

грид на нету создаёт свою форму для фильтра. а форма в форме никогда ни к чему хорошему не приводила. выносите грид из формы.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: неожиданный сабмит формы

Сообщение astronin »

Nobilik писал(а):это я уже пробовал. эффекта нет. да и странно, не должен pjax вне обертки события видеть
не факт
скорей всего у вас там наслоение селекторов для js и они путаются
попробуйте сделать как посоветовали выше
еще можете разобраться в id форм и других элеметов, и области их видимости
Nobilik
Сообщения: 76
Зарегистрирован: 2014.11.28, 09:19

Re: неожиданный сабмит формы

Сообщение Nobilik »

Попробую. Дурацкий вопрос, не имеющий отношения к Yii2. Как вынести грид из формы, при этом сохранив его позицию на экране?
Аватара пользователя
wokster
Сообщения: 308
Зарегистрирован: 2013.09.06, 14:12
Контактная информация:

Re: неожиданный сабмит формы

Сообщение wokster »

Nobilik писал(а):Попробую. Дурацкий вопрос, не имеющий отношения к Yii2. Как вынести грид из формы, при этом сохранив его позицию на экране?
Много вариантов, зависит от вашего шаблона. Например пустить ниже и сделать отрицательный margin-top или использовать абсолютное позиционирование.
Demon_id
Сообщения: 421
Зарегистрирован: 2011.10.29, 00:13

Re: неожиданный сабмит формы

Сообщение Demon_id »

для начала объясните, как вы используете грид внутри формы?
а вариантов решения вашего вопроса много.
можно форму разделить на две, дополнив каждую недостающими хидденами из остальных. при сабмите заполняя их с помощью жс одну из другой. такой вариант используется в инет магазинах, где одна форма с фильтрами есть сбоку и другая вверху над товарами.

либо же если это к примеру чекбоксы у вас в гриде, то тоже собирайте их с помощью жс, пихайте в хиддены формы и отправляйте её.
Nobilik
Сообщения: 76
Зарегистрирован: 2014.11.28, 09:19

Re: неожиданный сабмит формы

Сообщение Nobilik »

Делаю проект для отеля. Это факультативно, просто для изучения yii2. Тему взял, поскольку сделал то же самое на wp для знакомых.... В данный момент ковыряю бэкэнд, конкретно эта часть - заведение номеров. У номера есть какое-то количество уникальных полей - они хранятся в таблице Rooms, а есть поля, которые повторяются во многих номерах, т.е. например, описание номера, тарифы, которые зависят от календаря, скидки, тарифы на дополнительные кровати. Все вышеперечисленное - это гриды, т.е. при выборе определенного значения из них, в таблицу Rooms при сохранении записывается соответствующий id для связи. При этом грид с описаниями реализован именно как вы говорите - записывает значение в скрытое поле.
Вобщем пошел читать про варианты позиционирования.
Nobilik
Сообщения: 76
Зарегистрирован: 2014.11.28, 09:19

Re: неожиданный сабмит формы

Сообщение Nobilik »

Дошли руки попробовать вынести грид вне формы. Эффект нулевой! Сабмит формы вместо поиска по гриду. Подскажите, чем посмотреть, что происходит. Что-то типа дебага для js.
astronin
Сообщения: 606
Зарегистрирован: 2012.01.30, 17:46

Re: неожиданный сабмит формы

Сообщение astronin »

попробуйте использовать этот компонент
https://github.com/AstRonin/yii2_improv ... s/Pjax.php
укажите вручную $basePoint-ы для каждого pjax, чтоб ограничить его поле действия, может быть поможет
Ответить