Страница 1 из 3

Форма обратной связи

Добавлено: 2017.04.12, 21:11
Artikk
Контроллер:

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

public function actionView($id)
	{
		$girls = Girls::findOne($id);
		if(empty($girls)){
			throw new \yii\web\HttpException(404, 'Такой девушки нет.');
		}
		$date1 = date("M j, Y");

		/* Создаем экземпляр класса */
		$model = new ContactForm();
		if ($model->load(Yii::$app->request->post()) && $model->contact(Yii::$app->params['emailto'])) {
			Yii::$app->session->setFlash('contactFormSubmitted');
			return $this->refresh();

		}

		$this->setMeta( $girls->title, $girls->keywords, $girls->description);
		return $this->render('view', compact('girls', 'date1', 'model'));

	}
модель:

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

<?php
/* Объявляем пространство имен */
namespace app\models;

use Yii;
use yii\base\Model;

/* Объявляем класс формы */
class ContactForm extends Model
{
    /* Объявление переменных */
    public $name, $email, $subject, $body;

    /* Правила для полей формы обратной связи (валидация) */
    public function rules()
    {
        return [
            /* Поля обязательные для заполнения */
            [ ['name', 'email', 'subject', 'body'], 'required'],
            /* Поле электронной почты */
            ['email', 'email'],
        ];
    }

    /* Определяем названия полей */
    public function attributeLabels()
    {
        return [
            'name' => 'Имя',
            'email' => 'Электронный адрес',
            'subject' => 'Тема',
            'body' => 'Сообщение',
        ];
    }

    /* функция отправки письма на почту */
    public function contact($emailto)
    {
        /* Проверяем форму на валидацию */
        if ($this->validate()) {
            Yii::$app->mailer->compose()
                ->setFrom([$this->email => $this->name]) /* от кого */
                ->setTo($emailto) /* куда */
                ->setSubject($this->subject) /* имя отправителя */
                ->setTextBody($this->body) /* текст сообщения */
                ->send(); /* функция отправки письма */

            return true;
        } else {
            return false;
        }
    }
}
Вид:

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

<?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]) ?>
					<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; ?>
отправляю сообщение, пишет сообщение отправлено, но на почте ничего нет. в чем может быть ошибка?

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:13
Artikk
http://www.webapplex.ru/forma-obratnoj- ... na-yii-2.x по этому уроку делал

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:16
Haku
Проверьте в конфигурации вашего приложения свойство:

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

'mailer' => [
	'useFileTransport' => true,
],
оно должно быть определено как false.

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:20
Artikk
да, исправил, теперь:
Cannot send message without a recipient

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:23
Artikk
я в console.php добавил:

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

<?php

$params = require(__DIR__ . '/params.php');
$db = require(__DIR__ . '/db.php');

$config = [
    'id' => 'basic-console',
    'basePath' => dirname(__DIR__),
    'bootstrap' => ['log'],
    'controllerNamespace' => 'app\commands',
    'components' => [
        'mailer' => [
            'class' => 'yii\swiftmailer\Mailer'
        ],
        'cache' => [
            'class' => 'yii\caching\FileCache',
        ],
        'log' => [
            'targets' => [
                [
                    'class' => 'yii\log\FileTarget',
                    'levels' => ['error', 'warning'],
                ],
            ],
        ],
        'db' => $db,
    ],
    'params' => $params,
    /*
    'controllerMap' => [
        'fixture' => [ // Fixture generation command line.
            'class' => 'yii\faker\FixtureController',
        ],
    ],
    */
];

if (YII_ENV_DEV) {
    // configuration adjustments for 'dev' environment
    $config['bootstrap'][] = 'gii';
    $config['modules']['gii'] = [
        'class' => 'yii\gii\Module',
    ];
}

return $config;
в уроке:

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

Четвертый шаг. В папке config в файле config.php и пишем следующий код.

$params = require(__DIR__ . '/params.php');
//.....
'components' => [
    'mailer' => [
            'class' => 'yii\swiftmailer\Mailer'
            ]
]
//.....
'params => $params,
//....
но у меня нет такого файла

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:29
Haku
Не могу сказать точно по поводу config.php, но возможно у вас отсутствует параметр "Yii::$app->params['emailto']", т.к. в ошибочном сообщении говорится об отсутствии получателя.

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:34
Artikk
ошибка: http://c2n.me/3JsNhpn

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:35
Artikk
Не могу сказать точно по поводу config.php, но возможно у вас отсутствует параметр "Yii::$app->params['emailto']", т.к. в ошибочном сообщении говорится об отсутствии получателя.
как исправить?

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:36
Artikk
мой params.php:

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

<?php

return [
    'adminEmail' => 'моЯпочта@yandex.ua',
];


Re: Форма обратной связи

Добавлено: 2017.04.12, 21:41
Artikk
исправил на

<?php

return [
'emailto' => 'почта.ru@yandex.ua',
];

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:42
Artikk
ошибка пропала, как изменила, но сообщение все равно не приходит

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:50
caHek2x
Artikk писал(а): 2017.04.12, 21:23 я в console.php добавил:

в уроке:
Четвертый шаг. В папке config в файле config.php и пишем следующий код.

но у меня нет такого файла
ну что значит нет ... console.php это конфиг для исполнения консольных команд ...
может web.php ...
посмотрите в вашем index.php будет строка типа такой:

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

$config = require(__DIR__ . '/../config/web.php');

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:54
Haku
caHek2x писал(а): 2017.04.12, 21:50 ну что значит нет ... console.php это конфиг для исполнения консольных команд ...
Там говорилось про файл config.php.
Artikk писал(а): 2017.04.12, 21:42 ошибка пропала, как изменила, но сообщение все равно не приходит
Посмотрите в этой теме. А вообще нужно смотреть, что в логах.

Re: Форма обратной связи

Добавлено: 2017.04.12, 21:56
Artikk
да, в индексе есть в web.php:

'mailer' => [
'class' => 'yii\swiftmailer\Mailer',
// send all mails to a file by default. You have to set
// 'useFileTransport' to false and configure a transport
// for the mailer to send real emails.
'useFileTransport' => false,
],


это стоит

Re: Форма обратной связи

Добавлено: 2017.04.12, 22:14
Artikk
есть предложения?

Re: Форма обратной связи

Добавлено: 2017.04.12, 23:21
urichalex
Проверьте, вообще отправляется ли почта через mail()

Re: Форма обратной связи

Добавлено: 2017.04.13, 08:02
Artikk
urichalex писал(а): 2017.04.12, 23:21 Проверьте, вообще отправляется ли почта через mail()
можете рассказать, как это сделать? первый раз с почтой в yii2 работаю

Re: Форма обратной связи

Добавлено: 2017.04.13, 09:14
someweb
Донастройте mailer

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

    'mailer' => [
        'class' => 'yii\swiftmailer\Mailer',
        'transport' => [
            'class' => 'Swift_SmtpTransport',
            'host' => 'localhost',
            'username' => 'username',
            'password' => 'password',
            'port' => '587',
            'encryption' => 'tls',
        ],
    ],
Только host не localhost, а smtp хост почтового сервера.
http://www.yiiframework.com/doc-2.0/yii ... ailer.html

Re: Форма обратной связи

Добавлено: 2017.04.13, 09:17
Artikk
т.к. изменить это:

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

'mailer' => [
            'class' => 'yii\swiftmailer\Mailer',
            // send all mails to a file by default. You have to set
            // 'useFileTransport' to false and configure a transport
            // for the mailer to send real emails.
            'useFileTransport' => false,
        ],
на ваш код и все?

Re: Форма обратной связи

Добавлено: 2017.04.13, 09:21
someweb
https://yandex.ru/support/mail-new/mail-clients.html

Исходящая почта
адрес почтового сервера — smtp.yandex.ru;
защита соединения — SSL;
порт — 465.