|  |  |  | <?php
 | 
					
						
							|  |  |  | /**
 | 
					
						
							|  |  |  |  * Created by Error202
 | 
					
						
							|  |  |  |  * Date: 01.08.2018
 | 
					
						
							|  |  |  |  */
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | namespace common\modules\forms\controllers;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | use common\modules\forms\entities\Form;
 | 
					
						
							|  |  |  | use common\modules\forms\services\FormMessageManageService;
 | 
					
						
							|  |  |  | use frontend\components\FrontendController;
 | 
					
						
							|  |  |  | use yii\base\Model;
 | 
					
						
							|  |  |  | use yii\helpers\Html;
 | 
					
						
							|  |  |  | use yii\helpers\Json;
 | 
					
						
							|  |  |  | use yii\mail\MailerInterface;
 | 
					
						
							|  |  |  | use yii\web\NotFoundHttpException;
 | 
					
						
							|  |  |  | use Yii;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class FormController extends FrontendController
 | 
					
						
							|  |  |  | {
 | 
					
						
							|  |  |  | 	public $mailer;
 | 
					
						
							|  |  |  | 	public $message_service;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	public function __construct( string $id, $module, MailerInterface $mailer, FormMessageManageService $message_service, array $config = [] ) {
 | 
					
						
							|  |  |  | 		parent::__construct( $id, $module, $config );
 | 
					
						
							|  |  |  | 		$this->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
 | 
					
						
							|  |  |  | 		$to = isset($form->return) && $form->return ? explode(',',$form->return) : [Yii::$app->params['adminEmail']];
 | 
					
						
							|  |  |  | 		$from = isset($form->from) && $form->from ? explode(',',$form->from) : [Yii::$app->params['adminEmail']];
 | 
					
						
							|  |  |  | 		$reply = isset($form->reply) && $form->reply ? explode(',',$form->reply) : $from;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		$sent = $this->mailer->compose(
 | 
					
						
							|  |  |  | 			['html' => '@common/modules/forms/mail/form-html', 'text' => '@common/modules/forms/mail/form-text'],
 | 
					
						
							|  |  |  | 			['items' => $messageItems]
 | 
					
						
							|  |  |  | 		)
 | 
					
						
							|  |  |  | 			 ->setTo($to)
 | 
					
						
							|  |  |  |              ->setFrom($from)
 | 
					
						
							|  |  |  | 			 ->setReplyTo($reply)
 | 
					
						
							|  |  |  |              ->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.');
 | 
					
						
							|  |  |  | 	}
 | 
					
						
							|  |  |  | }
 |