В бд есть таблица contactform с полями name,email, subject,body,id
Просто в виде через $this->save(); ничего не сохраняет. Попробовал написать метод saveContactform в контроллере и вызвать его в виде - но, возможно, где-то ошибка.
Кроме того, пользователь помимо данных вводит еще и капчу. Чтобы код капчи проверялся, он должен быть свойством класса модели, при том, публичным свойством, иначе каждый раз введенный код будет не верным. И получается, что при сохранении модели в базу ложится и код капчи, а он там нафиг не нужен.
Сейчас после заполнения формы письмо отправляется, но ничего не сохраняется и перенаправляет на 404 стр.
В дебаге routing 'index/contact'
method 'POST'
$_GET
Empty.
$_POST
_csrf - хеш
Contactform
[
'name' => 'Fel'
'email' => 'justfalk@mail.ru'
'subject' => 'ggg'
'body' => 'ggj'
'verifyCode' => 'tkjatuk'
]
contact-button ''
$_FILES
Empty.
$_COOKIE - хеш
В логах
yii\web\HttpException:404
spoileryii\base\InvalidRouteException: Unable to resolve the request: index/saveContactform in D:\sites\yii2.loc\vendor\yiisoft\yii2\base\Controller.php:128
Stack trace:
#0 D:\sites\yii2.loc\vendor\yiisoft\yii2\base\Module.php(528): yii\base\Controller->runAction('saveContactform', Array)
#1 D:\sites\yii2.loc\models\Contactform.php(108): yii\base\Module->runAction('index/saveConta...')
#2 D:\sites\yii2.loc\controllers\IndexController.php(37): app\models\Contactform->contact('adminmail@mail....')
#3 [internal function]: app\controllers\IndexController->actionContact()
#4 D:\sites\yii2.loc\vendor\yiisoft\yii2\base\InlineAction.php(57): call_user_func_array(Array, Array)
#5 D:\sites\yii2.loc\vendor\yiisoft\yii2\base\Controller.php(157): yii\base\InlineAction->runWithParams(Array)
#6 D:\sites\yii2.loc\vendor\yiisoft\yii2\base\Module.php(528): yii\base\Controller->runAction('contact', Array)
#7 D:\sites\yii2.loc\vendor\yiisoft\yii2\web\Application.php(103): yii\base\Module->runAction('index/contact', Array)
#8 D:\sites\yii2.loc\vendor\yiisoft\yii2\base\Application.php(386): yii\web\Application->handleRequest(Object(yii\web\Request))
#9 D:\sites\yii2.loc\web\index.php(12): yii\base\Application->run()
#10 {main}
Next yii\web\NotFoundHttpException: Страница не найдена. in D:\sites\yii2.loc\vendor\yiisoft\yii2\web\Application.php:115
Stack trace:
#0 D:\sites\yii2.loc\vendor\yiisoft\yii2\base\Application.php(386): yii\web\Application->handleRequest(Object(yii\web\Request))
#1 D:\sites\yii2.loc\web\index.php(12): yii\base\Application->run()
#2 {main}
Contactform (model)
spoiler<?php
namespace app\models;
use Yii;
use yii\db\ActiveRecord;
use yii\db\Expression;
/**
* This is the model class for table "contactform".
*
* @property string $id
* @property string $name
* @property string $email
* @property integer $subject
* @property double $body
* @property string $verifyCode
*/
class Contactform extends ActiveRecord
{
public $name;
public $email;
public $subject;
public $body;
public $verifyCode;
public static function tableName()
{
return 'contactform';
}
/**
* @return array the validation rules.
*/
public function rules()
{
return [
/* Поля обязательные для заполнения */
[ ['name', 'email', 'subject', 'body'], 'required'],
/* Поле электронной почты */
['email', 'email'],
/* Капча */
['verifyCode', 'captcha', 'captchaAction'=>'index/captcha'],
/* ['verifyCode', 'captcha','captchaAction'=>'/contactus/default/captcha'],*/
];
}
/**
* @return array customized attribute labels
*/
public function attributeLabels()
{
return [
'verifyCode' => 'Подтвердите код',
'name' => 'Имя',
'email' => 'Электронный адрес',
'subject' => 'Тема',
'body' => 'Сообщение',
];
}
/**
* Sends an email to the specified email address using the information collected by this model.
* @param string $email the target email address
* @return boolean whether the model passes validation
*/
public function contact($emailto)
{
if ($this->validate()) {
Yii::$app->mailer->compose()
->setFrom(Yii::$app->params['adminEmail']) /* от кого */
->setTo([$this->email => $this->name,'adminmail@mail.ru' => 'yii2.loc'])
->setSubject('Админ') /* имя отправителя */
->setTextBody('Добрый день! Ваше сообщение принято!')->setCharset('UTF-8') /* текст сообщения */
->send(); /* функция отправки письма */
/*Cохранить данные */
Yii::$app->runAction('index/saveContactform');
$this->saveContactForm()
save();
return true;
} else {
return false;
}
}
}
IndexController
spoiler<?php
namespace app\controllers;
use Yii;
use yii\App\Controller;
use app\models\ContactForm;
use yii\web\Request;
class IndexController extends AppController
{
public function actions()
{
return [
'captcha' => [
'class' => 'yii\captcha\CaptchaAction',
'fixedVerifyCode' => YII_ENV_TEST ? 'testme' : null,
]
];
}
public function actionContact()
{
// $this->layout = 'contact';
$this->layout = false;
/* Создаем экземпляр класса */
$model = new ContactForm();
/* получаем данные из формы и запускаем функцию отправки contact, если все хорошо, выводим сообщение об удачной отправке сообщения на почту */
if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['adminEmail'])) {
Yii::$app->session->setFlash('contactFormSubmitted');
return $this->refresh();
/* иначе выводим форму обратной связи */
} else {
return $this->render('contact', [
'model' => $model,
]);
/* return $this->render('contact', compact('contact'));*/
}
}
protected function saveContactform(){
//создаем объект модели
$contactform = new contactform();
$contactform->name =$id['name'];
$customer->email = $id['email'];
$customer->subject = $id['subject'];
$customer->body =$id ['body'];
$customer->save();
}
}
Contact (view)
spoiler<?php
use yii\helpers\Html;
use yii\bootstrap\ActiveForm;
use yii\captcha\Captcha;
/* @var $this yii\web\View */
/* @var $form yii\bootstrap\ActiveForm */
/* @var $model app\models\ContactForm */
$this->title = 'Контакты';
?>
<article class="col-xs-12 col-lg-6">
<div class="row margin-null">
<!-- Заголовок -->
<h1><?= Html::encode($this->title) ?></h1>
<!-- Условие отправления формы, если она отправлена выводим сообщение -->
<?php if (Yii::$app->session->hasFlash('contactFormSubmitted')): ?>
<div class="alert alert-success">
Спасибо за обращение к нам. Мы постараемся ответить вам как можно скорее.
</div>
<!-- иначе выводим форму -->
<?php else: ?>
<?php $form = ActiveForm::begin([
'id' => 'contact-form', /* Идентификатор формы */
'options' => ['class' => 'form-horizontal'], /* класс формы */
'fieldConfig' => [ /* классы полей формы */
'template' => "<div class=\"col-lg-3\">{label}</div>\n<div class=\"col-lg-9\">{input}</div>\n<div class=\"col-lg-12 col-lg-offset-3 \">{error}</div>"
],
]); ?>
<!-- Поля формы и капча -->
<?= $form->field($model, 'name') ?>
<?= $form->field($model, 'email') ?>
<?= $form->field($model, 'subject') ?>
<?= $form->field($model, 'body')->textArea(['rows' => 6]) ?>
<?=$form->field($model, 'verifyCode')->widget(Captcha::className(), [
'captchaAction' => '/index/captcha',
'template' => '<div class="row"><div class="col-lg-4">{image}</div><div class="col-lg-7">{input}</div></div>',
])?>
<!-- Кнопка отправки формы-->
<div class="form-group">
<?= Html::submitButton('Отправить сообщение', ['class' => 'btn btn-default waves-effect btn-color-orange btn-color-orange-long', 'name' => 'contact-button']) ?>
</div>
<?php ActiveForm::end(); ?>
<?php endif; ?>
</div>
</article>