Где, каким образом получить результат ответа на запрос в Yii2 и отправить его на емэйл?
Где, каким образом получить результат ответа на запрос, отправляемый таинственными алгоритмами Yii2 после нажатия на кнопку страницы, код которой ниже, и отправить этот результат на емэйл, который укажу при отправке?
документацию смотрю, но зацепку найти пока не удается. Или поясните хотя бы почему вардамп пустой. Текст документации говорит о том, что искомое должно быть тут: Yii::$app->response->content. Однако там его нет.
Страницу формы views/contact/index.php дополнил (есть небольшой дубляж по элементам - это себе для обучения):
<?php
use yii\helpers\Html;
use yii\grid\GridView;
use yii\bootstrap4\ActiveForm;
/* @var $this yii\web\View */
/* @var $searchModel app\models\ContactSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
$this->title = 'Контакты';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="contact-index">
<h1><?= Html::encode($this->title) ?></h1>
<p>
<?= Html::a('Добавить контакт', ['create'], ['class' => 'btn btn-success']) ?>
</p>
<?php $LetterInsertion = GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'emptyText' => 'По указанным параметрам сотрудник не найден.',
'columns' => [
['class' => 'yii\grid\SerialColumn'],
// 'contact_id',
'last_name',
'first_name',
'middle_name',
'internal_phone',
'mobile_phone',
'email_address:email',
// ['class' => 'app\components\MyActionColumn',
// 'template' => '{view} {update} {delete}',
// ],
],
]);
$session = Yii::$app->session;
$session['LetterInsertion'] = $LetterInsertion;
?>
<?php $form = ActiveForm::begin(['id' => 'contact-search']); ?>
<?= $LetterInsertion ?>
<?= Html::submitButton('Найти', ['class' => 'btn btn-primary']) ?>
<?= Html::a('Отменить фильтр', ['index'], ['class' => 'btn btn-outline-primary']); ?>
<?= Html::resetButton('Сбросить', ['class' => 'btn btn-outline-secondary', 'onclick' => 'window.location.replace("index.php?r=contact");']) ?>
</p>
<?php if (Yii::$app->session->hasFlash('contactFormSubmitted')): ?>
<div class="alert alert-success">
Сообщение 1 (файл views/contact/index.php)
</div>
<p>
<?php if (Yii::$app->mailer->useFileTransport): ?>
Сообщение 2 (файл views/contact/index.php)
<code><?= Yii::getAlias(Yii::$app->mailer->fileTransportPath) ?></code>.
<code>useFileTransport</code> property of the <code>mail</code>
<?php endif; ?>
</p>
<?php else: ?>
<p>Сообщение 3 (файл views/contact/index.php)</p>
<div class="row">
<div class="col-lg-5">
<?= $form->field($searchModel, 'email_address')->textInput(['maxlength' => true, 'class' => 'form-control inputNotNull'])->label('Введите Email получателя: ');
?>
<div class="form-group">
<?= Html::submitButton('Отправить контакты', ['class' => 'btn btn-primary', 'name' => 'send-to-email-button']) ?>
<?= Html::a('Отправить контакты', ['contact'], ['class' => 'btn btn-outline-primary']); ?>
</div>
</div>
</div>
<p>
<?= Html::label('отправить контакты на') ?>
<?= Html::input('text', 'send_to', 'email адресата') ?>
<?= Html::submitButton('отправить', ['class' => 'btn btn-primary']) ?>
</p>
<?php ActiveForm::end(); ?>
</div>
<?php endif ?>
var_dump(Yii::$app->response->content) при выдаче искомых позиций в количестве нескольких штук получается такой:
/var/www/eg/phbook_basic/views/contact/index.php:53:null
Ответы (2 шт):
У вас есть контроллер с каким-то action.
public function actionSendData()
{
// Получаете данные из базы или еще откуда то (dataProvider etc.)
$data = DbModel::findAll();
// $htmlTemplate - темплейт вашего письма. Работает так же как при рендере страницы обычной.
$mail = \Yii::$app->mailer->compose(['html' => $htmlTemplate], ['data' => $data]);
$mail->send();
}
Скажу сразу - не совсем понимаю какие данные вы хотите отправлять. Поэтому просто описал как получение данных. Если это данные из dataProvider то вот дока по нему Дата провайдер.
Дока по использованию мейлера в Yii2 - Тут.
И как по мне у Yii2 довольно понятная документация поэтому прочитайте еще раз. Там расписан процесс как работает MVC в фреймворке. Тык
В Вашем примере вообще не вижу работы с формой. Не понимаю с чего Вам вообще что-то должно приходить в таком случае. Возможно, я чего-то не знаю конечно. Но лично я бы сделал примерно так - создал модель формы. В ней описал поле в которое будет приходить нужный контент. Там же можно описать все необходимые проверки и отправку на email.
<?php
namespace app\models\forms;
class myForm extends Model {
public $content;
public function rules()
{
return [
[['content'], 'safe'],
];
}
public function sendMail() {
//тут отправка на почту
}
}
Далее в view-файле делаете отображение формы
<?php
use yii\helpers\Html;
use yii\grid\GridView;
/* @var $this yii\web\View */
/* @var $model app\models\forms\myForm */
/* @var $searchModel app\models\ContactSearch */
/* @var $dataProvider yii\data\ActiveDataProvider */
use yii\bootstrap\ActiveForm;
$this->title = 'Контакты';
$this->params['breadcrumbs'][] = $this->title;
$form = ActiveForm::begin();
?>
<div class="contact-index">
<h1><?= Html::encode($this->title) ?></h1>
<p>
<?= Html::a('Добавить контакт', ['create'], ['class' => 'btn btn-success']) ?>
</p>
<!-- Тут можно поместить контент внутрь поля myForm->content двумя способами -->
<!-- Самому создать `div` с `id` и `name` таким же как формирует `Yii2::ActiveForm` при выводе `$form->field` (в теории должно сработать, но не проверял) -->
<!-- Либо создать `hidden` поле через `$form->field` и туда с помощью `javascript` по событию `formSubmit` передать содержимое страницы которое должно быть отправлено -->
<div id="myform-content" name="myForm[content]">
<?= GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'emptyText' => 'По указанным параметрам сотрудник не найден.',
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'last_name',
'first_name',
'middle_name',
'internal_phone',
'mobile_phone',
'email_address:email',
['class' => 'yii\grid\ActionColumn'],
],
]); ?>
<p>
<?= Html::submitButton('Найти', ['class' => 'btn btn-primary']) ?>
<?= Html::resetButton('Сбросить', ['class' => 'btn btn-outline-secondary', 'onclick' => 'window.location.replace("index.php?r=contact");']) ?>
</p>
</div>
</div>
<?php
ActiveForm::end();
?>
В контроллере же в методе куда ведет action формы (пусть будет my/create) сделал бы следующее
<?php
namespace app\controllers;
use yii\web\Controller;
class myController extends Controller {
public function actionCreate() {
$model = new myForm();
if (\Yii::$app->request->isPost && count(\Yii::$app->request->post()) > 0 && $model->load(\Yii::$app->request->post()) ) {
//Отправляем почту
$myForm->sendMail()
//Выводим отдельную страницу или куда-то перенаправляем
}
}
}