mailer = $mailer; $this->message_service = $message_service; } public function actionSend($id) { $form = $this->findModel($id); $className = 'DynaForm' . $id; $classPath = '\\common\\modules\\forms\\runtime\\' . $className; /* @var $dynaForm Model */ $dynaForm = new $classPath(); if ($dynaForm->load(Yii::$app->request->post()) && $dynaForm->validate()) { // send message $this->sendMessage($form->data, $form, $dynaForm); if ($form->complete_page_id) { return $this->redirect(['/pages/page/view', 'id' => $form->complete_page_id]); } //return $form->complete_text; return $this->render('view', ['text' => $form->complete_text]); } return $this->redirect(Yii::$app->request->referrer); } private function sendMessage($json_string, Form $form, $dynaForm) { $messageItems = $this->prepareItems($json_string, $dynaForm); // save message $this->message_service->create($form->id, Json::encode($messageItems, JSON_UNESCAPED_UNICODE)); //prepare e-mail message $sent = $this->mailer->compose( ['html' => '@common/modules/forms/mail/form-html', 'text' => '@common/modules/forms/mail/form-text'], ['items' => $messageItems] ) ->setTo($form->from) ->setReplyTo(isset($form->reply) ? $form->reply : $form->from) ->setSubject($form->subject) ->send(); if (!$sent) { throw new \RuntimeException('Sending error.'); } } private function prepareItems($json_string, $dynaForm): array { $items = []; $json = Json::decode($json_string, true); foreach ($json as $item) { if ($item['type'] == 'button') {continue;} if ($item['type'] == 'paragraph') {continue;} if ($item['type'] == 'header') {continue;} $item['name'] = str_replace( '-', '_', $item['name'] ); $items[] = [ 'key' => isset($item['label']) ? $item['label'] : '', 'value' => is_array($dynaForm->{$item['name']}) ? implode(', ', array_map(function($el){return Html::encode($el);}, $dynaForm->{$item['name']})) : Html::encode($dynaForm->{$item['name']}), ]; } return $items; } /*private function prepareMessage($json_string, $dynaForm): string { $message = ''; $json = Json::decode($json_string, true); foreach ($json as $item) { if ($item['type'] == 'button') {continue;} $item['name'] = str_replace('-', '_', $item['name']); $message.=$item['label'] . ': ' . Html::encode($dynaForm->{$item['name']}) . "\n"; } return $message; }*/ protected function findModel($id): Form { if (($model = Form::findOne($id)) !== null) { return $model; } throw new NotFoundHttpException('The requested form does not exist.'); } }