You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							131 lines
						
					
					
						
							4.3 KiB
						
					
					
				
			
		
		
	
	
							131 lines
						
					
					
						
							4.3 KiB
						
					
					
				<?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.'); | 
						|
    } | 
						|
}
 | 
						|
 |