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 | +} | ... | ... |