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 @@
+
+
+
+ = (new ActiveField(['model' => $message_lang, 'attribute' => "[$model->language_id]lang_id"]))->label(false)->hiddenInput(['value' => $model->language_id]) ?>
+
+ = (new ActiveField(['model' => $message_lang, 'attribute' => "[$model->language_id]title", 'form' => $form]))->textInput() ?>
+
+ = (new ActiveField(['model' => $message_lang, 'attribute' => "[$model->language_id]body", 'form' => $form]))->widget(CKEditor::className(),['editorOptions' => [ 'preset' => 'full', 'inline' => false, ], ]); ?>
+
+ = (new ActiveField(['model' => $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 @@
+
+
+
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 @@
+
+
+
+
+ ['index'],
+ 'method' => 'get',
+ ]); ?>
+
+ = $form->field($model, 'id') ?>
+
+ = $form->field($model, 'name') ?>
+
+
+ = Html::submitButton('Search', ['class' => 'btn btn-primary']) ?>
+ = Html::resetButton('Reset', ['class' => 'btn btn-default']) ?>
+
+
+
+
+
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;
+?>
+
+
+
= Html::encode($this->title) ?>
+
+ = $this->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;
+?>
+
+
+
= Html::encode($this->title) ?>
+ render('_search', ['model' => $searchModel]); ?>
+
+
+ = Html::a('Create Message', ['create'], ['class' => 'btn btn-success']) ?>
+
+
+ = GridView::widget([
+ 'dataProvider' => $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';
+?>
+
+
+
= Html::encode($this->title) ?>
+
+ = $this->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;
+?>
+
+
+
= Html::encode($this->title) ?>
+
+
+ = Html::a('Update', ['update', 'id' => $model->id], ['class' => 'btn btn-primary']) ?>
+ = Html::a('Delete', ['delete', 'id' => $model->id], [
+ 'class' => 'btn btn-danger',
+ 'data' => [
+ 'confirm' => 'Are you sure you want to delete this item?',
+ 'method' => 'post',
+ ],
+ ]) ?>
+
+
+ = DetailView::widget([
+ 'model' => $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 @@
+
+
+
+
+
+
+ $data_lang) {
+ ?>
+
+
+
+
+
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