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 | 26 | return true; |
27 | 27 | } |
28 | 28 | |
29 | - public function actionCategoryForm($lang_id) | |
29 | + public function actionCategoryForm($lang_id, $widget_id) | |
30 | 30 | { |
31 | 31 | $model = Language::find()->where(['>=', 'language_id', 1])->andWhere(['active' => 1, 'language_id' => $lang_id])->one(); |
32 | 32 | if(!$model) { |
33 | 33 | throw new NotFoundHttpException('Language not found'); |
34 | 34 | } |
35 | 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 | 41 | $model = Language::find()->where(['>=', 'language_id', 1])->andWhere(['active' => 1, 'language_id' => $lang_id])->one(); |
42 | 42 | if(!$model) { |
43 | 43 | throw new NotFoundHttpException('Language not found'); |
44 | 44 | } |
45 | 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 | 49 | public function actionRemoveImage() | ... | ... |
common/modules/blog/views/ajax/_article_form.php
... | ... | @@ -5,7 +5,7 @@ use mihaildev\ckeditor\CKEditor; |
5 | 5 | |
6 | 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 | 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 | 5 | |
6 | 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 | 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 | 1 | <?php |
2 | 2 | use common\modules\blog\models\ArticleCategory; |
3 | +use common\widgets\Multilang; | |
3 | 4 | use yii\bootstrap\ActiveForm; |
4 | 5 | use common\modules\blog\models\Article; |
5 | 6 | use yii\bootstrap\Html; |
... | ... | @@ -80,36 +81,15 @@ $uploaddir = \Yii::getAlias('@saveImageDir'); |
80 | 81 | |
81 | 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 | 87 | <?php |
98 | 88 | $first = 1; |
99 | 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 | 93 | <?= $form->field($article_langs[$index], "[$index]lang_id")->label(false)->hiddenInput(['value' => $index]) ?> |
114 | 94 | |
115 | 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 | 115 | $first = 0; |
136 | 116 | } |
137 | 117 | ?> |
138 | - </div> | |
118 | + <?php | |
119 | + $multilang->end(); | |
120 | + ?> | |
139 | 121 | |
140 | 122 | <div class="form-group"> |
141 | 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 | 1 | <?php |
2 | +use common\widgets\Multilang; | |
2 | 3 | use yii\bootstrap\ActiveForm; |
3 | 4 | use common\modules\blog\models\ArticleCategory; |
4 | 5 | use yii\bootstrap\Html; |
... | ... | @@ -75,31 +76,9 @@ $uploaddir = \Yii::getAlias('@saveImageDir'); |
75 | 76 | |
76 | 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 | 82 | <?php |
104 | 83 | $first = 1; |
105 | 84 | foreach($category_langs as $index => $category_lang) { |
... | ... | @@ -130,7 +109,9 @@ $uploaddir = \Yii::getAlias('@saveImageDir'); |
130 | 109 | $first = 0; |
131 | 110 | } |
132 | 111 | ?> |
133 | - </div> | |
112 | + <?php | |
113 | + $multilang->end(); | |
114 | + ?> | |
134 | 115 | |
135 | 116 | <div class="form-group"> |
136 | 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 | 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 | 36 | $(document).on('click', '.remove_lang', function() { |
37 | 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 | 39 | $(document).on('change', '.image_inputs_field', function() { |
76 | 40 | readURL(this); |
77 | 41 | }); |
... | ... | @@ -89,4 +53,44 @@ $(function() { |
89 | 53 | } |
90 | 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 | 97 | \ No newline at end of file | ... | ... |