Ajax отправка формы с twig/pjax

Обсуждение документации второй версии фреймворка. Переводы Cookbook и авторские рецепты.
Ответить
Dirfak
Сообщения: 25
Зарегистрирован: 2016.08.10, 20:47

Ajax отправка формы с twig/pjax

Сообщение Dirfak »

controller

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

public function actionAbout()
    {
        $this->getView()->title = 'Обо мне | ' . Yii::$app->params['projectName'];
        $model = new ContactForm();
        $this->actionContact($model);
        return $this->render('about.twig', array(
            'model' => $model,
        ));
    }
    public function actionContact($model)
    {
        if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
            Yii::$app->session->setFlash('contactFormSubmitted');

            return $this->refresh();
        }
    } 
about.twig

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

<div class="site-contact">{% if(app.session.hasFlash('contactFormSubmitted')) %}
                    <div class="alert alert-success">Thank you for contacting us. We will respond to you as soon as possible.</div>
                {% else %}
                    {{ use('yii\helpers\Html') }}(39)
                    {{ use('yii\widgets\Pjax') }}
                    {{ use('yii\bootstrap\ActiveForm') }}
                    {{ use('yii\captcha\Captcha') }}
                    {% pjax_begin({'id' : 'contact'}) %}
                        {% set form = active_form_begin({
                            'id' : 'contact-form',
                            'action' : '/contact',
                            'options' : {
                                'class' : 'form-vertical',
                                'data-pjax' : true,
                            },
                        }) %}
                            {{ form.field(model, 'name').textInput({'placeholder' : 'Ваше имя'}).label(false)|raw }}(52)
                            {{ form.field(model, 'email').input('email', {'placeholder' : 'Ваш email'}).label(false)|raw }}
                            {{ form.field(model, 'body').textArea({
                                'rows' : 6,
                                'placeholder' : 'Ваше сообщение',
                            }).label(false)|raw }}
                            {{ form.field(model, 'verifyCode').widget('yii\\captcha\\Captcha', {
                                'template' : '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-4 col-lg-offset-1">{input}</div></div>',
                            }).label(false)|raw }}
                            <div class="form-group">
                                {{ html.submitButton('Отправить', {
                                    'class': 'btn btn-primary',
                                    'name': 'contact-button',
                                }) | raw }}
                            </div>
                        {{ active_form_end() }}
                    {% pjax_end() %}
                {% endif %}
                </div> 
Выдает ошибку:
Unexpected "pjax_begin" tag (expecting closing tag for the "if" tag defined near line 39) in "about.twig" at line 52.
Что я делаю не так?
или pjax в twig нет?
Уже все обыскал, но так толком ответа и не нашел.
P.S. Хотел сделать ajax отправку формы обратной связи. Может кто посоветовать решение данной проблемы или предложить другой способ ajax отправки формы?
P.S.S. И вообще в контроллере я правильно все сделал?
Dirfak
Сообщения: 25
Зарегистрирован: 2016.08.10, 20:47

Re: Ajax отправка формы с twig/pjax

Сообщение Dirfak »

Никто эту тему не разбирал или я что-то непонятное написал? а то просмотров 100+, а ответа никакого...
Аватара пользователя
ElisDN
Сообщения: 5845
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Ajax отправка формы с twig/pjax

Сообщение ElisDN »

Dirfak писал(а):Никто эту тему не разбирал или я что-то непонятное написал? а то просмотров 100+, а ответа никакого...
Видимо, что из 100 просмотревших никто не использует Pjax и Twig в Yii.
GAlex
Сообщения: 1
Зарегистрирован: 2016.08.29, 14:35

Re: Ajax отправка формы с twig/pjax

Сообщение GAlex »

Рабочий пример Yii2 + twig + pjax + form.

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

{{ use('yii/widgets/ActiveForm') }}  {# <----  #}
{{ use('yii/widgets/Pjax') }} {# <----  #}

<div class="popup popup-write-message" id="popup-message">
    <div class="popup-header">
        <h3>Message</h3>
        <a href="#" class="close-popup">x</a>
    </div>
    <div class="popup-inner">

        {{  pjax_begin({'id' : 'contact','enablePushState':false})  }}  {# <----  #}
            {% set form = active_form_begin({
                'id': 'message-popup-form',
                'enableAjaxValidation'    : false,
                'enableClientValidation': true,
                'options': {
                    'class': 'msg-popup-form',
                                        'data-pjax' : '',  {# <----  #}
                },

            }) %}

                <div class="form-group">
                    {{ form.field(model, 'text').textarea({'class':'form-control','placeholder':'Message text'}).label(false)  | raw }}
                </div>
                <div class="form-group bottom">
                    <button type="submit" class="btn btn-green">Send</button>
                </div>
            {{ active_form_end() }}
        {{  pjax_end()  }}

    </div>
</div> 
Не забудьте убрать `{# <---- #}` !!
Dirfak
Сообщения: 25
Зарегистрирован: 2016.08.10, 20:47

Re: Ajax отправка формы с twig/pjax

Сообщение Dirfak »

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

{% extends "@app/views/layouts/frontend.twig" %}
{% block fullContent %}
    {{ use('yii\helpers\Html') }}
    {{ use('yii\widgets\ActiveForm') }}
    {{ use('yii\widgets\Pjax') }}
    {{ use('yii\captcha\Captcha') }}
    <div class="row">
        <section class="contact col-lg-12">
            <h1>Связаться со мной</h1>
            <div class="site-contact">
                {% pjax_begin({
                    'id' : 'contact',
                    'enablePushState':false
                }) %}
                    {% set form = active_form_begin({
                        'id' : 'contact-form',
                        'action' : '/frontend/contact/',
                        'enableAjaxValidation' : false,
                        'enableClientValidation' : true,
                        'options' : {
                            'class' : 'form-vertical',
                            'data-pjax' : '',
                        },
                    }) %}
                        {{ form.field(model, 'name').textInput({'placeholder' : 'Ваше имя'}).label(false)|raw }}
                        {{ form.field(model, 'email').input('email', {'placeholder' : 'Ваш email'}).label(false)|raw }}
                        {{ form.field(model, 'body').textArea({
                            'rows' : 6,
                            'placeholder' : 'Ваше сообщение',
                        }).label(false)|raw }}
                        {{ form.field(model, 'verifyCode').widget('yii\\captcha\\Captcha', {
                            'template' : '<div class="row"><div class="col-lg-3">{image}</div><div class="col-lg-4 col-lg-offset-1">{input}</div></div>',
                        }).label(false)|raw }}
                        <div class="form-group">
                            {{ html.submitButton('Отправить', {
                                'class': 'btn btn-primary',
                                'name': 'contact-button',
                            }) | raw }}
                        </div>
                    {{ active_form_end() }}
                {% pjax_end() %}
            </div>
        </section>
    </div>
{% endblock %} 
вот мой файлик,
сделал по вашему примеру.
Вылетает ошибка
Unexpected "pjax_begin" tag (expecting closing tag for the "block" tag defined near line 3) in "about.twig" at line 11.
А если pjax пишу с {{ то следующая ошибка вылезает
An exception has been thrown during the rendering of a template ("call_user_func_array() expects parameter 1 to be a valid callback, class 'Pjax' not found") in "about.twig" at line 11.
Ответить