From 2b3158498c4a5e029650159473412701eb9eaa15 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 15 Nov 2016 11:53:47 +0200 Subject: [PATCH] -Product card (without video) --- CatalogUrlManager.php | 0 behaviors/DefaultVariantBehavior.php | 0 composer.json | 0 console/GenerateController.php | 0 controllers/ManageController.php | 6 ++++-- models/Product.php | 14 ++++++++++++-- models/ProductFrontendSearch.php | 0 models/ProductToRating.php | 0 models/ProductVariant.php | 49 ++++++++++++++++++++++++++++++++++++++++++------- models/ProductVideo.php | 69 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ models/StockLang.php | 0 models/TaxGroup.php | 3 +++ views/manage/_form.php | 89 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++---- views/manage/update.php | 34 ++++++++++++++++++++++------------ views/tax-group/_form.php | 43 ++++++++++++++++++++++++++++++++++--------- widgets/BasketHead.php | 0 widgets/BasketModal.php | 0 widgets/views/basket_head.php | 0 widgets/views/basket_modal.php | 0 19 files changed, 271 insertions(+), 36 deletions(-) mode change 100644 => 100755 CatalogUrlManager.php mode change 100644 => 100755 behaviors/DefaultVariantBehavior.php mode change 100644 => 100755 composer.json mode change 100644 => 100755 console/GenerateController.php mode change 100644 => 100755 models/ProductFrontendSearch.php mode change 100644 => 100755 models/ProductToRating.php create mode 100644 models/ProductVideo.php mode change 100644 => 100755 models/StockLang.php mode change 100644 => 100755 widgets/BasketHead.php mode change 100644 => 100755 widgets/BasketModal.php mode change 100644 => 100755 widgets/views/basket_head.php mode change 100644 => 100755 widgets/views/basket_modal.php diff --git a/CatalogUrlManager.php b/CatalogUrlManager.php old mode 100644 new mode 100755 index c9161a4..c9161a4 --- a/CatalogUrlManager.php +++ b/CatalogUrlManager.php diff --git a/behaviors/DefaultVariantBehavior.php b/behaviors/DefaultVariantBehavior.php old mode 100644 new mode 100755 index c52d641..c52d641 --- a/behaviors/DefaultVariantBehavior.php +++ b/behaviors/DefaultVariantBehavior.php diff --git a/composer.json b/composer.json old mode 100644 new mode 100755 index 965ed36..965ed36 --- a/composer.json +++ b/composer.json diff --git a/console/GenerateController.php b/console/GenerateController.php old mode 100644 new mode 100755 index c36f8e8..c36f8e8 --- a/console/GenerateController.php +++ b/console/GenerateController.php diff --git a/controllers/ManageController.php b/controllers/ManageController.php index b3b13e4..7b89685 100755 --- a/controllers/ManageController.php +++ b/controllers/ManageController.php @@ -2,6 +2,7 @@ namespace artweb\artbox\ecommerce\controllers; + use artweb\artbox\ecommerce\models\ProductVideo; use artweb\artbox\language\models\Language; use artweb\artbox\ecommerce\models\Export; use artweb\artbox\ecommerce\models\Import; @@ -147,6 +148,7 @@ 'model' => $model, 'modelLangs' => $model->modelLangs, 'groups' => $groups, + 'videos' => !empty( $model->videos ) ? $model->videos : [ new ProductVideo() ], ] ); } @@ -354,7 +356,7 @@ throw new \HttpRequestException('Must be AJAX'); } } - + /** * Perform export * @@ -397,7 +399,7 @@ if (( $model = Product::find() ->where([ 'id' => $id ]) ->with('lang') - ->one() ) !== null + ->one() ) !== NULL ) { return $model; } else { diff --git a/models/Product.php b/models/Product.php index 3e7ddd1..0325c6f 100755 --- a/models/Product.php +++ b/models/Product.php @@ -21,6 +21,7 @@ * * @property integer $brand_id * @property integer $id + * @property ProductVideo[] $videos * @property Category $category * @property Category[] $categories * @property ProductVariant $variant @@ -340,8 +341,12 @@ public function getFullName():string { $name = ''; - if (!empty($this->category->lang->category_synonym)) $name = $name . $this->category->lang->category_synonym . ' '; - if (!empty($this->brand)) $name = $name . $this->brand->lang->title . ' '; + if (!empty( $this->category->lang->category_synonym )) { + $name = $name . $this->category->lang->category_synonym . ' '; + } + if (!empty( $this->brand )) { + $name = $name . $this->brand->lang->title . ' '; + } $name .= $this->lang->title; return $name; } @@ -455,6 +460,11 @@ return $groups; } + public function getVideos() + { + return $this->hasMany(ProductVideo::className(), [ 'product_id' => 'id' ]); + } + /** * Get Stock query where current Product is in stock * diff --git a/models/ProductFrontendSearch.php b/models/ProductFrontendSearch.php old mode 100644 new mode 100755 index 0f0258e..0f0258e --- a/models/ProductFrontendSearch.php +++ b/models/ProductFrontendSearch.php diff --git a/models/ProductToRating.php b/models/ProductToRating.php old mode 100644 new mode 100755 index 820cfcb..820cfcb --- a/models/ProductToRating.php +++ b/models/ProductToRating.php diff --git a/models/ProductVariant.php b/models/ProductVariant.php index 1e5731a..6e3f409 100755 --- a/models/ProductVariant.php +++ b/models/ProductVariant.php @@ -67,6 +67,10 @@ */ class ProductVariant extends ActiveRecord { + + public $customOption = []; + + /** * @var int[] $options */ @@ -113,7 +117,7 @@ 'model' => ProductImage::className(), 'config' => [ 'caption' => 'image', - 'delete_action' => '/product/variant/delete-image', + 'delete_action' => 'variant/delete-image', 'id' => 'id', ], ], @@ -275,6 +279,28 @@ return $this->hasMany(TaxOption::className(), [ 'id' => 'option_id' ]) ->viaTable('product_variant_option', [ 'product_variant_id' => 'id' ]); } + + /** + * Get one variant's option whith needed conditions, or random if condition is empty + * + * @param array $conditions + * + * @return ActiveQuery + */ + public function getOption(array $conditions = []) + { + $query = $this->hasOne(TaxOption::className(), [ 'id' => 'option_id' ]) + ->viaTable('product_variant_option', [ 'product_variant_id' => 'id' ]); + foreach ($conditions as $condition) + { + if (!empty($condition) && is_array($condition)) + { + $query->andFilterWhere($condition); + } + } + + return $query; + } /** * Get TaxOptions with preloaded TaxGroups for current ProductVariant @@ -307,13 +333,15 @@ { $this->options = $values; } - + /** * Get all TaxGroups for current ProductVariant filled with $customOptions that satisfy current ProductVariant * - * @return TaxGroup[] + * @param array $conditions + * + * @return \artweb\artbox\ecommerce\models\TaxGroup[] */ - public function getProperties() + public function getProperties(array $conditions = []) { $groups = $options = []; foreach ($this->getOptions() @@ -324,11 +352,18 @@ */ $options[ $option->tax_group_id ][] = $option; } - foreach (TaxGroup::find() + $query = TaxGroup::find() ->where([ 'tax_group.id' => array_keys($options) ]) ->orderBy([ 'sort' => SORT_ASC ]) - ->with('lang') - ->all() as $group) { + ->with('lang'); + + if (!empty($conditions)) { + foreach ($conditions as $condition) { + $query->andFilterWhere($condition); + } + } + foreach ( + $query->all() as $group) { /** * @var TaxGroup $group */ diff --git a/models/ProductVideo.php b/models/ProductVideo.php new file mode 100644 index 0000000..f13fb22 --- /dev/null +++ b/models/ProductVideo.php @@ -0,0 +1,69 @@ + 255, + ], + [ + [ 'product_id' ], + 'exist', + 'skipOnError' => true, + 'targetClass' => Product::className(), + 'targetAttribute' => [ 'product_id' => 'id' ], + ], + ]; + } + + /** + * @inheritdoc + */ + public function attributeLabels() + { + return [ + 'id' => \Yii::t('app', 'ID'), + 'product_id' => \Yii::t('app', 'Product ID'), + 'url' => \Yii::t('app', 'Url'), + ]; + } + + /** + * @return \yii\db\ActiveQuery + */ + public function getProduct() + { + return $this->hasOne(Product::className(), [ 'id' => 'product_id' ]); + } + } diff --git a/models/StockLang.php b/models/StockLang.php old mode 100644 new mode 100755 index 4d86f5a..4d86f5a --- a/models/StockLang.php +++ b/models/StockLang.php diff --git a/models/TaxGroup.php b/models/TaxGroup.php index 575494b..ca4a5d3 100755 --- a/models/TaxGroup.php +++ b/models/TaxGroup.php @@ -24,6 +24,7 @@ * @property TaxOption[] $options * @property TaxOption[] $customOptions * @property string $alias + * @property integer $position * * From language behavior * * @property TaxGroupLang $lang * @property TaxGroupLang[] $langs @@ -94,6 +95,7 @@ [ 'level', 'sort', + 'position', ], 'integer', ], @@ -116,6 +118,7 @@ 'display' => 'Display', 'is_menu' => 'Отображать в меню', 'level' => 'уровень', + 'ppsition' => 'Позиция', ]; } diff --git a/views/manage/_form.php b/views/manage/_form.php index 535a184..d9b708a 100755 --- a/views/manage/_form.php +++ b/views/manage/_form.php @@ -1,9 +1,11 @@ registerJs($js, View::POS_END); ?>
@@ -39,6 +58,68 @@ field($model, 'video') ->textarea(); ?> + 'dynamicform_wrapper', + // required: only alphanumeric characters plus "_" [A-Za-z0-9_] + 'widgetBody' => '.container-items', + // required: css class selector + 'widgetItem' => '.item', + // required: css class + 'limit' => 10, + // the maximum times, an element can be added (default 999) + 'min' => 1, + // 0 or 1 (default 1) + 'insertButton' => '.add-item', + // css class + 'deleteButton' => '.remove-item', + // css class + 'model' => $videos[ 0 ], + 'formId' => 'dynamic-form', + 'formFields' => [ + 'url', + ], + ] + ); ?> + +
+
+

+ Склады + +

+
+
+
+ $video) { ?> +
+
+isNewRecord) { +// echo Html::activeHiddenInput($stock, "[{$i}]stock_id"); +// } +// ?> +
+
+ field($video, "[{$i}]url") + ->textInput([ 'maxlength' => true ]) ?> +
+
+ +
+
+
+
+ +
+
+
+ + field($model, 'brand_id') ->dropDownList( ArrayHelper::map( diff --git a/views/manage/update.php b/views/manage/update.php index b4c5f9d..ca2f311 100755 --- a/views/manage/update.php +++ b/views/manage/update.php @@ -2,20 +2,26 @@ use artweb\artbox\ecommerce\models\Product; use artweb\artbox\ecommerce\models\ProductLang; + use artweb\artbox\ecommerce\models\ProductVideo; use yii\db\ActiveQuery; use yii\helpers\Html; use yii\web\View; /** - * @var View $this - * @var Product $model - * @var ProductLang[] $modelLangs - * @var ActiveQuery $groups + * @var View $this + * @var Product $model + * @var ProductLang[] $modelLangs + * @var ActiveQuery $groups + * @var ProductVideo[] $videos */ - $this->title = Yii::t('product', 'Update {modelClass}: ', [ - 'modelClass' => 'Product', - ]) . ' ' . $model->lang->title; + $this->title = Yii::t( + 'product', + 'Update {modelClass}: ', + [ + 'modelClass' => 'Product', + ] + ) . ' ' . $model->lang->title; $this->params[ 'breadcrumbs' ][] = [ 'label' => Yii::t('product', 'Products'), 'url' => [ 'index' ], @@ -33,10 +39,14 @@

title) ?>

- render('_form', [ - 'model' => $model, - 'modelLangs' => $modelLangs, - 'groups' => $groups, - ]) ?> + render( + '_form', + [ + 'model' => $model, + 'modelLangs' => $modelLangs, + 'groups' => $groups, + 'videos' => $videos, + ] + ) ?>
diff --git a/views/tax-group/_form.php b/views/tax-group/_form.php index 9931a01..c7e2b8c 100755 --- a/views/tax-group/_form.php +++ b/views/tax-group/_form.php @@ -3,6 +3,7 @@ use artweb\artbox\language\widgets\LanguageForm; use artweb\artbox\ecommerce\models\TaxGroup; use artweb\artbox\ecommerce\models\TaxGroupLang; + use kartik\select2\Select2; use yii\helpers\Html; use yii\web\View; use yii\widgets\ActiveForm; @@ -22,11 +23,30 @@ [ 'enctype' => 'multipart/form-data' ] ]); ?> field($model, 'categories') - ->dropDownList(ArtboxTreeHelper::treeMap(ProductHelper::getCategories(), 'id', 'lang.title'), [ - 'multiple' => true, - ]) + ->dropDownList( + ArtboxTreeHelper::treeMap(ProductHelper::getCategories(), 'id', 'lang.title'), + [ + 'multiple' => true, + ] + ) ->label('Use in the following categories') ?> + field($model, 'position') + ->widget( + Select2::className(), + [ + 'data' => [ + 0 => 'Не отображать', + 1 => 'Во вкладках', + 2 => 'В списке', + ], + 'options' => [ 'placeholder' => 'Положение в карточке товара' ], + 'pluginOptions' => [ + 'allowClear' => true, + ], + ] + ) ?> + field($model, 'is_filter') ->checkbox() ?> @@ -40,15 +60,20 @@ ->textInput() ?> $modelLangs, - 'formView' => '@artweb/artbox/ecommerce/views/tax-group/_form_language', - 'form' => $form, - ]); + echo LanguageForm::widget( + [ + 'modelLangs' => $modelLangs, + 'formView' => '@artweb/artbox/ecommerce/views/tax-group/_form_language', + 'form' => $form, + ] + ); ?>
- isNewRecord ? Yii::t('rubrication', 'Create') : Yii::t('rubrication', 'Update'), [ 'class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary' ]) ?> + isNewRecord ? Yii::t('rubrication', 'Create') : Yii::t('rubrication', 'Update'), + [ 'class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary' ] + ) ?>
diff --git a/widgets/BasketHead.php b/widgets/BasketHead.php old mode 100644 new mode 100755 index 95dbffc..95dbffc --- a/widgets/BasketHead.php +++ b/widgets/BasketHead.php diff --git a/widgets/BasketModal.php b/widgets/BasketModal.php old mode 100644 new mode 100755 index d9a7513..d9a7513 --- a/widgets/BasketModal.php +++ b/widgets/BasketModal.php diff --git a/widgets/views/basket_head.php b/widgets/views/basket_head.php old mode 100644 new mode 100755 index 6b6b021..6b6b021 --- a/widgets/views/basket_head.php +++ b/widgets/views/basket_head.php diff --git a/widgets/views/basket_modal.php b/widgets/views/basket_modal.php old mode 100644 new mode 100755 index 96265f0..96265f0 --- a/widgets/views/basket_modal.php +++ b/widgets/views/basket_modal.php -- libgit2 0.21.4