From 97be095e30b29a6b7f1534d3b4653b6e54b16eb9 Mon Sep 17 00:00:00 2001 From: alexanderWeb Date: Fri, 25 Dec 2015 17:35:02 +0200 Subject: [PATCH] message --- (2).bowerrc | 3 +++ backend/config/main.php | 10 ++++++++++ backend/config/params.php | 1 + backend/controllers/AjaxController.php | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend/controllers/MailerQueueController.php | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend/controllers/MessageController.php | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend/models/Message.php | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend/models/MessageLang.php | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend/models/MessageSearch.php | 66 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ backend/views/ajax/message_form.php | 20 ++++++++++++++++++++ backend/views/language/index.php | 2 +- backend/views/layouts/left.php | 1 + backend/views/message/_form.php | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++ backend/views/message/_search.php | 29 +++++++++++++++++++++++++++++ backend/views/message/create.php | 23 +++++++++++++++++++++++ backend/views/message/index.php | 35 +++++++++++++++++++++++++++++++++++ backend/views/message/update.php | 23 +++++++++++++++++++++++ backend/views/message/view.php | 40 ++++++++++++++++++++++++++++++++++++++++ backend/web/js/option.js | 87 +++++++++++++++++++++++++++++++++++++++++++++++++++------------------------------------ common/components/DbSpool.php | 153 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ common/config/main.php | 12 +++++++++++- common/models/MailerQueue.php | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++++ common/widgets/Multilang.php | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ common/widgets/views/multilang-begin.php | 29 +++++++++++++++++++++++++++++ common/widgets/views/multilang-end.php | 10 ++++++++++ composer.json | 3 ++- console/controllers/MailerQueueController.php | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ frontend/models/OptionValues.php | 2 +- frontend/web/js/option.js | 76 ++++++++++++++++++++++++++++++++++++++++------------------------------------ private | 27 +++++++++++++++++++++++++++ private.pub | 1 + res | 27 +++++++++++++++++++++++++++ res.pub | 1 + 33 files changed, 1321 insertions(+), 76 deletions(-) create mode 100644 (2).bowerrc create mode 100644 backend/controllers/AjaxController.php create mode 100644 backend/controllers/MailerQueueController.php create mode 100644 backend/controllers/MessageController.php create mode 100644 backend/models/Message.php create mode 100644 backend/models/MessageLang.php create mode 100644 backend/models/MessageSearch.php create mode 100644 backend/views/ajax/message_form.php create mode 100644 backend/views/message/_form.php create mode 100644 backend/views/message/_search.php create mode 100644 backend/views/message/create.php create mode 100644 backend/views/message/index.php create mode 100644 backend/views/message/update.php create mode 100644 backend/views/message/view.php create mode 100644 common/components/DbSpool.php create mode 100644 common/models/MailerQueue.php create mode 100644 common/widgets/Multilang.php create mode 100644 common/widgets/views/multilang-begin.php create mode 100644 common/widgets/views/multilang-end.php create mode 100644 console/controllers/MailerQueueController.php create mode 100644 private create mode 100644 private.pub create mode 100644 res create mode 100644 res.pub diff --git a/ (2).bowerrc b/ (2).bowerrc new file mode 100644 index 0000000..1669168 --- /dev/null +++ b/ (2).bowerrc @@ -0,0 +1,3 @@ +{ + "directory" : "vendor/bower" +} diff --git a/backend/config/main.php b/backend/config/main.php index 3ea1918..6e90917 100644 --- a/backend/config/main.php +++ b/backend/config/main.php @@ -23,6 +23,16 @@ return [ ], ], 'components' => [ + 'mailer' => [ + 'class' => 'yii\swiftmailer\Mailer', + 'transport' => [ + 'class' => 'Swift_SpoolTransport', + 'constructArgs' => [ + 'spool' => new common\components\DbSpool(), + ] + ], + 'useFileTransport' => false, + ], 'user' => [ 'identityClass' => 'common\models\User', 'enableAutoLogin' => true, diff --git a/backend/config/params.php b/backend/config/params.php index 7f754b9..1fdd3e2 100644 --- a/backend/config/params.php +++ b/backend/config/params.php @@ -1,4 +1,5 @@ 'admin@example.com', + 'lang_id'=>1 ]; diff --git a/backend/controllers/AjaxController.php b/backend/controllers/AjaxController.php new file mode 100644 index 0000000..4e8a7a3 --- /dev/null +++ b/backend/controllers/AjaxController.php @@ -0,0 +1,68 @@ +request->getIsAjax()) { + //throw new ForbiddenHttpException('Permission denied'); + } + + if(!parent::beforeAction($action)) { + return false; + } + + return true; + } + public function actionMessageForm($lang_id, $widget_id) + { + $model = Language::find()->where(['>=', 'language_id', 1])->andWhere(['active' => 1, 'language_id' => $lang_id])->one(); + if(!$model) { + throw new NotFoundHttpException('Language not found'); + } + $message_lang = new MessageLang(); + return $this->renderAjax('message_form', ['model' => $model, 'message_lang' => $message_lang, 'widget_id' => $widget_id]); + } + + /* public function actionRemoveImage() + { + $post = \Yii::$app->request->post(); + if(!empty($post['article_media_id'])) { + $article_media = ArticleMedia::findOne($post['article_media_id']); + if($post['remove_media']) { + $media = $article_media->media->delete(); + } + if(!empty($article_media)) { + $article_media->delete(); + } + return true; + } else { + return false; + } + } + + public function actionRemoveImageCategory() + { + $post = \Yii::$app->request->post(); + if(!empty($post['category_media_id'])) { + $category_media = ArticleCategoryMedia::findOne($post['category_media_id']); + if($post['remove_media']) { + $media = $category_media->media->delete(); + } + if(!empty($category_media)) { + $category_media->delete(); + } + return true; + } else { + return false; + } + }*/ +} diff --git a/backend/controllers/MailerQueueController.php b/backend/controllers/MailerQueueController.php new file mode 100644 index 0000000..83a3c9e --- /dev/null +++ b/backend/controllers/MailerQueueController.php @@ -0,0 +1,102 @@ + [ + 'class' => VerbFilter::className(), + 'actions' => [ + 'delete' => ['post'], + ], + ], + ]; + } + + /** + * @param integer $id message id + * add message to queue + */ + public function actionSpooler($id) + { + $curr_lang=2; + $message_tempalete = Message::findOne(['id'=>$id]); + $message_template_langs = $message_tempalete->getMessageLangs()->where(['>=', 'lang_id', '1'])->indexBy('lang_id')->all(); + $message = \Swift_Message::newInstance(); + $spool = new DbSpool(); + $transport = \Swift_SpoolTransport::newInstance($spool); + $mailer = \Swift_Mailer::newInstance($transport); + foreach ($message_template_langs as $message_template_lang) + { + if($message_template_lang->lang_id == $curr_lang ) + { + $message ->setSubject($message_template_lang->title) + ->setFrom('info@example.com') + ->setTo('alexandr.khivrich@gmail.com') + ->setBody($message_template_lang->body); + if($message_template_lang->is_html) + { + $message ->setContentType('text\html'); + } + break; + } + } + $result = $mailer->send($message); + } + + /** + * Send Queue messages + */ + public function actionSend() + { + $messageLimit = 10; + $timeLimit = 0; + + $spool = new DbSpool(); + //$transportReal = \Swift_MailTransport::newInstance(); + $transportReal = \Swift_SmtpTransport::newInstance( + "smtp.gmail.com", + "465", + "ssl" + ) + ->setUsername("alexandr.khivrich@gmail.com") + ->setPassword("10181997Nadia"); + + $spool->setMessageLimit($messageLimit); + $spool->setTimeLimit($timeLimit); + $sent = $spool->flushQueue($transportReal); + + echo sprintf('sent %s emails', $sent); + } + /** + * Finds the MailerQueue model based on its primary key value. + * If the model is not found, a 404 HTTP exception will be thrown. + * @param integer $id + * @return MailerQueue the loaded model + * @throws NotFoundHttpException if the model cannot be found + */ + protected function findModel($id) + { + if (($model = MailerQueue::findOne($id)) !== null) { + return $model; + } else { + throw new NotFoundHttpException('The requested page does not exist.'); + } + } +} diff --git a/backend/controllers/MessageController.php b/backend/controllers/MessageController.php new file mode 100644 index 0000000..41e877c --- /dev/null +++ b/backend/controllers/MessageController.php @@ -0,0 +1,205 @@ + [ + 'class' => VerbFilter::className(), + 'actions' => [ + 'delete' => ['post'], + ], + ], + ]; + } + + /** + * Lists all Message models. + * @return mixed + */ + public function actionIndex() + { + $searchModel = new MessageSearch(); + $dataProvider = $searchModel->search(Yii::$app->request->queryParams); + + return $this->render('index', [ + 'searchModel' => $searchModel, + 'dataProvider' => $dataProvider, + ]); + } + + /** + * Displays a single Message model. + * @param integer $id + * @return mixed + */ + public function actionView($id) + { + return $this->render('view', [ + 'model' => $this->findModel($id), + 'model_lang'=>$model_lang = MessageLang::findOne(['message_id'=>$id]) + ]); + } + + /** + * Creates a new Message model. + * If creation is successful, the browser will be redirected to the 'view' page. + * @return mixed + */ + public function actionCreate() + { + $message_langs = array(); + $message = new Message(); + $images = array(); + $message->loadDefaultValues(); + $langs = Language::getActiveLanguages(); + $default_lang = Language::getDefaultLang(); + $isValid = false; + + if(!empty(\Yii::$app->request->post())) + { + + $isValid = true; + $message->load(\Yii::$app->request->post()); + $isValid = $message->validate(); + if(empty(\Yii::$app->request->post()['MessageLang'])) + { + + $message_langs[$default_lang->language_id] = new MessageLang(); + $isValid = MessageLang::validateMultiple($message_langs) && $isValid; + } + else + { + foreach(\Yii::$app->request->post()['MessageLang'] as $index => $message_lang) { + $message_langs[$index] = new MessageLang(); + } + MessageLang::loadMultiple($message_langs, \Yii::$app->request->post()); + // $isValid = MessageLang::validateMultiple($message_langs) && $isValid; + } + } + else + { + $message_langs[$default_lang->language_id] = new MessageLang(); + } + if($isValid) + { + $message->save(); + $first = 1; + foreach($message_langs as $message_lang) { + $message_lang->message_id=$message->id; + $message_lang->save(); + } + $this->redirect('index'); + } + else + { + return $this->render('create', [ + 'message_langs' => $message_langs, + 'message' => $message, + 'langs' => $langs, + ]); + } + } + + /** + * Updates an existing Message model. + * If update is successful, the browser will be redirected to the 'view' page. + * @param integer $id + * @return mixed + */ + public function actionUpdate($id) + { + $message = $this->findModel($id); + $message_langs=$message->getMessageLangs()->where(['>=', 'lang_id', '1'])->indexBy('lang_id')->all(); + $langs = Language::getActiveLanguages(); + $default_lang = Language::getDefaultLang(); + $isValid = false; + $post=\Yii::$app->request->post(); + if(!empty($post)) + { + $message->load($post); + $isValid = $message->validate(); + } + if(empty($post['MessageLang'])) + { + $isValid = MessageLang::validateMultiple($message_langs) && $isValid; + } + else + { + foreach($post['MessageLang'] as $index => $message_lang) + { + if (!array_key_exists($index, $message_langs)) + { + $message_langs[$index] = new MessageLang(); + $message_langs[$index]->message_id = $message->id; + } + } + MessageLang::loadMultiple($message_langs,$post); + } + if($isValid) + { + $message->save(); + $first = 1; + foreach($message_langs as $message_lang) { + $message_lang->message_id=$message->id; + $message_lang->save(); + } + $this->redirect('index'); + } + else + { + return $this->render('update', [ + 'message_langs' => $message_langs, + 'message' => $message, + 'langs' => $langs, + ]); + } + } + + /** + * Deletes an existing Message model. + * If deletion is successful, the browser will be redirected to the 'index' page. + * @param integer $id + * @return mixed + */ + public function actionDelete($id) + { + foreach(MessageLang::findAll(['message_id'=>$id])as $message_lang) + { + $message_lang->delete(); + } + + $this->findModel($id)->delete(); + return $this->redirect(['index']); + } + + /** + * Finds the Message model based on its primary key value. + * If the model is not found, a 404 HTTP exception will be thrown. + * @param integer $id + * @return Message the loaded model + * @throws NotFoundHttpException if the model cannot be found + */ + protected function findModel($id) + { + if (($model = Message::findOne($id)) !== null) { + return $model; + } else { + throw new NotFoundHttpException('The requested page does not exist.'); + } + } +} diff --git a/backend/models/Message.php b/backend/models/Message.php new file mode 100644 index 0000000..9c051b6 --- /dev/null +++ b/backend/models/Message.php @@ -0,0 +1,60 @@ + 255] + ]; + } + + /** + * @inheritdoc + */ + public function attributeLabels() + { + return [ + 'id' => 'ID', + 'name' => 'Name', + 'is_sevice_sender' => 'Sevice sender', + 'is_server_sender' => 'Server sender', + 'is_sms' => 'Is SMS', + ]; + } + + /** + * @return \yii\db\ActiveQuery + */ + public function getMessageLangs() + { + return $this->hasMany(MessageLang::className(), ['message_id' => 'id']); + } +} diff --git a/backend/models/MessageLang.php b/backend/models/MessageLang.php new file mode 100644 index 0000000..5de9c13 --- /dev/null +++ b/backend/models/MessageLang.php @@ -0,0 +1,76 @@ + 255] + ]; + } + + /** + * @inheritdoc + */ + public function attributeLabels() + { + return [ + 'body' => 'Body', + 'title' => 'Title', + 'lang_id' => 'Lang ID', + 'body_sms' => 'SMS', + 'is_html' => 'Is Html', + 'message_id' => 'Message ID', + 'id' => 'ID', + ]; + } + + /** + * @return \yii\db\ActiveQuery + */ + public function getLang() + { + return $this->hasOne(Language::className(), ['language_id' => 'lang_id']); + } + + /** + * @return \yii\db\ActiveQuery + */ + public function getMessage() + { + return $this->hasOne(Message::className(), ['id' => 'message_id']); + } +} diff --git a/backend/models/MessageSearch.php b/backend/models/MessageSearch.php new file mode 100644 index 0000000..ac58438 --- /dev/null +++ b/backend/models/MessageSearch.php @@ -0,0 +1,66 @@ + $query, + ]); + + $this->load($params); + + if (!$this->validate()) { + // uncomment the following line if you do not want to return any records when validation fails + // $query->where('0=1'); + return $dataProvider; + } + + $query->andFilterWhere([ + 'id' => $this->id, + ]); + + $query->andFilterWhere(['like', 'name', $this->name]); + + return $dataProvider; + } +} diff --git a/backend/views/ajax/message_form.php b/backend/views/ajax/message_form.php new file mode 100644 index 0000000..89fed36 --- /dev/null +++ b/backend/views/ajax/message_form.php @@ -0,0 +1,20 @@ + +
+ + $message_lang, 'attribute' => "[$model->language_id]lang_id"]))->label(false)->hiddenInput(['value' => $model->language_id]) ?> + + $message_lang, 'attribute' => "[$model->language_id]title", 'form' => $form]))->textInput() ?> + + $message_lang, 'attribute' => "[$model->language_id]body", 'form' => $form]))->widget(CKEditor::className(),['editorOptions' => [ 'preset' => 'full', 'inline' => false, ], ]); ?> + + $message_lang, 'attribute' => "[$model->language_id]body_sms"]))->textarea() ?> +
+end(); +?> diff --git a/backend/views/language/index.php b/backend/views/language/index.php index ad62ba2..c2c4bb4 100644 --- a/backend/views/language/index.php +++ b/backend/views/language/index.php @@ -24,7 +24,7 @@ echo $this->render('layout'); [ 'class' => Column::className(), 'content' => function($model, $key, $index, $column) { - return ''; + return ''; } ], 'language_name', diff --git a/backend/views/layouts/left.php b/backend/views/layouts/left.php index 35608df..d7b8713 100644 --- a/backend/views/layouts/left.php +++ b/backend/views/layouts/left.php @@ -38,6 +38,7 @@ ['label' => 'Gii', 'icon' => 'fa fa-file-code-o', 'url' => ['/gii']], ['label' => 'Debug', 'icon' => 'fa fa-dashboard', 'url' => ['/debug']], ['label' => 'Login', 'url' => ['site/login'], 'visible' => Yii::$app->user->isGuest], + ['label'=>'Messages','url'=>['/message']], ['label' => 'Пользователи', 'icon' => 'fa fa-file-code-o', 'url' => ['/user/']], [ 'label' => Yii::t('app', 'Blog'), diff --git a/backend/views/message/_form.php b/backend/views/message/_form.php new file mode 100644 index 0000000..7a1c8e5 --- /dev/null +++ b/backend/views/message/_form.php @@ -0,0 +1,53 @@ + + +
+ ['enctype' => 'multipart/form-data']]); ?> + field($message,'name')->textInput()?> + field($message,'is_sevice_sender')->checkbox()?> + field($message,'is_server_sender')->checkbox()?> + field($message,'is_sms')->checkbox()?> + Url::to(['/ajax/message-form']), 'form' => $form, 'data_langs' => $message_langs]); + ?> + $message_lang) { + ?> +
+ + field($message_langs[$index], "[$index]lang_id")->label(false)->hiddenInput(['value' =>$index]) ?> + + field($message_langs[$index], "[$index]title")->textInput() ?> + + field($message_langs[$index], "[$index]body")->widget(CKEditor::className(),['editorOptions' => [ 'preset' => 'full', 'inline' => false, ], ]); ?> + + field($message_langs[$index], "[$index]body_sms")->textarea()?> +
+ + end(); + ?> +
+ isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> +
+ + +
diff --git a/backend/views/message/_search.php b/backend/views/message/_search.php new file mode 100644 index 0000000..05d7e34 --- /dev/null +++ b/backend/views/message/_search.php @@ -0,0 +1,29 @@ + + + diff --git a/backend/views/message/create.php b/backend/views/message/create.php new file mode 100644 index 0000000..2b49b0f --- /dev/null +++ b/backend/views/message/create.php @@ -0,0 +1,23 @@ +title = 'Create Message'; +$this->params['breadcrumbs'][] = ['label' => 'Messages', 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; +?> +
+ +

title) ?>

+ + render('_form', [ + 'message_langs' => $message_langs, + 'message' => $message, + 'langs' => $langs, + ]) ?> + +
diff --git a/backend/views/message/index.php b/backend/views/message/index.php new file mode 100644 index 0000000..af75c88 --- /dev/null +++ b/backend/views/message/index.php @@ -0,0 +1,35 @@ +title = 'Messages'; +$this->params['breadcrumbs'][] = $this->title; +?> +
+ +

title) ?>

+ render('_search', ['model' => $searchModel]); ?> + +

+ 'btn btn-success']) ?> +

+ + $dataProvider, + 'filterModel' => $searchModel, + 'columns' => [ + ['class' => 'yii\grid\SerialColumn'], + + 'id', + 'name', + + ['class' => 'yii\grid\ActionColumn'], + ], + ]); ?> + +
diff --git a/backend/views/message/update.php b/backend/views/message/update.php new file mode 100644 index 0000000..d3904b2 --- /dev/null +++ b/backend/views/message/update.php @@ -0,0 +1,23 @@ +title = 'Update Message: ' . ' ' . $model->name; +$this->params['breadcrumbs'][] = ['label' => 'Messages', 'url' => ['index']]; +$this->params['breadcrumbs'][] = ['label' => $model->name, 'url' => ['view', 'id' => $model->id]]; +$this->params['breadcrumbs'][] = 'Update'; +?> +
+ +

title) ?>

+ + render('_form', [ + 'message_langs' => $message_langs, + 'message' => $message, + 'langs' => $langs, + ]) ?> + +
diff --git a/backend/views/message/view.php b/backend/views/message/view.php new file mode 100644 index 0000000..24500fd --- /dev/null +++ b/backend/views/message/view.php @@ -0,0 +1,40 @@ +title = $model->name; +$this->params['breadcrumbs'][] = ['label' => 'Messages', 'url' => ['index']]; +$this->params['breadcrumbs'][] = $this->title; +?> +
+ +

title) ?>

+ +

+ $model->id], ['class' => 'btn btn-primary']) ?> + $model->id], [ + 'class' => 'btn btn-danger', + 'data' => [ + 'confirm' => 'Are you sure you want to delete this item?', + 'method' => 'post', + ], + ]) ?> +

+ + $model, + 'attributes' => [ + 'id', + 'name', + [ + 'label'=>'Lang', + 'value'=>$model_lang->lang->language_name + ] + ], + ]) ?> + +
diff --git a/backend/web/js/option.js b/backend/web/js/option.js index 5a9b0ec..f39719a 100644 --- a/backend/web/js/option.js +++ b/backend/web/js/option.js @@ -36,42 +36,6 @@ $(function() { $(document).on('click', '.remove_lang', function() { $(this).parents('.form-wrapper').remove(); }); - if($('#lang-tabs li').length > 1) { - $('#lang-tabs li').append('') - } - $(document).on('click', '#lang-dropdown li a[data-lang]', function() { - var lang = $(this).data('lang'); - var flag = $(this).find('span').first().clone(); - var el = $(this); - $.get('/blog/ajax/category-form', { lang_id: lang }, function(data) { - $('#lang-tabs li').removeClass('active'); - $('#lang-tabs').append('
  • '+$('

    ').append($(flag)).html()+'

  • '); - $('.lang-tab-content .tab-pane.active').removeClass('active'); - $('.lang-tab-content').append($(data).find('.ajax-loaded').first()); - $('body').append($(data).filter('script')); - $(el).parent().remove(); - if(!$('#lang-dropdown li').length) { - $('#dropdownLang').addClass('disabled'); - } - if($('#lang-tabs li').length > 1) { - $('#lang-tabs li').append('') - } - }); - }); - $(document).on('click', '.remove-lang', function() { - var lang = $(this).parent().data('lang'); - var flag = $(this).parent().find('span.flag').first().clone(); - $('#lang-'+lang).remove(); - $('#lang-dropdown').append('
  • '+$('

    ').append($(flag)).html()+'

  • '); - $('#dropdownLang').removeClass('disabled'); - $(this).parent().remove(); - if($('#lang-tabs li').length <= 1) { - $('#lang-tabs li').find('.remove-lang').remove(); - } - if(!$('#lang-tabs>li.active').length) { - $('#lang-tabs>li').first().find('a').tab('show'); - } - }); $(document).on('change', '.image_inputs_field', function() { readURL(this); }); @@ -89,4 +53,55 @@ $(function() { } return false; }); + $.each($('.nav-tabs.f32'), function(key, value) { + if($(value).find('li').length > 1) { + $(value).find('li').append(''); + } + }); + $(document).on('click', '.dropdown-menu.f32 li a[data-lang]', function() { + var lang = $(this).data('lang'); + var flag = $(this).find('span').first().clone(); + var el = $(this); + var id = $(this).attr('href').substr(1); + $.get(form[id], { lang_id: lang, widget_id: id }, function(data) { + $('#'+id+'-tabs li').removeClass('active'); + $('#'+id+'-tabs').append('
  • '+$('

    ').append($(flag)).html()+'

  • '); + $('#tab-content-'+id+' .tab-pane.active').removeClass('active'); + $('#tab-content-'+id).append($(data).find('.ajax-loaded').first()); + $('body').append($(data).filter('script')); + $(el).parent().remove(); + if(!$('#lang-'+id+' li').length) { + $('#'+id+'Lang').addClass('disabled'); + } + if($('#'+id+'-tabs li').length > 1) { + $('#'+id+'-tabs li').append('') + } + }); + }); + $(document).on('click', '.remove-lang', function() { + var lang = $(this).parent().data('lang'); + var flag = $(this).parent().find('span.flag').first().clone(); + var id = $(this).parent().find('a[aria-controls]').first().attr('aria-controls').substr(0,8); + $('#'+id+'-'+lang).remove(); + $('#lang-'+id).append('
  • '+$('

    ').append($(flag)).html()+'

  • '); + $('#'+id+'Lang').removeClass('disabled'); + $(this).parent().remove(); + if($('#'+id+'-tabs li').length <= 1) { + $('#'+id+'-tabs li').find('.remove-lang').remove(); + } + if(!$('#'+id+'-tabs>li.active').length) { + $('#'+id+'-tabs>li').first().find('a').tab('show'); + } + }); + $('#message-is_sms').change() + { + if ($('#message-is_sms').is(":checked")) + { + + $(".field-message-cmctext").css({'display': 'block'}); + } + else { + $(".field-message-cmctext").css({'display': 'none'}); + } + } }); \ No newline at end of file diff --git a/common/components/DbSpool.php b/common/components/DbSpool.php new file mode 100644 index 0000000..fac02f2 --- /dev/null +++ b/common/components/DbSpool.php @@ -0,0 +1,153 @@ +_cache, 'clearAll')) + { + $this->_cache->clearAll($this->_cacheKey); + }*/ + } + /** + * Tests if this Spool mechanism has started. + * + * @return bool + */ + public function isStarted() + { + return true; + } + + /** + * Starts this Spool mechanism. + */ + public function start() + { + + } + + /** + * Stops this Spool mechanism. + */ + public function stop() + { + + } + + /** + * Allow to manage the enqueuing retry limit. + * + * Default, is ten and allows over 64^20 different fileNames + * + * @param int $limit + */ + public function setRetryLimit($limit) + { + $this->_retryLimit = $limit; + } + + /** + * Queues a message. + * + * @param Swift_Mime_Message $message The message to store + * + * @return bool + * + * @throws Swift_IoException + */ + public function queueMessage(\Swift_Mime_Message $message) + { + + $message->getBody(); + $queueObject = new MailerQueue(); + + $queueObject->text_body = $message->getBody(); + $queueObject->subject = $message->getSubject(); + $queueObject->to = Json::encode($message->getTo()); + $queueObject->save(); + } + + /** + * Sends messages using the given transport instance. + * + * @param Swift_Transport $transport A transport instance + * @param string[] $failedRecipients An array of failures by-reference + * + * @return int The number of sent e-mail's + */ + public function flushQueue(\Swift_Transport $transport, &$failedRecipients = null) + { + if (!$transport->isStarted()) + { + $transport->start(); + } + + $failedRecipients = (array) $failedRecipients; + + $count = 0; + $emails = MailerQueue::find() + ->where('sent_time IS NULL') + ->orderBy('id') + ->all(); + + if (!count($emails)) + { + return 0; + } + // print_r($emails); + foreach($emails as $email) + { + //$message = unserialize($email->message_object); + + $message = \Swift_Message::newInstance($email->subject) + ->setFrom(array('info@example.com' => 'ArtWeb')) + ->setTo(Json::decode($email->to)) + ->setBody($email->text_body); + try + { + $count+= $transport->send($message, $failedRecipients); + if($count > 0) + { + + $time = new \DateTime(); + $email->setAttribute('sent_time', $time->format('Y-m-d H:i:s')); + $email->save(); + } + else + { + throw new \Swift_SwiftException('The email was not sent.'); + } + } + catch(\Swift_SwiftException $ex) + { + + } + } + return $count; + } +} + diff --git a/common/config/main.php b/common/config/main.php index 21154a7..029d44a 100644 --- a/common/config/main.php +++ b/common/config/main.php @@ -166,7 +166,17 @@ return [ /*========End======= *end api sicial * */ - + 'mailer' => [ + 'class' => 'yii\swiftmailer\Mailer', + 'transport' => [ + 'class' => 'Swift_SmtpTransport', + 'host' => 'smtp.gmail.com', // e.g. smtp.mandrillapp.com or smtp.gmail.com + 'username' => 'alexandr.khivrich@gmail.com', + 'password' => '10181997Nadia', + 'port' => '587', // Port 25 is a very common port too + 'encryption' => 'tls', // It is often used, check your provider or mail servers + ] + ], ], 'language' => 'ru-RU' ]; diff --git a/common/models/MailerQueue.php b/common/models/MailerQueue.php new file mode 100644 index 0000000..ce0b828 --- /dev/null +++ b/common/models/MailerQueue.php @@ -0,0 +1,52 @@ + 255] + ]; + } + + /** + * @inheritdoc + */ + public function attributeLabels() + { + return [ + 'id' => 'ID', + 'sent_time' => 'Sent Time', + 'to' => 'To', + 'text_body' => 'Text Body', + 'subject' => 'Subject', + ]; + } +} diff --git a/common/widgets/Multilang.php b/common/widgets/Multilang.php new file mode 100644 index 0000000..5104778 --- /dev/null +++ b/common/widgets/Multilang.php @@ -0,0 +1,49 @@ +id)) + { + $this->id = \Yii::$app->security->generateRandomString(8); + } + if(empty($this->langs)) + { + $this->langs = Language::getActiveLanguages(); + } + if(empty($this->ajaxpath)) + { + throw new InvalidParamException('ajaxpath must be set'); + } + if(empty($this->form)) + { + throw new InvalidParamException('form must be set'); + } + ob_start(); + echo $this->render('multilang-begin', ['id' => $this->id, 'langs' => $this->langs, 'data_langs' => $this->data_langs, 'ajaxpath' => $this->ajaxpath, 'form' => $this->form]); + } + + public function run() + { + echo $this->render('multilang-end', ['id' => $this->id, 'langs' => $this->langs, 'data_langs' => $this->data_langs, 'ajaxpath' => $this->ajaxpath, 'form' => $this->form]); + $content = ob_get_clean(); + return $content; + } +} \ No newline at end of file diff --git a/common/widgets/views/multilang-begin.php b/common/widgets/views/multilang-begin.php new file mode 100644 index 0000000..6818ae6 --- /dev/null +++ b/common/widgets/views/multilang-begin.php @@ -0,0 +1,29 @@ + + + +
    + diff --git a/common/widgets/views/multilang-end.php b/common/widgets/views/multilang-end.php new file mode 100644 index 0000000..fdec4e6 --- /dev/null +++ b/common/widgets/views/multilang-end.php @@ -0,0 +1,10 @@ + +
    + \ No newline at end of file diff --git a/composer.json b/composer.json index d72bd01..986408d 100644 --- a/composer.json +++ b/composer.json @@ -23,7 +23,8 @@ "kartik-v/yii2-widget-select2": "@dev", "mihaildev/yii2-ckeditor": "*", "developeruz/yii2-db-rbac": "*", - "nodge/yii2-eauth": "*" + "nodge/yii2-eauth": "*", + "iutbay/yii2-kcfinder": "*" }, "require-dev": { "yiisoft/yii2-codeception": "*", diff --git a/console/controllers/MailerQueueController.php b/console/controllers/MailerQueueController.php new file mode 100644 index 0000000..944020f --- /dev/null +++ b/console/controllers/MailerQueueController.php @@ -0,0 +1,51 @@ + [ + 'class' => VerbFilter::className(), + 'actions' => [ + 'delete' => ['post'], + ], + ], + ]; + } + /** + * Send Queue messages + */ + public function actionSend() + { + $messageLimit = 10; + $timeLimit = 0; + + $spool = new DbSpool(); + $transportReal = \Swift_SmtpTransport::newInstance( + "smtp.gmail.com", + "465", + "ssl" + ) + ->setUsername("alexandr.khivrich@gmail.com") + ->setPassword("10181997Nadia"); + + $spool->setMessageLimit($messageLimit); + $spool->setTimeLimit($timeLimit); + $sent = $spool->flushQueue($transportReal); + + echo sprintf('sent %s emails', $sent); + } +} diff --git a/frontend/models/OptionValues.php b/frontend/models/OptionValues.php index 0317cc1..1bc3d15 100644 --- a/frontend/models/OptionValues.php +++ b/frontend/models/OptionValues.php @@ -73,7 +73,7 @@ class OptionValues extends \yii\db\ActiveRecord } return $langs; } - public function beforeSave($insert) { + public function beforeSave($insert){ if (parent::beforeSave($insert)) { $this->option_user = \Yii::$app->user->getId(); if($this->option_value_parent == 0) { diff --git a/frontend/web/js/option.js b/frontend/web/js/option.js index 5a9b0ec..60ac1c3 100644 --- a/frontend/web/js/option.js +++ b/frontend/web/js/option.js @@ -36,42 +36,6 @@ $(function() { $(document).on('click', '.remove_lang', function() { $(this).parents('.form-wrapper').remove(); }); - if($('#lang-tabs li').length > 1) { - $('#lang-tabs li').append('') - } - $(document).on('click', '#lang-dropdown li a[data-lang]', function() { - var lang = $(this).data('lang'); - var flag = $(this).find('span').first().clone(); - var el = $(this); - $.get('/blog/ajax/category-form', { lang_id: lang }, function(data) { - $('#lang-tabs li').removeClass('active'); - $('#lang-tabs').append('
  • '+$('

    ').append($(flag)).html()+'

  • '); - $('.lang-tab-content .tab-pane.active').removeClass('active'); - $('.lang-tab-content').append($(data).find('.ajax-loaded').first()); - $('body').append($(data).filter('script')); - $(el).parent().remove(); - if(!$('#lang-dropdown li').length) { - $('#dropdownLang').addClass('disabled'); - } - if($('#lang-tabs li').length > 1) { - $('#lang-tabs li').append('') - } - }); - }); - $(document).on('click', '.remove-lang', function() { - var lang = $(this).parent().data('lang'); - var flag = $(this).parent().find('span.flag').first().clone(); - $('#lang-'+lang).remove(); - $('#lang-dropdown').append('
  • '+$('

    ').append($(flag)).html()+'

  • '); - $('#dropdownLang').removeClass('disabled'); - $(this).parent().remove(); - if($('#lang-tabs li').length <= 1) { - $('#lang-tabs li').find('.remove-lang').remove(); - } - if(!$('#lang-tabs>li.active').length) { - $('#lang-tabs>li').first().find('a').tab('show'); - } - }); $(document).on('change', '.image_inputs_field', function() { readURL(this); }); @@ -89,4 +53,44 @@ $(function() { } return false; }); + $.each($('.nav-tabs.f32'), function(key, value) { + if($(value).find('li').length > 1) { + $(value).find('li').append(''); + } + }); + $(document).on('click', '.dropdown-menu.f32 li a[data-lang]', function() { + var lang = $(this).data('lang'); + var flag = $(this).find('span').first().clone(); + var el = $(this); + var id = $(this).attr('href').substr(1); + $.get(form[id], { lang_id: lang, widget_id: id }, function(data) { + $('#'+id+'-tabs li').removeClass('active'); + $('#'+id+'-tabs').append('
  • '+$('

    ').append($(flag)).html()+'

  • '); + $('#tab-content-'+id+' .tab-pane.active').removeClass('active'); + $('#tab-content-'+id).append($(data).find('.ajax-loaded').first()); + $('body').append($(data).filter('script')); + $(el).parent().remove(); + if(!$('#lang-'+id+' li').length) { + $('#'+id+'Lang').addClass('disabled'); + } + if($('#'+id+'-tabs li').length > 1) { + $('#'+id+'-tabs li').append('') + } + }); + }); + $(document).on('click', '.remove-lang', function() { + var lang = $(this).parent().data('lang'); + var flag = $(this).parent().find('span.flag').first().clone(); + var id = $(this).parent().find('a[aria-controls]').first().attr('aria-controls').substr(0,8); + $('#'+id+'-'+lang).remove(); + $('#lang-'+id).append('
  • '+$('

    ').append($(flag)).html()+'

  • '); + $('#'+id+'Lang').removeClass('disabled'); + $(this).parent().remove(); + if($('#'+id+'-tabs li').length <= 1) { + $('#'+id+'-tabs li').find('.remove-lang').remove(); + } + if(!$('#'+id+'-tabs>li.active').length) { + $('#'+id+'-tabs>li').first().find('a').tab('show'); + } + }); }); \ No newline at end of file diff --git a/private b/private new file mode 100644 index 0000000..8467099 --- /dev/null +++ b/private @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpQIBAAKCAQEAq1wH6wvvKupU9Qb/OzNlQgNEQucwLrSm56lTGX0Tme56zSs5 +k+44WdPQuF4xIHdzftGzna9OEat18fbdGXXrg8r2h2N7nmNkJz08DCrKQxVuyeVW +y1ktKu7qzy/5rQcSKbHARB0c/L8Iv9j63ZWu2EbBoz9rAxbUxImIwuXcLELlxHL1 +aD33VYB7ODqI0b/FBN2Su+4QlzaOW8Nhu2ctUDM3R0j2cpGa0rqAGjIUtCZiUeUa ++TsYbJwoQg+kVN9gb06I6uDsijxVexYNeuFj+JGjQm80pXqcJn92e8G3FQISan6g +BkVClr9VBlc14HV3DLFy36RuLDzkA1vmUMNd6wIDAQABAoIBACaZzaLSBmdJcCfe +EqKYWkf7imXzxDPROAPZbcHBHig/w2PyR78eG42InGzbsv9YSSkZPffYZKKwWBpQ +fM/ec1Y140DuVQuB4i7AqYUoInXoHxPV2K5oATe5qCVR7lFe1WWVB/WQBVaeBe+J +hkFiFYfcsIQApi+E9hrrzGXy95z0enNpv8cJ1z9xVNts8oxXiFwzaY8Kcz56W5mS +/XDboVI2Od+NHY3rJnWj63OLyRIBnyjYfNFMXysRZs64lRUxKvt74RB2hx+q6wlF +djTEqTdMzm9tCCbGI5InXovCkXZToQ8ed+8071eohMxpFBqP6TSFEQf1Og+T8TzK +JndHcMkCgYEA2gxBgGJmHVDaK7eiI7Fqg+ehI0GamTT/ZBHW6xvKHgMI54CUQ4c+ +acLBctailDP2VNd0gKe1RRE10dz5Akzw+MydUASQONqoO8LU5eLuyNlI7QT259Xd +Yfvw+BXUEN+WDtJNESbXhTYaO/3B7l2EzsWc6ToJRSoafiem4aEhsVUCgYEAyS9w +/W2U4IiIVzke2tjRm/vb+T3OmOv1i/y2f79PnQMPJ5oNyxdtZ3axOapMv0KZXApo +dWL205eYu0fYZpdVhtHuPAhK6tNi4CDPW2dGWB5dVaGfFMCF1CVoUJlpJT+DOfqp +d774ID5dZ1PpvJoODcPXa3Bmh+83NbmpIrH90j8CgYEAoYD+azd25zPhxQvI/qME +gBrq0ZBgECafG+HSzGXS+RPKXp5wMuxToEZuvr6XwSoTxJepZTnTHAs5T+5aSgfv +XHlB8+jNYi8i+NDAnF3P+9hlGZnZv7I6vb68pyST5MOXA/dkudWJQNPn7pNwNzvx +iK36IQ2pnB8pbFO2WdzdddkCgYEAoXvO+dyHb2Kn7TsQJSF7vfR/MKQHvH9JbL+/ +zPJGeQUHmQXypF19l1qSDnM/fxV5+4LvLant7RD1qv2UGWTHZZwD2XPejnZ2Gui7 +B+bxc7GLwTwlcIbH5OzRukApQZilQFiOxmsmxtrIJjQYnSYaubnEo5xo8Bt2+Uy5 +EfxEfAkCgYEAvwGvYDdCcjozwnAdMSSHLa0rVoChet/cZTsqpagIF7zjMq9ljG2J +7pK+esJeAwpGTwXSpIPWHDIOhScsL6iiKu2BRPa6NostlpUjDzciPZzrizz+okuP +palma9L1DuQqUSC+Vqe25Qmnk7F+Hiw+Fu3L4pMcxw8/ZgUagMpkOHM= +-----END RSA PRIVATE KEY----- diff --git a/private.pub b/private.pub new file mode 100644 index 0000000..6289a81 --- /dev/null +++ b/private.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrXAfrC+8q6lT1Bv87M2VCA0RC5zAutKbnqVMZfROZ7nrNKzmT7jhZ09C4XjEgd3N+0bOdr04Rq3Xx9t0ZdeuDyvaHY3ueY2QnPTwMKspDFW7J5VbLWS0q7urPL/mtBxIpscBEHRz8vwi/2Prdla7YRsGjP2sDFtTEiYjC5dwsQuXEcvVoPfdVgHs4OojRv8UE3ZK77hCXNo5bw2G7Zy1QMzdHSPZykZrSuoAaMhS0JmJR5Rr5OxhsnChCD6RU32BvTojq4OyKPFV7Fg164WP4kaNCbzSlepwmf3Z7wbcVAhJqfqAGRUKWv1UGVzXgdXcMsXLfpG4sPOQDW+ZQw13r alexandr.khivrich@gmail.com diff --git a/res b/res new file mode 100644 index 0000000..35f25ea --- /dev/null +++ b/res @@ -0,0 +1,27 @@ +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAmHwDO+WhonC49gHe2DNx7OD16hfMU2JS3Y26AsE+dSlWiYlZ +U0NWkmDgM88e3EpzxXECInn42OjjHxaAPcPsAnICmLjMHjAvUzQQXoPMbbbuPJxD +aanh/NZnyeHy9xj6lrUgNvsrljRjdQ20SSAcdkcsOj4+HBBxnaFIzh+GW8Ha3b26 +dBUYjOL/oxrUW0AKehpDJWlf6mzHBDa+DWCOSXK4zNI9K+y3lqeoWVIzKdrxHRfs +tnhBs7/La+pU+kxGY6B1PouB+McdG3CBZ/yMUX/o4dDamTCU85VbyoLo5R2d7Pv2 +P2y2i4/tS3E9mCAbmrYIUwShYVgYlWyYJnWCgQIDAQABAoIBAHZECQYVzk18/Bfh +z4MEM6IzwMe1eYZaxkaMO+8TDmw0iafW3W8U1Tpm5L2KMTdOj4hdY/h1fapOxolA +HGrLYGttHdJx0e7AFJSF1wRXWODndtOPp0F2v44ohQsxsg4wU3s8NCYwnNe8/j61 +SFVHEIw0G3t49xcxMc2+YAdur/jNqXAR8w4GplW03K73R8Y4jPStk4KPU8MnLfKZ +XWGq37hp5mVJlkDO91nxys4ZSvh2plKz3zRKfImEU99mWj7u8ZSKPpYU/LCm97FA +CdweW5PIyzWKSNAV/4Ge0o015rPSAlWEfGXQ8rW08oxzgEz59YOBSsxUo+4AE5zW +Gyls4AECgYEAylOrVBmzxoeNguyNlvmNsHOt8xz4XEA0RlZ6PnWSIT2PZ4NT1jAB +J9g/u2Il6zLJOvnN777+4Od4aITNVdS1xUYTkbJ8pv0dZEH9nO3BSKzHgx8S/Har +Rq02B2ZDvcV0r462QV/t1YXzrtcqSasyfZbiFSTQjYYRn7I0fB8LW0ECgYEAwO93 +ufeogMRRb5lkI5kI85vcQChWeIwUA3HbZt6BiInmhtP8Ep9YVjamMR5bCy/m25yl +IJK82gD8RDuFqjJNyUoiJuHPUonxYM/msZvshEUOoCvQQkRAG5SYlSEW083Vw6wM +3b80nqYkYvNyJrhd93lfk9LBYJulOppYDOHAl0ECgYEAs2H1P+49xuH95DtI2bdO +GUimzCo+RMQj1MztOx1QPypuT29PUFJlY+dFsiQ1zE7NvP0nyc0D+3Ed/0TnLJcX +xdz4kq+19vPpMC+V5KGjQYT2qtlNIwsvlc0SXwMbQlCjwNb93f5oRmyp/bUE6CXh +8RlqPybRxPg9/eGoyPdZQUECgYBxrGW5Lx6bh4+HljO2+ZKZnWoebuXLrpSYFvwy +1sQxAzbMl5d8DWBJo3c1l3IC3F1DZT6xO2ODenMnbH5rcan8/+2xRPgW5GlQJg4A +9SJcKCfe3RGeCYJP/bQMoWtGrY7V88e82swQ8Uic+Fx4TcYnad6TROhkmC+4oHli +VZxYQQKBgQCx+bLdGDTfI4qYEvTyyRrTX3nv4Q31EjF2kByusObqzaliLWWnezIQ +yt4WMMcIP1cT4iJoSpmahkiMBwRhvAzXsPoupGVIYoT34I5zsL8aTCRHYRza75ij +ZreEZj3XBzYSDrigAIxsDyNzF6Ku1+VtGAL3gJXsJPDPKRH/88YOdw== +-----END RSA PRIVATE KEY----- diff --git a/res.pub b/res.pub new file mode 100644 index 0000000..4ac96fa --- /dev/null +++ b/res.pub @@ -0,0 +1 @@ +ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCYfAM75aGicLj2Ad7YM3Hs4PXqF8xTYlLdjboCwT51KVaJiVlTQ1aSYOAzzx7cSnPFcQIiefjY6OMfFoA9w+wCcgKYuMweMC9TNBBeg8xttu48nENpqeH81mfJ4fL3GPqWtSA2+yuWNGN1DbRJIBx2Ryw6Pj4cEHGdoUjOH4Zbwdrdvbp0FRiM4v+jGtRbQAp6GkMlaV/qbMcENr4NYI5JcrjM0j0r7LeWp6hZUjMp2vEdF+y2eEGzv8tr6lT6TEZjoHU+i4H4xx0bcIFn/IxRf+jh0NqZMJTzlVvKgujlHZ3s+/Y/bLaLj+1LcT2YIBuatghTBKFhWBiVbJgmdYKB alexandr.khivrich@gmail.com -- libgit2 0.21.4