diff --git a/frontend/config/main.php b/frontend/config/main.php index 731e9c9..dbf192e 100755 --- a/frontend/config/main.php +++ b/frontend/config/main.php @@ -137,7 +137,8 @@ }', ], 'contact' => [ - 'class' => 'frontend\views\forms\ContactModule', + 'class' => 'frontend\modules\forms\Module', + #'class' => 'artbox\core\forms\Module', 'activeRecord' => "frontend\models\Feedback", 'templateForm' => '
{form}
', 'attributes' => [ diff --git a/frontend/models/Feedback.php b/frontend/models/Feedback.php index ee2e970..56c6171 100644 --- a/frontend/models/Feedback.php +++ b/frontend/models/Feedback.php @@ -37,7 +37,8 @@ class Feedback extends ArtboxCoreFeedback ], - [ + + [ [ 'name', 'email', diff --git a/frontend/modules/forms/DynamicModel.php b/frontend/modules/forms/DynamicModel.php new file mode 100755 index 0000000..5506e10 --- /dev/null +++ b/frontend/modules/forms/DynamicModel.php @@ -0,0 +1,34 @@ +_labels = $labels; + } + + /** + * @param string $name + * + * @return string + */ + public function getAttributeLabel($name) + { + return $this->_labels[$name] ?? $name; + } +} \ No newline at end of file diff --git a/frontend/modules/forms/Module.php b/frontend/modules/forms/Module.php new file mode 100755 index 0000000..b259c4b --- /dev/null +++ b/frontend/modules/forms/Module.php @@ -0,0 +1,83 @@ +ajax) { + $js = <<formId}', function(e) { + e.preventDefault(); + e.stopImmediatePropagation(); + $.post( + $(this).attr("action"), $(this).serialize(), {$this->successCallback}).fail({$this->errorCallback}); +}); +JS; + + $view->registerJs($js, View::POS_READY); + } + /** + * @var ActiveForm $form + */ + + $form = ActiveForm::begin( + [ + 'id' => $this->formId, + 'action' => ($this->ajax) ? '/save/ajax' : '/' . $this->id . '/save/no-ajax', + 'class' => $this->classForm, + ] + ); + $content = ''; + foreach ($this->attributes as $field) { + + # если мы присвоили этому полю тип, то он его отрисовывает + if (isset($this->inputOptions[$field]['type'])) { + $function = $this->inputOptions[$field]['type']; + $formStr = $form->field($this->model, $field) + ->$function( + isset($this->inputOptions[$field]['options']) + ? $this->inputOptions[$field]['options'] : [] + ); + } # а если нет, то просто добавляет поле + else { + $formStr = $form->field($this->model, $field); + } + if (isset($this->labels[$field])) { + $formStr->label(\Yii::t($this->locale, $this->labels[$field])); + } + if (isset($this->inputOptions[$field]['template'])) { + + $formStr = str_replace('{input}', $formStr, $this->inputOptions[$field]['template']); + } + $content .= $formStr; + + } + + $content .= $form->field($this->model, 'reCaptcha')->widget(\sashsvamir\yii2\recaptcha\ReCaptcha::className())->label(false); + + + $content .= str_replace('{button}', Html::submitButton(\Yii::t($this->locale, $this->buttonContent), $this->buttonOptions), $this->buttonTemplate); + $content = str_replace('{form}', $content, $this->templateForm); + echo $content; + ActiveForm::end(); + } +} \ No newline at end of file diff --git a/frontend/modules/forms/controllers/SaveController.php b/frontend/modules/forms/controllers/SaveController.php new file mode 100755 index 0000000..108b5c1 --- /dev/null +++ b/frontend/modules/forms/controllers/SaveController.php @@ -0,0 +1,103 @@ +request->referrer; + $model = $this->module->model; + if (\Yii::$app->request->isPost and $model->load(\Yii::$app->request->post())) { + if ($model instanceof DynamicModel) { + $this->sendEmail($model); + } else { + if ($model->save()) { + if ($this->module->sendEmail) { + $this->sendEmail($model); + return $this->redirect($returnUrl); + } + } else { + return false; + } + } + return $this->redirect($returnUrl); + + } + return $this->redirect($returnUrl); + } + + /** + * Action that saves data submited via AJAX + * + * @return array + * @throws \yii\base\InvalidConfigException + */ + public function actionAjax() + { + \Yii::$app->response->format = Response::FORMAT_JSON; + $model = $this->module->model; + if (\Yii::$app->request->isPost and $model->load(\Yii::$app->request->post())) { + if ($model instanceof DynamicModel) { + $this->sendEmail($model); + return ['status' => 'success']; + } else { + if ($model->save()) { + if ($this->module->sendEmail) { + $this->sendEmail($model); + return ['status' => 'success']; + } + return ['status' => 'success']; + } else { + return ['status' => 'error']; + } + } + + } + return ['status' => 'error']; + } + + /** + * @param $model + * + * @return bool + * @throws \yii\base\InvalidConfigException + */ + public function sendEmail($model) + { + + if ($this->module->mailer == null) { + $mailer = \Yii::$app->mailer; + } else { + $mailer = \Yii::$app->get($this->module->mailer); + } + return $mailer->compose( + [ + 'html' => $this->module->emailFile, + 'text' => $this->module->emailFile, + ], + [$model] + ) + ->setFrom([\Yii::$app->params['supportEmail'] => \Yii::$app->name . ' robot']) + ->setTo($this->module->email) + ->setSubject($this->module->subject) + ->send(); + } + +} \ No newline at end of file diff --git a/frontend/modules/forms/views/form/form.php b/frontend/modules/forms/views/form/form.php new file mode 100755 index 0000000..db9dccd --- /dev/null +++ b/frontend/modules/forms/views/form/form.php @@ -0,0 +1,26 @@ + 'dynamic-form']); +foreach ($this->context->module->attributes as $field) { + if (isset($types[$field])) { + $function = $types[$field]['type']; + echo $form->field($model, $field) + ->$function( + $types[$field]['options'] + ); + } else { + echo $form->field($model, $field); + } + +} + +echo Html::submitButton(); + +$form = ActiveForm::end(); -- libgit2 0.21.4