PJAX ActiveForm

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
max0nYii
Сообщения: 18
Зарегистрирован: 2017.02.12, 20:27

PJAX ActiveForm

Сообщение max0nYii »

Привет. Столкнулся с проблемой фоновой отправкой формы.
в виде у меня 2 формы рядом:

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

<section class="sale">
    <?php Pjax::begin(); ?>
        <?php $form = ActiveForm::begin([
            'options' => ['data' => ['pjax' => true]],
        ]); ?>
            <label>Скидка до 70% <i>при заполнении ТЗ</i></label>
            <?= $form->field($model, 'email')->textInput(['placeholder' => "ваша@почта.ru"])->label(false); ?>
            <?= $form->field($model, 'request')->hiddenInput(['value'=> '70% discount'])->label(false); ?>

            <?= Html::submitButton('Получить ТЗ на почту', ['class' => 'mybtn']) ?>
        <?php ActiveForm::end(); ?>
    <?php Pjax::end(); ?>
</section>
<section class="contact">
    <?php Pjax::begin(); ?>
        <?php $form = ActiveForm::begin([
            'options' => ['data' => ['pjax' => true]],
        ]); ?>
            <div class="wrapper">
                <h3>Расчитать цену Вашего проекта:</h3>
                <?= $form->field($model, 'name')->textInput(['placeholder' => "Иван Иванович"]) ?>
                <?= $form->field($model, 'phone')->textInput(['placeholder' => "+7 (123) 456-78-90"]) ?>
                <?= $form->field($model, 'email')->textInput(['placeholder' => "ваша@почта.ru"]) ?>
                <?= $form->field($model, 'comment')->textarea(['rows' => '6', 'placeholder' => "Любое описание если необходимо"]) ?>
                <?= $form->field($model, 'request')->hiddenInput(['value'=> 'contact'])->label(false); ?>

                <?= Html::submitButton('Отправить', ['class' => 'mybtn']) ?>
            </div>
        <?php ActiveForm::end(); ?>
    <?php Pjax::end(); ?>
</section>
модель использую одну и туже.
По отдельности, если вставлять на страницу. Каждая форма работает корректно.
Но при добавлении их обеих (как в примере выше).... корректно работает только 2я форма.

1я же, перезагружает страницу и отображает возвращаемый контент, который должен был вернуться через AJAX.

на стороне контроллера, всё ОК. при определении какая форма отправлялась.
как настроить корректную работу PJAX для обеих форм? (желательно без создания дополнительных моделей, т.к. таблицу использую одну)
Есть идеи?
sosnovskiy
Сообщения: 239
Зарегистрирован: 2017.03.28, 20:03

Re: PJAX ActiveForm

Сообщение sosnovskiy »

Дайте каждой форме свой id и каждому pjax укажите formSelector.

В названии опции могу ошибаться. Под рукой нет кода.
max0nYii
Сообщения: 18
Зарегистрирован: 2017.02.12, 20:27

Re: PJAX ActiveForm

Сообщение max0nYii »

проверил так:

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

<section class="sale">
    <?php Pjax::begin(['id'=>'ajaxDiscount', 'formSelector'=>'#discount-form']); ?>
        <?php $form = ActiveForm::begin([
            'id' => 'discount-form',
            'options' => ['data' => ['pjax' => true]],
        ]); ?>
            <label>Скидка до 70% <i>при заполнении ТЗ</i></label>
            <?= $form->field($model, 'email')->textInput(['placeholder' => "ваша@почта.ru"])->label(false); ?>
            <?= $form->field($model, 'request')->hiddenInput(['value'=> '70% discount'])->label(false); ?>

            <?= Html::submitButton('Получить ТЗ на почту', ['class' => 'mybtn']) ?>
        <?php ActiveForm::end(); ?>
    <?php Pjax::end(); ?>
</section>
<section class="contact">
    <?php Pjax::begin(['id'=>'ajaxSale', 'formSelector'=>'#sale-form']); ?>
        <?php $form = ActiveForm::begin([
            'id' => 'sale-form',
            'options' => ['data' => ['pjax' => true]],
        ]); ?>
            <div class="wrapper">
                <h3>Расчитать цену Вашего проекта:</h3>
                <?= $form->field($model, 'name')->textInput(['placeholder' => "Иван Иванович"]) ?>
                <?= $form->field($model, 'phone')->textInput(['placeholder' => "+7 (123) 456-78-90"]) ?>
                <?= $form->field($model, 'email')->textInput(['placeholder' => "ваша@почта.ru"]) ?>
                <?= $form->field($model, 'comment')->textarea(['rows' => '6', 'placeholder' => "Любое описание если необходимо"]) ?>
                <?= $form->field($model, 'request')->hiddenInput(['value'=> 'contact'])->label(false); ?>

                <?= Html::submitButton('Отправить', ['class' => 'mybtn']) ?>
            </div>
        <?php ActiveForm::end(); ?>
    <?php Pjax::end(); ?>
</section>
не работает
max0nYii
Сообщения: 18
Зарегистрирован: 2017.02.12, 20:27

Re: PJAX ActiveForm

Сообщение max0nYii »

небольшое добавление....

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

<section class="sale">
    <?php Pjax::begin(); ?>
        <?php $form = ActiveForm::begin(['options' => ['data' => ['pjax' => true]],]); ?>
            <label>Скидка до 70% <i>при заполнении ТЗ</i></label>
            <?= $form->field($model, 'email')->textInput(['placeholder' => "ваша@почта.ru"])->label(false); ?>
            <?= $form->field($model, 'request')->hiddenInput(['value'=> '70% discount'])->label(false); ?>

            <?= Html::submitButton('Получить ТЗ на почту', ['class' => 'mybtn']) ?>
        <?php ActiveForm::end(); ?>
        <?php $form = ActiveForm::begin(['options' => ['data' => ['pjax' => true]],]); ?>
            <div class="wrapper">
                <h3>Расчитать цену Вашего проекта:</h3>
                <?= $form->field($model, 'name')->textInput(['placeholder' => "Иван Иванович"]) ?>
                <?= $form->field($model, 'phone')->textInput(['placeholder' => "+7 (123) 456-78-90"]) ?>
                <?= $form->field($model, 'email')->textInput(['placeholder' => "ваша@почта.ru"]) ?>
                <?= $form->field($model, 'comment')->textarea(['rows' => '6', 'placeholder' => "Любое описание если необходимо"]) ?>
                <?= $form->field($model, 'request')->hiddenInput(['value'=> 'contact'])->label(false); ?>

                <?= Html::submitButton('Отправить', ['class' => 'mybtn']) ?>
            </div>
        <?php ActiveForm::end(); ?>
    <?php Pjax::end(); ?>
</section>
если обе формы вставить в 1 pjax блок... то они обе будут работать... только проблема в том, что они заменяю контент обеих форм, при отправки... а мне надо чтоб заменялся только у той, которую отправили....
Аватара пользователя
Sereja3578
Сообщения: 204
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Re: PJAX ActiveForm

Сообщение Sereja3578 »

Покажите контроллер. И у вас случайно у email и rrequest не одинаковые id генерируются?
Аватара пользователя
Sereja3578
Сообщения: 204
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Re: PJAX ActiveForm

Сообщение Sereja3578 »

Вообще, мой вам совет. Когда дебажите такие вещи, просто упрощайте их до минимума. Удалите все поля, кроме двух, разных. Например в одной форме телефон в другой почту оставьте. Далее в контроллере, удалите всю лишнюю обработку. Просто сотрите, что будет приходить при отправке одной формы и другой. Потом в браузере посмотрите во вкладке network, xhr, что происходит. Те ли данные отправляются, не вылезает ли ошибок.
max0nYii
Сообщения: 18
Зарегистрирован: 2017.02.12, 20:27

Re: PJAX ActiveForm

Сообщение max0nYii »

Контроллер:

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

use Yii;
use yii\web\Controller;
use app\modules\studio\models\Leads;
use yii\helpers\Url;

class DefaultController extends Controller
{
    public function actionIndex()
    {
        $model = new Leads();

        if ($model->load(Yii::$app->request->post()) && $model->save()) {
            $post = Yii::$app->request->post('Leads');
            if( $post['request'] == '70% discount' ){
                return '<p>Отправлено</p>';

            }elseif ( $post['request'] == 'contact' ) {
                return '<h3 class="complete">Спасибо! Скоро мы с Вами свяжемся.</h3>';
            }
        } else {
            return $this->render('index', [
                'model' => $model,
            ]);
        }

    }
}
вид чуть упростил:

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

<section class="sale">
    <?php Pjax::begin(); ?>
        <?php $form = ActiveForm::begin(['options' => ['data' => ['pjax' => true]],]); ?>
            <?= $form->field($model, 'email')->textInput(['placeholder' => "ваша@почта.ru"])->label(false); ?>
            <?= $form->field($model, 'request')->hiddenInput(['value'=> '70% discount'])->label(false); ?>
            <?= Html::submitButton('Получить ТЗ на почту', ['class' => 'mybtn']) ?>
        <?php ActiveForm::end(); ?>
    <?php Pjax::end(); ?>
</section>
<section class="contact">
    <?php Pjax::begin(); ?>
        <?php $form = ActiveForm::begin(['options' => ['data' => ['pjax' => true]],]); ?>
            <?= $form->field($model, 'phone')->textInput(['placeholder' => "+7 (123) 456-78-90"]) ?>
            <?= $form->field($model, 'request')->hiddenInput(['value'=> 'contact'])->label(false); ?>
            <?= Html::submitButton('Отправить', ['class' => 'mybtn']) ?>
        <?php ActiveForm::end(); ?>
    <?php Pjax::end(); ?>
</section>
у email и request разные ID, но если сравнивать в обеих формах, то. ID у email'ов одинаковые, и у request'ов тоже

Я не очень разбираюсь в network, xhr....
полазил... при отправке формы, не видел изменений в подгрузке... но текст принимал.... 1я форма, в xhr отображала только принимающий контент... без шаблона сайта....
pavlm
Сообщения: 84
Зарегистрирован: 2013.09.02, 16:33

Re: PJAX ActiveForm

Сообщение pavlm »

для pjax можно попробовать параметр ['timeout' => 0]
max0nYii
Сообщения: 18
Зарегистрирован: 2017.02.12, 20:27

Re: PJAX ActiveForm

Сообщение max0nYii »

непомогает
pavlm
Сообщения: 84
Зарегистрирован: 2013.09.02, 16:33

Re: PJAX ActiveForm

Сообщение pavlm »

У вас когда не срабалтывает валидация формы возвращается пустой ответ, pjax-у это не нравится и он перезагружает страницу обычным способом.
max0nYii
Сообщения: 18
Зарегистрирован: 2017.02.12, 20:27

Re: PJAX ActiveForm

Сообщение max0nYii »

всмысле не срабатывает??
всё нормально.. и ответ не пустой....

обратился с данным вопросом в официальный форум, к англоязычной аудитории.. вот ответ:
Pjax is not a replacement for ajax and it is not designed to be used as multiple Pjax widgets in one page.
Pjax will update the URL of the page when a part of the page changes, if you have two widgets you have two possible URLs to display in the browser. this conflicts and does not work.
max0nYii
Сообщения: 18
Зарегистрирован: 2017.02.12, 20:27

Re: PJAX ActiveForm

Сообщение max0nYii »

и ещё... это походу не только в PJAX проблема....
валидация формы работает также только на последней....
на первой нет.
если вставить только одну форму в страницу... то валидация будет работать
Аватара пользователя
Sereja3578
Сообщения: 204
Зарегистрирован: 2016.09.21, 11:15
Контактная информация:

Re: PJAX ActiveForm

Сообщение Sereja3578 »

Ну, по факту вы уже нашли почти ответ. Копайте валидацию, почему не работает. Упростите все до минимума, чтобы просто работало, а потом прикручивайте потихоньку функционал. То есть оставьте в контроллере только проверку на load, и смотрите сработает ли условие, все ли данные из формы приходят. Фишка в том, что у вас не проходит валидация, а она не проходит скорее всего из-за того, что не все поля приходят. Если у вас разный список полей используется в формах, а модель одна, то должен быть сценарий разный, чтобы показать, где какие поля надо проверять, а какие пропустить. Если они не safe все. Страница чаще всего перезагружается тогда, когда виджету в ответ не поступают данные, то есть это не значит что данные из post не пришли, а они могут не пройти проверку и не отрендеритсяю Тогда ответ будет пустым.
Ответить