Commit 498b013324ae08b4ddb127e2dfae324dd4616bb1
1 parent
9744f0d3
Добавлен виджет мультиязычности
Showing
9 changed files
with
146 additions
and
95 deletions
Show diff stats
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('@saveImageDir'); | @@ -80,36 +81,15 @@ $uploaddir = \Yii::getAlias('@saveImageDir'); | ||
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('@saveImageDir'); | @@ -135,7 +115,9 @@ $uploaddir = \Yii::getAlias('@saveImageDir'); | ||
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('@saveImageDir'); | @@ -75,31 +76,9 @@ $uploaddir = \Yii::getAlias('@saveImageDir'); | ||
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('@saveImageDir'); | @@ -130,7 +109,9 @@ $uploaddir = \Yii::getAlias('@saveImageDir'); | ||
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']) ?> |
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 |
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 | + |
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 |