Commit c2648e6567513a9d9882d0fc00f5b705caac57b3
1 parent
b60a88b8
- prices
Showing
8 changed files
with
337 additions
and
29 deletions
Show diff stats
backend/assets/AppAsset.php
... | ... | @@ -16,9 +16,8 @@ |
16 | 16 | // 'css/site.css', |
17 | 17 | // 'css/table-new.css', |
18 | 18 | ]; |
19 | -// public $js = ['/js/admin-script.js']; | |
19 | + public $js = ['js/backend.js']; | |
20 | 20 | public $depends = [ |
21 | - 'yii\web\YiiAsset', | |
22 | - 'yii\bootstrap\BootstrapAsset', | |
21 | + 'artbox\core\assets\ArtboxCoreAsset', | |
23 | 22 | ]; |
24 | 23 | } | ... | ... |
backend/controllers/PriceController.php
... | ... | @@ -8,6 +8,9 @@ |
8 | 8 | |
9 | 9 | namespace backend\controllers; |
10 | 10 | |
11 | + use artbox\core\models\Language; | |
12 | + use common\models\Price; | |
13 | + use common\models\PriceLang; | |
11 | 14 | use common\models\Service; |
12 | 15 | use yii\helpers\ArrayHelper; |
13 | 16 | use yii\web\Controller; |
... | ... | @@ -15,12 +18,78 @@ |
15 | 18 | class PriceController extends Controller |
16 | 19 | { |
17 | 20 | public function actionIndex($service_id = null){ |
18 | - | |
21 | + | |
22 | + if (\Yii::$app->request->post()){ | |
23 | + $price = \Yii::$app->request->post('Price'); | |
24 | + $price_lang = \Yii::$app->request->post('PriceLang'); | |
25 | + $transaction = \Yii::$app->db->beginTransaction(); | |
26 | + try { | |
27 | + Price::deleteAll(['service_id' => $service_id]); | |
28 | + foreach ($price as $key => $value){ | |
29 | + $model = new Price(); | |
30 | + $model->load($value, ''); | |
31 | + $model->id = $key; | |
32 | + if ($model->save()){ | |
33 | + $languages = []; | |
34 | + foreach ($price_lang[$key] as $k => $item){ | |
35 | + $languages[] = [ | |
36 | + 'language_id' => $k, | |
37 | + 'price_id' => $model->id, | |
38 | + 'title' => $item['title'] | |
39 | + ]; | |
40 | + } | |
41 | + \Yii::$app->db->createCommand() | |
42 | + ->batchInsert( | |
43 | + 'price_lang', | |
44 | + [ | |
45 | + 'language_id', | |
46 | + 'price_id', | |
47 | + 'title', | |
48 | + ], | |
49 | + $languages | |
50 | + ) | |
51 | + ->execute(); | |
52 | + }else{ | |
53 | + continue; | |
54 | + } | |
55 | + } | |
56 | + $transaction->commit(); | |
57 | + | |
58 | + } catch (\Exception $e) { | |
59 | + $transaction->rollBack(); | |
60 | + throw $e; | |
61 | + | |
62 | + } catch (\Throwable $e) { | |
63 | + $transaction->rollBack(); | |
64 | + return false; | |
65 | + } | |
66 | + | |
67 | + } | |
19 | 68 | $services = Service::find()->where(['is not','parent_id', null])->with('language')->all(); |
69 | + $lastId = Price::find()->max('id'); | |
70 | + $prices = Price::find()->where(['service_id' => $service_id])->with('languages')->all(); | |
20 | 71 | $data = ArrayHelper::map($services, 'id', 'title'); |
72 | + | |
21 | 73 | return $this->render('index',[ |
22 | 74 | 'services' => $data, |
23 | - 'service_id' => $service_id | |
75 | + 'service_id' => $service_id, | |
76 | + 'lastId' => $lastId, | |
77 | + 'prices' => $prices | |
24 | 78 | ]); |
79 | + | |
80 | + } | |
81 | + | |
82 | + public function actionNewPrice($lastId, $service_id = null){ | |
83 | + $languages = Language::getActive(); | |
84 | + $price = New Price(); | |
85 | + $price->service_id = $service_id; | |
86 | + $price_lang = new PriceLang(); | |
87 | + return $this->renderPartial('_add_price',[ | |
88 | + 'lastId' => $lastId, | |
89 | + 'price' => $price, | |
90 | + 'price_lang' => $price_lang, | |
91 | + 'service_id' => $service_id, | |
92 | + 'languages' => $languages | |
93 | + ]); | |
25 | 94 | } |
26 | 95 | } |
27 | 96 | \ No newline at end of file | ... | ... |
backend/views/layouts/main.php
... | ... | @@ -9,6 +9,7 @@ |
9 | 9 | use artbox\core\models\User; |
10 | 10 | use artbox\core\widgets\FeedbackWidget; |
11 | 11 | use artbox\core\widgets\FlashWidget; |
12 | + use backend\assets\AppAsset; | |
12 | 13 | use yii\bootstrap\Html; |
13 | 14 | use yii\helpers\Url; |
14 | 15 | use yii\web\View; |
... | ... | @@ -16,7 +17,7 @@ |
16 | 17 | use yiister\gentelella\widgets\Menu; |
17 | 18 | |
18 | 19 | ArtboxCoreAsset::register($this); |
19 | -// AppAsset::register($this); | |
20 | + AppAsset::register($this); | |
20 | 21 | |
21 | 22 | /** |
22 | 23 | * @var User $user | ... | ... |
1 | +<?php | |
2 | + /** | |
3 | + * @var \common\models\PriceLang $price_lang; | |
4 | + * @var \common\models\Price $price | |
5 | + * @var integer $lastId; | |
6 | + * @var integer $service_id | |
7 | + * @var array $languages | |
8 | + */ | |
9 | + use yii\widgets\ActiveForm; | |
10 | + | |
11 | + $form = new ActiveForm(); | |
12 | + ?> | |
13 | +<div class="form-group-33-wr"> | |
14 | +<div class="form-group-33"> | |
15 | + <?php echo $form->field($price, '['.$lastId.']service_id')->hiddenInput()->label(false)?> | |
16 | + <?php echo $form->field($price, '['.$lastId.']price')?> | |
17 | + <?php | |
18 | + foreach ($languages as $key => $value){ | |
19 | + echo $form->field($price_lang, '['.$lastId.']['.$key.']title')->label('ะะฐะทะฒะฐะฝะธะต '.$value['url']); | |
20 | + } | |
21 | + ?> | |
22 | + <a class="delete-variant delete-url remove-img-2 btn-danger btn" href="#"></a> | |
23 | +</div> | |
24 | +</div> | ... | ... |
backend/views/price/index.php
1 | 1 | <?php |
2 | 2 | /** |
3 | - * @var array $services | |
3 | + * @var array $services | |
4 | 4 | * @var integer $service_id |
5 | + * @var integer $lastId | |
6 | + * @var \common\models\Price[] $prices; | |
5 | 7 | */ |
6 | 8 | |
7 | 9 | use artbox\core\admin\assets\Select2; |
8 | 10 | use yii\helpers\Html; |
9 | 11 | use yii\web\View; |
10 | 12 | use yii\widgets\ActiveForm; |
11 | - | |
12 | - ActiveForm::begin(['method' => 'GET', 'action' => [ 'price/index' ],]); | |
13 | - echo Html::dropDownList( | |
14 | - 'service_id',$service_id, $services, [ | |
15 | - 'prompt' => \Yii::t('core', '- All -'), | |
16 | - 'id' => 'service_id' | |
17 | - ] | |
13 | + use yiister\gentelella\widgets\Panel; | |
14 | + | |
15 | +?> | |
16 | +<div class='adm-index'> | |
17 | + <?php | |
18 | + $panel = Panel::begin( | |
19 | + [ | |
20 | + 'header' => $this->title, | |
21 | + 'options' => [ | |
22 | + 'class' => 'x_panel feedback-update', | |
23 | + ], | |
24 | + ] | |
25 | + ); | |
26 | + ?> | |
27 | + <div class='form-admin-sort-wr'> | |
28 | + <div class='form-admin-sort'> | |
29 | + <?php ActiveForm::begin( | |
30 | + [ | |
31 | + 'method' => 'GET', | |
32 | + 'action' => [ 'price/index' ], | |
33 | + ] | |
34 | + ) ?> | |
35 | + <div class='form-group'> | |
36 | + <?php echo Html::label('ะฃัะปัะณะฐ'); | |
37 | + echo Html::dropDownList( | |
38 | + 'service_id', | |
39 | + $service_id, | |
40 | + $services, | |
41 | + [ | |
42 | + 'prompt' => \Yii::t('core', '- All -'), | |
43 | + 'id' => 'service_id', | |
44 | + 'class' => 'form-control', | |
45 | + ] | |
18 | 46 | ); |
19 | - echo Html::submitButton('Select'); | |
20 | - ActiveForm::end(); | |
21 | - Select2::register($this); | |
22 | - | |
23 | - $js = <<<JS | |
47 | + ?> | |
48 | + </div> | |
49 | + <div class='form-search-btn-wr'> | |
50 | + <?php echo Html::submitButton( | |
51 | + 'Select', | |
52 | + [ | |
53 | + 'class' => 'btn btn-success', | |
54 | + ] | |
55 | + ); | |
56 | + ?> | |
57 | + </div> | |
58 | + <?php ActiveForm::end(); ?> | |
59 | + </div> | |
60 | + </div> | |
61 | + <?php | |
62 | + Select2::register($this); | |
63 | + | |
64 | + $js = <<<JS | |
24 | 65 | $('#service_id').select2(); |
25 | 66 | JS; |
26 | - $this->registerJs($js, View::POS_READY); | |
27 | 67 | \ No newline at end of file |
68 | + $this->registerJs($js, View::POS_READY); | |
69 | + $panel::end(); | |
70 | + ?> | |
71 | +</div> | |
72 | + | |
73 | +<?php | |
74 | + $panel = Panel::begin( | |
75 | + [ | |
76 | + 'header' => $this->title, | |
77 | + 'options' => [ | |
78 | + 'class' => 'x_panel feedback-update', | |
79 | + ], | |
80 | + ] | |
81 | + ); | |
82 | + $form = ActiveForm::begin( | |
83 | + [ | |
84 | + 'method' => 'POST', | |
85 | + 'action' => [ 'price/index', 'service_id' => $service_id ], | |
86 | + ] | |
87 | +) ?> | |
88 | +<?php if (!empty($prices)){ | |
89 | + foreach ($prices as $price){?> | |
90 | +<div class="form-group-33-wr"> | |
91 | + <div class="form-group-33"> | |
92 | + <?php echo $form->field($price, '['.$price->id.']service_id')->hiddenInput()->label(false)?> | |
93 | + <?php echo $form->field($price, '['.$price->id.']price')?> | |
94 | + <?php | |
95 | + foreach ($price->languages as $key => $value){ | |
96 | + echo $form->field($value, '['.$price->id.']['.$value->language_id.']title')->label('ะะฐะทะฒะฐะฝะธะต '.$value->language->url); | |
97 | + } | |
98 | + ?> | |
99 | + </div> | |
100 | +</div> | |
101 | +<?php } | |
102 | + }?> | |
103 | +<div class="form-group-33-wr"> | |
104 | + <div class="form-group-33" style="height: 292px"> | |
105 | + <a href="#" data-last="<?=(!empty($lastId) ? $lastId : 0)?>" data-service="<?=$service_id?>" id="add-price" class="add-url-pluse btn btn-success add-gallery-btn-new"><i class="fa fa-plus"></i></a> | |
106 | + </div> | |
107 | +</div> | |
108 | +<div class="style buttons-page-wr"> | |
109 | + <?= Html::submitButton( | |
110 | + 'Save', ['class' => 'btn btn-success',] | |
111 | + ) ?> | |
112 | +</div> | |
113 | + | |
114 | +<?php | |
115 | + ActiveForm::end(); | |
116 | + $panel::end()?> | ... | ... |
1 | +$(document).on('click', '#add-price', function(e) { | |
2 | + e.preventDefault(); | |
3 | + var button = $(this); | |
4 | + var lastId = parseInt(button.data('last'))+1; | |
5 | + var serviceId = button.data('service'); | |
6 | + | |
7 | + $.ajax({ | |
8 | + url: '/admin/price/new-price', | |
9 | + type: "GET", | |
10 | + data: { | |
11 | + lastId: lastId, | |
12 | + service_id: serviceId | |
13 | + }, | |
14 | + success: function(data) { | |
15 | + console.log(lastId); | |
16 | + console.log( button.data('last', lastId)); | |
17 | + lastId = button.attr('data-last', lastId); | |
18 | + button.parent().parent().before(data); | |
19 | + | |
20 | + }, | |
21 | + error: function(data) { | |
22 | + } | |
23 | + }); | |
24 | +}); | ... | ... |
common/models/Price.php
... | ... | @@ -2,7 +2,11 @@ |
2 | 2 | |
3 | 3 | namespace common\models; |
4 | 4 | |
5 | +use artbox\core\models\Language; | |
5 | 6 | use Yii; |
7 | +use yii\db\ActiveQuery; | |
8 | +use yii2tech\ar\position\PositionBehavior; | |
9 | +use yii2tech\ar\variation\VariationBehavior; | |
6 | 10 | |
7 | 11 | /** |
8 | 12 | * This is the model class for table "price". |
... | ... | @@ -15,7 +19,9 @@ use Yii; |
15 | 19 | * |
16 | 20 | * @property Service $service |
17 | 21 | * @property PriceLang[] $priceLangs |
18 | - * @property Language[] $languages | |
22 | + * @property \artbox\core\models\Language[] $languages | |
23 | + * * from VariationBehavior | |
24 | + * @method ActiveQuery hasDefaultVariationRelation(); | |
19 | 25 | */ |
20 | 26 | class Price extends \yii\db\ActiveRecord |
21 | 27 | { |
... | ... | @@ -26,6 +32,32 @@ class Price extends \yii\db\ActiveRecord |
26 | 32 | { |
27 | 33 | return 'price'; |
28 | 34 | } |
35 | + public function behaviors() | |
36 | + { | |
37 | + return [ | |
38 | + 'translations' => [ | |
39 | + 'class' => VariationBehavior::className(), | |
40 | + 'variationsRelation' => 'languages', | |
41 | + 'defaultVariationRelation' => 'language', | |
42 | + 'variationOptionReferenceAttribute' => 'language_id', | |
43 | + 'optionModelClass' => Language::className(), | |
44 | + 'defaultVariationOptionReference' => function () { | |
45 | + return Language::getCurrent()->id; | |
46 | + }, | |
47 | + 'optionQueryFilter' => function (ActiveQuery $query) { | |
48 | + $query->where( | |
49 | + [ | |
50 | + 'status' => true, | |
51 | + ] | |
52 | + ); | |
53 | + }, | |
54 | + ], | |
55 | + 'positionBehavior' => [ | |
56 | + 'class' => PositionBehavior::className(), | |
57 | + 'positionAttribute' => 'sort', | |
58 | + ], | |
59 | + ]; | |
60 | + } | |
29 | 61 | |
30 | 62 | /** |
31 | 63 | * {@inheritdoc} |
... | ... | @@ -64,16 +96,12 @@ class Price extends \yii\db\ActiveRecord |
64 | 96 | /** |
65 | 97 | * @return \yii\db\ActiveQuery |
66 | 98 | */ |
67 | - public function getPriceLangs() | |
99 | + public function getLanguages() | |
68 | 100 | { |
69 | 101 | return $this->hasMany(PriceLang::className(), ['price_id' => 'id']); |
70 | 102 | } |
71 | - | |
72 | - /** | |
73 | - * @return \yii\db\ActiveQuery | |
74 | - */ | |
75 | - public function getLanguages() | |
76 | - { | |
77 | - return $this->hasMany(Language::className(), ['id' => 'language_id'])->viaTable('price_lang', ['price_id' => 'id']); | |
103 | + | |
104 | + public function getLanguage(){ | |
105 | + return $this->hasDefaultVariationRelation(); | |
78 | 106 | } |
79 | 107 | } | ... | ... |
1 | +<?php | |
2 | + | |
3 | +namespace common\models; | |
4 | + | |
5 | +use artbox\core\models\Language; | |
6 | +use Yii; | |
7 | + | |
8 | +/** | |
9 | + * This is the model class for table "price_lang". | |
10 | + * | |
11 | + * @property int $language_id | |
12 | + * @property int $price_id | |
13 | + * @property string $title | |
14 | + * @property string $description | |
15 | + * | |
16 | + * @property Language $language | |
17 | + * @property Price $price | |
18 | + */ | |
19 | +class PriceLang extends \yii\db\ActiveRecord | |
20 | +{ | |
21 | + /** | |
22 | + * {@inheritdoc} | |
23 | + */ | |
24 | + public static function tableName() | |
25 | + { | |
26 | + return 'price_lang'; | |
27 | + } | |
28 | + | |
29 | + /** | |
30 | + * {@inheritdoc} | |
31 | + */ | |
32 | + public function rules() | |
33 | + { | |
34 | + return [ | |
35 | + [['language_id', 'price_id'], 'required'], | |
36 | + [['language_id', 'price_id'], 'default', 'value' => null], | |
37 | + [['language_id', 'price_id'], 'integer'], | |
38 | + [['description'], 'string'], | |
39 | + [['title'], 'string', 'max' => 255], | |
40 | + [['language_id', 'price_id'], 'unique', 'targetAttribute' => ['language_id', 'price_id']], | |
41 | + [['language_id'], 'exist', 'skipOnError' => true, 'targetClass' => Language::className(), 'targetAttribute' => ['language_id' => 'id']], | |
42 | + [['price_id'], 'exist', 'skipOnError' => true, 'targetClass' => Price::className(), 'targetAttribute' => ['price_id' => 'id']], | |
43 | + ]; | |
44 | + } | |
45 | + | |
46 | + /** | |
47 | + * {@inheritdoc} | |
48 | + */ | |
49 | + public function attributeLabels() | |
50 | + { | |
51 | + return [ | |
52 | + 'language_id' => Yii::t('app', 'Language ID'), | |
53 | + 'price_id' => Yii::t('app', 'Price ID'), | |
54 | + 'title' => Yii::t('app', 'Title'), | |
55 | + 'description' => Yii::t('app', 'Description'), | |
56 | + ]; | |
57 | + } | |
58 | + | |
59 | + /** | |
60 | + * @return \yii\db\ActiveQuery | |
61 | + */ | |
62 | + public function getLanguage() | |
63 | + { | |
64 | + return $this->hasOne(Language::className(), ['id' => 'language_id']); | |
65 | + } | |
66 | + | |
67 | + /** | |
68 | + * @return \yii\db\ActiveQuery | |
69 | + */ | |
70 | + public function getPrice() | |
71 | + { | |
72 | + return $this->hasOne(Price::className(), ['id' => 'price_id']); | |
73 | + } | |
74 | +} | ... | ... |