Commit 498b013324ae08b4ddb127e2dfae324dd4616bb1

Authored by Yarik
1 parent 9744f0d3

Добавлен виджет мультиязычности

common/modules/blog/controllers/AjaxController.php
@@ -26,24 +26,24 @@ class AjaxController extends Controller @@ -26,24 +26,24 @@ class AjaxController extends Controller
26 return true; 26 return true;
27 } 27 }
28 28
29 - public function actionCategoryForm($lang_id) 29 + public function actionCategoryForm($lang_id, $widget_id)
30 { 30 {
31 $model = Language::find()->where(['>=', 'language_id', 1])->andWhere(['active' => 1, 'language_id' => $lang_id])->one(); 31 $model = Language::find()->where(['>=', 'language_id', 1])->andWhere(['active' => 1, 'language_id' => $lang_id])->one();
32 if(!$model) { 32 if(!$model) {
33 throw new NotFoundHttpException('Language not found'); 33 throw new NotFoundHttpException('Language not found');
34 } 34 }
35 $category_lang = new ArticleCategoryLang(); 35 $category_lang = new ArticleCategoryLang();
36 - return $this->renderAjax('_category_form', ['model' => $model, 'category_lang' => $category_lang]); 36 + return $this->renderAjax('_category_form', ['model' => $model, 'category_lang' => $category_lang, 'widget_id' => $widget_id]);
37 } 37 }
38 38
39 - public function actionArticleForm($lang_id) 39 + public function actionArticleForm($lang_id, $widget_id)
40 { 40 {
41 $model = Language::find()->where(['>=', 'language_id', 1])->andWhere(['active' => 1, 'language_id' => $lang_id])->one(); 41 $model = Language::find()->where(['>=', 'language_id', 1])->andWhere(['active' => 1, 'language_id' => $lang_id])->one();
42 if(!$model) { 42 if(!$model) {
43 throw new NotFoundHttpException('Language not found'); 43 throw new NotFoundHttpException('Language not found');
44 } 44 }
45 $article_lang = new ArticleLang(); 45 $article_lang = new ArticleLang();
46 - return $this->renderAjax('_article_form', ['model' => $model, 'article_lang' => $article_lang]); 46 + return $this->renderAjax('_article_form', ['model' => $model, 'article_lang' => $article_lang, 'widget_id' => $widget_id]);
47 } 47 }
48 48
49 public function actionRemoveImage() 49 public function actionRemoveImage()
common/modules/blog/views/ajax/_article_form.php
@@ -5,7 +5,7 @@ use mihaildev\ckeditor\CKEditor; @@ -5,7 +5,7 @@ use mihaildev\ckeditor\CKEditor;
5 5
6 $form = \yii\bootstrap\ActiveForm::begin(); 6 $form = \yii\bootstrap\ActiveForm::begin();
7 ?> 7 ?>
8 -<div role="" class="tab-pane active ajax-loaded" id="lang-<?=$model->language_id?>"> 8 +<div role="" class="tab-pane active ajax-loaded" id="<?=$widget_id?>-<?=$model->language_id?>">
9 9
10 <?= (new ActiveField(['model' => $article_lang, 'attribute' => "[$model->language_id]lang_id"]))->label(false)->hiddenInput(['value' => $model->language_id]) ?> 10 <?= (new ActiveField(['model' => $article_lang, 'attribute' => "[$model->language_id]lang_id"]))->label(false)->hiddenInput(['value' => $model->language_id]) ?>
11 11
common/modules/blog/views/ajax/_category_form.php
@@ -5,7 +5,7 @@ use mihaildev\ckeditor\CKEditor; @@ -5,7 +5,7 @@ use mihaildev\ckeditor\CKEditor;
5 5
6 $form = \yii\bootstrap\ActiveForm::begin(); 6 $form = \yii\bootstrap\ActiveForm::begin();
7 ?> 7 ?>
8 -<div role="" class="tab-pane active ajax-loaded" id="lang-<?=$model->language_id?>"> 8 +<div role="" class="tab-pane active ajax-loaded" id="<?=$widget_id?>-<?=$model->language_id?>">
9 9
10 <?= (new ActiveField(['model' => $category_lang, 'attribute' => "[$model->language_id]lang_id"]))->label(false)->hiddenInput(['value' => $model->language_id]) ?> 10 <?= (new ActiveField(['model' => $category_lang, 'attribute' => "[$model->language_id]lang_id"]))->label(false)->hiddenInput(['value' => $model->language_id]) ?>
11 11
common/modules/blog/views/article/_form.php
1 <?php 1 <?php
2 use common\modules\blog\models\ArticleCategory; 2 use common\modules\blog\models\ArticleCategory;
  3 +use common\widgets\Multilang;
3 use yii\bootstrap\ActiveForm; 4 use yii\bootstrap\ActiveForm;
4 use common\modules\blog\models\Article; 5 use common\modules\blog\models\Article;
5 use yii\bootstrap\Html; 6 use yii\bootstrap\Html;
@@ -80,36 +81,15 @@ $uploaddir = \Yii::getAlias(&#39;@saveImageDir&#39;); @@ -80,36 +81,15 @@ $uploaddir = \Yii::getAlias(&#39;@saveImageDir&#39;);
80 81
81 <hr> 82 <hr>
82 83
83 - <div class="dropdown pull-right">  
84 - <button class="btn btn-default dropdown-toggle" type="button" id="dropdownLang" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">  
85 - <?= Yii::t('app', 'Add language') ?>  
86 - <span class="caret"></span>  
87 - </button>  
88 - <ul class="dropdown-menu f32" id="lang-dropdown" aria-labelledby="dropdownMenu1">  
89 - <?php foreach($langs as $index => $lang) {  
90 - if(in_array($index, array_keys($article_langs))) continue;  
91 - ?>  
92 - <li><a href="#lang-tabs" data-lang="<?=$lang->language_id?>"><span class="flag <?=$lang->country_code?>"></span></a></li>  
93 - <?php } ?>  
94 - </ul>  
95 - </div>  
96 - <ul class="nav nav-tabs f32" id="lang-tabs" role="tablist"> 84 + <?php
  85 + $multilang = Multilang::begin(['ajaxpath' => Url::to(['/blog/ajax/article-form']), 'form' => $form, 'data_langs' => $article_langs]);
  86 + ?>
97 <?php 87 <?php
98 $first = 1; 88 $first = 1;
99 foreach($article_langs as $index => $article_lang) { 89 foreach($article_langs as $index => $article_lang) {
100 ?> 90 ?>
101 - <li role="lang_inputs" class="<?php if($first) { echo 'active'; }?>" data-lang="<?=$index?>"><a href="#lang-<?=$index?>" aria-controls="lang-<?=$index?>" role="tab" data-toggle="tab"><span class="flag <?=$langs[$index]->country_code?>"></span></a></li>  
102 - <?php  
103 - $first = 0;  
104 - }  
105 - ?>  
106 - </ul>  
107 - <div class="tab-content lang-tab-content">  
108 - <?php  
109 - $first = 1;  
110 - foreach($article_langs as $index => $article_lang) {  
111 - ?>  
112 - <div role="" class="tab-pane <?php if($first) { echo 'active main-tab'; } ?>" id="lang-<?=$index?>"> 91 + <div role="" class="tab-pane <?php if($first) { echo 'active main-tab'; } ?>" id="<?=$multilang->id?>-<?=$index?>">
  92 +
113 <?= $form->field($article_langs[$index], "[$index]lang_id")->label(false)->hiddenInput(['value' => $index]) ?> 93 <?= $form->field($article_langs[$index], "[$index]lang_id")->label(false)->hiddenInput(['value' => $index]) ?>
114 94
115 <?= $form->field($article_langs[$index], "[$index]text")->widget(CKEditor::className(),['editorOptions' => [ 'preset' => 'full', 'inline' => false, ], ]); ?> 95 <?= $form->field($article_langs[$index], "[$index]text")->widget(CKEditor::className(),['editorOptions' => [ 'preset' => 'full', 'inline' => false, ], ]); ?>
@@ -135,7 +115,9 @@ $uploaddir = \Yii::getAlias(&#39;@saveImageDir&#39;); @@ -135,7 +115,9 @@ $uploaddir = \Yii::getAlias(&#39;@saveImageDir&#39;);
135 $first = 0; 115 $first = 0;
136 } 116 }
137 ?> 117 ?>
138 - </div> 118 + <?php
  119 + $multilang->end();
  120 + ?>
139 121
140 <div class="form-group"> 122 <div class="form-group">
141 <?= Html::submitButton($article->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $article->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> 123 <?= Html::submitButton($article->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $article->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
common/modules/blog/views/category/_form.php
1 <?php 1 <?php
  2 +use common\widgets\Multilang;
2 use yii\bootstrap\ActiveForm; 3 use yii\bootstrap\ActiveForm;
3 use common\modules\blog\models\ArticleCategory; 4 use common\modules\blog\models\ArticleCategory;
4 use yii\bootstrap\Html; 5 use yii\bootstrap\Html;
@@ -75,31 +76,9 @@ $uploaddir = \Yii::getAlias(&#39;@saveImageDir&#39;); @@ -75,31 +76,9 @@ $uploaddir = \Yii::getAlias(&#39;@saveImageDir&#39;);
75 76
76 <hr> 77 <hr>
77 78
78 - <div class="dropdown pull-right">  
79 - <button class="btn btn-default dropdown-toggle" type="button" id="dropdownLang" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">  
80 - <?= Yii::t('app', 'Add language') ?>  
81 - <span class="caret"></span>  
82 - </button>  
83 - <ul class="dropdown-menu f32" id="lang-dropdown" aria-labelledby="dropdownMenu1">  
84 - <?php foreach($langs as $index => $lang) {  
85 - if(in_array($index, array_keys($category_langs))) continue;  
86 - ?>  
87 - <li><a href="#lang-tabs" data-lang="<?=$lang->language_id?>"><span class="flag <?=$lang->country_code?>"></span></a></li>  
88 - <?php } ?>  
89 - </ul>  
90 - </div>  
91 - <ul class="nav nav-tabs f32" id="lang-tabs" role="tablist">  
92 - <?php  
93 - $first = 1;  
94 - foreach($category_langs as $index => $category_lang) {  
95 - ?>  
96 - <li role="lang_inputs" class="<?php if($first) { echo 'active'; }?>" data-lang="<?=$index?>"><a href="#lang-<?=$index?>" aria-controls="lang-<?=$index?>" role="tab" data-toggle="tab"><span class="flag <?=$langs[$index]->country_code?>"></span></a></li>  
97 - <?php  
98 - $first = 0;  
99 - }  
100 - ?>  
101 - </ul>  
102 - <div class="tab-content lang-tab-content"> 79 + <?php
  80 + $multilang = Multilang::begin(['ajaxpath' => Url::to(['/blog/ajax/category-form']), 'form' => $form, 'data_langs' => $category_langs])
  81 + ?>
103 <?php 82 <?php
104 $first = 1; 83 $first = 1;
105 foreach($category_langs as $index => $category_lang) { 84 foreach($category_langs as $index => $category_lang) {
@@ -130,7 +109,9 @@ $uploaddir = \Yii::getAlias(&#39;@saveImageDir&#39;); @@ -130,7 +109,9 @@ $uploaddir = \Yii::getAlias(&#39;@saveImageDir&#39;);
130 $first = 0; 109 $first = 0;
131 } 110 }
132 ?> 111 ?>
133 - </div> 112 + <?php
  113 + $multilang->end();
  114 + ?>
134 115
135 <div class="form-group"> 116 <div class="form-group">
136 <?= Html::submitButton($category->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $category->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?> 117 <?= Html::submitButton($category->isNewRecord ? Yii::t('app', 'Create') : Yii::t('app', 'Update'), ['class' => $category->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
common/widgets/Multilang.php 0 → 100644
  1 +<?php
  2 +namespace common\widgets;
  3 +use common\models\Language;
  4 +use yii\base\InvalidParamException;
  5 +use yii\base\Widget;
  6 +use yii\bootstrap\ActiveForm;
  7 +
  8 +class Multilang extends Widget
  9 +{
  10 + public $id;
  11 +
  12 + public $langs;
  13 +
  14 + public $data_langs = [];
  15 +
  16 + public $ajaxpath;
  17 +
  18 + public $form;
  19 +
  20 + public function init()
  21 + {
  22 + parent::init();
  23 + if(empty($this->id)) {
  24 + $this->id = \Yii::$app->security->generateRandomString(8);
  25 + }
  26 + if(empty($this->langs)) {
  27 + $this->langs = Language::getActiveLanguages();
  28 + }
  29 + if(empty($this->ajaxpath)) {
  30 + throw new InvalidParamException('ajaxpath must be set');
  31 + }
  32 + if(empty($this->form)) {
  33 + throw new InvalidParamException('form must be set');
  34 + }
  35 + ob_start();
  36 + echo $this->render('multilang-begin', ['id' => $this->id, 'langs' => $this->langs, 'data_langs' => $this->data_langs, 'ajaxpath' => $this->ajaxpath, 'form' => $this->form]);
  37 + }
  38 +
  39 + public function run()
  40 + {
  41 + echo $this->render('multilang-end', ['id' => $this->id, 'langs' => $this->langs, 'data_langs' => $this->data_langs, 'ajaxpath' => $this->ajaxpath, 'form' => $this->form]);
  42 + $content = ob_get_clean();
  43 + return $content;
  44 + }
  45 +}
0 \ No newline at end of file 46 \ No newline at end of file
common/widgets/views/multilang-begin.php 0 → 100644
  1 +<?php
  2 +use yii\helpers\Url;
  3 +?>
  4 +<div class="dropdown pull-right">
  5 + <button class="btn btn-default dropdown-toggle" type="button" id="<?=$id?>Lang" data-toggle="dropdown" aria-haspopup="true" aria-expanded="true">
  6 + <?= Yii::t('app', 'Add language') ?>
  7 + <span class="caret"></span>
  8 + </button>
  9 + <ul class="dropdown-menu f32" id="lang-<?=$id?>" aria-labelledby="<?=$id?>Menu">
  10 + <?php foreach($langs as $index => $lang) {
  11 + if(in_array($index, array_keys($data_langs))) continue;
  12 + ?>
  13 + <li><a href="#<?=$id?>" data-lang="<?=$lang->language_id?>"><span class="flag <?=$lang->country_code?>"></span></a></li>
  14 + <?php } ?>
  15 + </ul>
  16 +</div>
  17 +<ul class="nav nav-tabs f32" id="<?=$id?>-tabs" role="tablist">
  18 + <?php
  19 + $first = 1;
  20 + foreach($data_langs as $index => $data_lang) {
  21 + ?>
  22 + <li role="lang_inputs" class="<?php if($first) { echo 'active'; }?>" data-lang="<?=$index?>"><a href="#<?=$id?>-<?=$index?>" aria-controls="<?=$id?>-<?=$index?>" role="tab" data-toggle="tab"><span class="flag <?=$langs[$index]->country_code?>"></span></a></li>
  23 + <?php
  24 + $first = 0;
  25 + }
  26 + ?>
  27 +</ul>
  28 +<div class="tab-content lang-tab-content" id="tab-content-<?=$id?>">
  29 +
common/widgets/views/multilang-end.php 0 → 100644
  1 +<?php
  2 +use yii\helpers\Url;
  3 +?>
  4 +</div>
  5 +<script>
  6 + if(typeof form === 'undefined') {
  7 + var form = [];
  8 + }
  9 + form['<?=$id?>'] = '<?=$ajaxpath?>';
  10 +</script>
0 \ No newline at end of file 11 \ No newline at end of file
frontend/web/js/option.js
@@ -36,42 +36,6 @@ $(function() { @@ -36,42 +36,6 @@ $(function() {
36 $(document).on('click', '.remove_lang', function() { 36 $(document).on('click', '.remove_lang', function() {
37 $(this).parents('.form-wrapper').remove(); 37 $(this).parents('.form-wrapper').remove();
38 }); 38 });
39 - if($('#lang-tabs li').length > 1) {  
40 - $('#lang-tabs li').append('<span class="glyphicon glyphicon-remove-circle remove-lang"></span>')  
41 - }  
42 - $(document).on('click', '#lang-dropdown li a[data-lang]', function() {  
43 - var lang = $(this).data('lang');  
44 - var flag = $(this).find('span').first().clone();  
45 - var el = $(this);  
46 - $.get('/blog/ajax/category-form', { lang_id: lang }, function(data) {  
47 - $('#lang-tabs li').removeClass('active');  
48 - $('#lang-tabs').append('<li role="lang_inputs" class="active" data-lang="'+lang+'"><a href="#lang-'+lang+'" aria-controls="lang-'+lang+'" role="tab" data-toggle="tab">'+$('<p>').append($(flag)).html()+'</a></li>');  
49 - $('.lang-tab-content .tab-pane.active').removeClass('active');  
50 - $('.lang-tab-content').append($(data).find('.ajax-loaded').first());  
51 - $('body').append($(data).filter('script'));  
52 - $(el).parent().remove();  
53 - if(!$('#lang-dropdown li').length) {  
54 - $('#dropdownLang').addClass('disabled');  
55 - }  
56 - if($('#lang-tabs li').length > 1) {  
57 - $('#lang-tabs li').append('<span class="glyphicon glyphicon-remove-circle remove-lang"></span>')  
58 - }  
59 - });  
60 - });  
61 - $(document).on('click', '.remove-lang', function() {  
62 - var lang = $(this).parent().data('lang');  
63 - var flag = $(this).parent().find('span.flag').first().clone();  
64 - $('#lang-'+lang).remove();  
65 - $('#lang-dropdown').append('<li><a href="#lang-tabs" data-lang="'+lang+'">'+$('<p>').append($(flag)).html()+'</a></li>');  
66 - $('#dropdownLang').removeClass('disabled');  
67 - $(this).parent().remove();  
68 - if($('#lang-tabs li').length <= 1) {  
69 - $('#lang-tabs li').find('.remove-lang').remove();  
70 - }  
71 - if(!$('#lang-tabs>li.active').length) {  
72 - $('#lang-tabs>li').first().find('a').tab('show');  
73 - }  
74 - });  
75 $(document).on('change', '.image_inputs_field', function() { 39 $(document).on('change', '.image_inputs_field', function() {
76 readURL(this); 40 readURL(this);
77 }); 41 });
@@ -89,4 +53,44 @@ $(function() { @@ -89,4 +53,44 @@ $(function() {
89 } 53 }
90 return false; 54 return false;
91 }); 55 });
  56 + $.each($('.nav-tabs.f32'), function(key, value) {
  57 + if($(value).find('li').length > 1) {
  58 + $(value).find('li').append('<span class="glyphicon glyphicon-remove-circle remove-lang"></span>');
  59 + }
  60 + });
  61 + $(document).on('click', '.dropdown-menu.f32 li a[data-lang]', function() {
  62 + var lang = $(this).data('lang');
  63 + var flag = $(this).find('span').first().clone();
  64 + var el = $(this);
  65 + var id = $(this).attr('href').substr(1);
  66 + $.get(form[id], { lang_id: lang, widget_id: id }, function(data) {
  67 + $('#'+id+'-tabs li').removeClass('active');
  68 + $('#'+id+'-tabs').append('<li role="lang_inputs" class="active" data-lang="'+lang+'"><a href="#'+id+'-'+lang+'" aria-controls="'+id+'-'+lang+'" role="tab" data-toggle="tab">'+$('<p>').append($(flag)).html()+'</a></li>');
  69 + $('#tab-content-'+id+' .tab-pane.active').removeClass('active');
  70 + $('#tab-content-'+id).append($(data).find('.ajax-loaded').first());
  71 + $('body').append($(data).filter('script'));
  72 + $(el).parent().remove();
  73 + if(!$('#lang-'+id+' li').length) {
  74 + $('#'+id+'Lang').addClass('disabled');
  75 + }
  76 + if($('#'+id+'-tabs li').length > 1) {
  77 + $('#'+id+'-tabs li').append('<span class="glyphicon glyphicon-remove-circle remove-lang"></span>')
  78 + }
  79 + });
  80 + });
  81 + $(document).on('click', '.remove-lang', function() {
  82 + var lang = $(this).parent().data('lang');
  83 + var flag = $(this).parent().find('span.flag').first().clone();
  84 + var id = $(this).parent().find('a[aria-controls]').first().attr('aria-controls').substr(0,8);
  85 + $('#'+id+'-'+lang).remove();
  86 + $('#lang-'+id).append('<li><a href="#'+id+'" data-lang="'+lang+'">'+$('<p>').append($(flag)).html()+'</a></li>');
  87 + $('#'+id+'Lang').removeClass('disabled');
  88 + $(this).parent().remove();
  89 + if($('#'+id+'-tabs li').length <= 1) {
  90 + $('#'+id+'-tabs li').find('.remove-lang').remove();
  91 + }
  92 + if(!$('#'+id+'-tabs>li.active').length) {
  93 + $('#'+id+'-tabs>li').first().find('a').tab('show');
  94 + }
  95 + });
92 }); 96 });
93 \ No newline at end of file 97 \ No newline at end of file