@Skrolea

Как сделать ContactForm в модальном окне?

Добрый день. Хочется сделать контактную форму в модальном окне, ссылка на которую находится в главном меню (т.е. в layout main).
Если брать и в SiteIndex в actionIndex поставить
public function actionIndex() {
            $support = new ContactForm();
   
           if ($support->load(Yii::$app->request->post()) && $support->contact(Yii::$app->params['adminEmail'])) {
            Yii::$app->session->setFlash('contactFormSubmitted');
            
            return $this->refresh();
        }
        return $this->render('index', [
                    'support' => $support
        ]);     
    }

а в main (layout) кладу в модальное окно
<?php $form2 = ActiveForm::begin(['id' => 'contact-form']); ?>

<?= $form2->field($support, 'name')->textInput(['autofocus' => true]) ?>

<?= $form2->field($support, 'email') ?>

<?= $form2->field($support, 'subject') ?>

<?= $form2->field($support, 'body')->textArea(['rows' => 6]) ?> 

<div class="form-group">
<?= Html::submitButton('Submit', ['class' => 'btn btn-primary', 'name' => 'contact-button']) ?>
</div>

<?php ActiveForm::end(); ?>

то получаю ошибку
Call to a member function formName() on a non-object

Это как то надо форму передавать не в actionIndex, а в layout? а как это сделать?
$this->view->params['support'] = $support; не помогает
  • Вопрос задан
  • 181 просмотр
Пригласить эксперта
Ответы на вопрос 2
zetamen
@zetamen
В поисках нового
Переопределите функцию renderContent. А лучше создайте базовый контроллер с реализованным renderContent и от него наследуйтесь.

Что-то типа
<?php

class BaseController extends \yii\web\Controller
{
    private $_support;

    public function beforeAction($action)
    {
        if (!parent::beforeAction($action)) {
            return false;
        }

        $support = new ContactForm();
        $this->_support = $support;
   
        if ($support->load(Yii::$app->request->post()) 
            && $support->contact(Yii::$app->params['adminEmail'])) {
                
            Yii::$app->session->setFlash('contactFormSubmitted');
            return $this->refresh();
        }

        return true;
    }
    
    public function renderContent($content)
    {
        $layoutFile = $this->findLayoutFile($this->getView());
        if ($layoutFile !== false) {
            $layoutParams = [
                'content' => $content,
                'support' => $this->_support
            ];
            return $this->getView()->renderFile($layoutFile, $layoutParams, $this);
        } else {
            return $content;
        }
    }
}
Ответ написан
Комментировать
@matios
Technical Team Lead
Ложить надо в /views/index/index.php
Ибо то, что вы пытаетесь пробросить из контроллера будет видно только в ЕГО шаблоне, который задаете в методе render().

Есть еще вариант, вынести код формы в виджет и подключать где угодно.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы