Commit 498b013324ae08b4ddb127e2dfae324dd4616bb1

Authored by Yarik
1 parent 9744f0d3

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

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(&#39;@saveImageDir&#39;);
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(&#39;@saveImageDir&#39;);
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(&#39;@saveImageDir&#39;);
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(&#39;@saveImageDir&#39;);
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']) ?>
... ...
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 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 11 \ No newline at end of file
... ...
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
... ...