Commit b40c1cce3909c794ac79d6019b9a5ba375939fc3

Authored by Yarik
1 parent 2e22f66f

CommentBehavior

Showing 2 changed files with 128 additions and 68 deletions   Show diff stats
models/Product.php
... ... @@ -2,10 +2,11 @@
2 2  
3 3 namespace artweb\artbox\ecommerce\models;
4 4  
  5 + use artweb\artbox\comment\models\CommentModel;
  6 + use artweb\artbox\comment\models\interfaces\RatingCacheInterface;
5 7 use artweb\artbox\ecommerce\behaviors\DefaultVariantBehavior;
6 8 use artweb\artbox\behaviors\MultipleImgBehavior;
7 9 use artweb\artbox\behaviors\SaveMultipleFileBehavior;
8   -// use artweb\artbox\comment\models\CommentModel;
9 10 use artweb\artbox\language\behaviors\LanguageBehavior;
10 11 use Yii;
11 12 use yii\base\InvalidParamException;
... ... @@ -76,6 +77,22 @@
76 77 * @method array getImagesConfig()
77 78 * @method array getImagesHTML( string $preset )
78 79 * * End multipleImage behavior
  80 + * * From CommentBehavior **
  81 + * @property string $cacheModelName
  82 + * @property RatingCacheInterface $cacheModel
  83 + * @property boolean $cacheRating
  84 + * @property CommentModel[] $comments
  85 + * @property RatingCacheInterface $averageRating
  86 + * @method string getCacheModelName()
  87 + * @method void setCacheModelName( string $value )
  88 + * @method RatingCacheInterface getCacheModel()
  89 + * @method void setCacheModel( RatingCacheInterface $value )
  90 + * @method boolean getCacheRating()
  91 + * @method void setCacheRating( bool $value )
  92 + * @method ActiveQuery getComments()
  93 + * @method ActiveQuery getAverageRating()
  94 + * @method bool recalculateRating()
  95 + * * End CommentBehavior **
79 96 */
80 97 class Product extends ActiveRecord
81 98 {
... ... @@ -88,7 +105,7 @@
88 105 public function behaviors()
89 106 {
90 107 return [
91   - 'images' => [
  108 + 'images' => [
92 109 'class' => SaveMultipleFileBehavior::className(),
93 110 'name' => 'imagesUpload',
94 111 'directory' => 'products',
... ... @@ -98,7 +115,7 @@
98 115 ],
99 116 'model' => ProductImage::className(),
100 117 ],
101   - 'multipleImage' => [
  118 + 'multipleImage' => [
102 119 'class' => MultipleImgBehavior::className(),
103 120 'links' => [
104 121 'product_id' => 'id',
... ... @@ -113,10 +130,15 @@
113 130 'id' => 'id',
114 131 ],
115 132 ],
116   - 'language' => [
  133 + 'language' => [
117 134 'class' => LanguageBehavior::className(),
118 135 ],
119 136 'defaultVariant' => DefaultVariantBehavior::className(),
  137 + 'comment' => [
  138 + 'class' => 'artweb\artbox\comment\behaviors\CommentBehavior',
  139 + 'cacheRating' => true,
  140 + 'cacheModelName' => ProductToRating::className(),
  141 + ],
120 142 ];
121 143 }
122 144  
... ... @@ -490,70 +512,6 @@
490 512 }
491 513  
492 514 /**
493   - * Recalculate rating for artboxcomment module
494   - *
495   - * @todo Rewrite with behavior
496   - * @return bool
497   - */
498   -// public function recalculateRating():bool
499   -// {
500   -// /**
501   -// * @var ProductToRating $averageRating
502   -// */
503   -// $average = $this->getComments()
504   -// ->joinWith('rating')
505   -// ->select([ 'average' => 'avg(artbox_comment_rating.value)::float' ])
506   -// ->scalar();
507   -// if (!$average) {
508   -// $average = 0;
509   -// }
510   -// $averageRating = $this->averageRating;
511   -// if (!empty( $averageRating )) {
512   -// $averageRating->value = $average;
513   -// } else {
514   -// $averageRating = new ProductToRating(
515   -// [
516   -// 'product_id' => $this->id,
517   -// 'value' => $average,
518   -// ]
519   -// );
520   -// }
521   -// if ($averageRating->save()) {
522   -// return true;
523   -// } else {
524   -// return false;
525   -// }
526   -// }
527   -
528   - /**
529   - * Get CommmentModel query for artboxcomment module
530   - *
531   - * @todo Rewrite with behavior
532   - * @return ActiveQuery
533   - */
534   -// public function getComments()
535   -// {
536   -// return $this->hasMany(CommentModel::className(), [ 'entity_id' => 'id' ])
537   -// ->where(
538   -// [
539   -// 'artbox_comment.entity' => self::className(),
540   -// 'artbox_comment.status' => CommentModel::STATUS_ACTIVE,
541   -// 'artbox_comment.artbox_comment_pid' => null,
542   -// ]
543   -// );
544   -// }
545   -
546   - /**
547   - * Get ProductToRating query in order to get average rating for current Product
548   - *
549   - * @return \yii\db\ActiveQuery
550   - */
551   -// public function getAverageRating()
552   -// {
553   -// return $this->hasOne(ProductToRating::className(), [ 'product_id' => 'id' ]);
554   -// }
555   -
556   - /**
557 515 * Get TaxGroupToCategories query via product_category table
558 516 *
559 517 * @return ActiveQuery
... ...
models/ProductToRating.php 0 โ†’ 100644
  1 +<?php
  2 +
  3 + namespace artweb\artbox\ecommerce\models;
  4 +
  5 + use artweb\artbox\comment\models\interfaces\RatingCacheInterface;
  6 + use Yii;
  7 + use yii\db\ActiveRecord;
  8 +
  9 + /**
  10 + * This is the model class for table "product_to_rating".
  11 + *
  12 + * @property integer $id
  13 + * @property integer $product_id
  14 + * @property double $value
  15 + * @property Product $product
  16 + */
  17 + class ProductToRating extends ActiveRecord implements RatingCacheInterface
  18 + {
  19 + /**
  20 + * @inheritdoc
  21 + */
  22 + public static function tableName()
  23 + {
  24 + return 'product_to_rating';
  25 + }
  26 +
  27 + /**
  28 + * @inheritdoc
  29 + */
  30 + public function rules()
  31 + {
  32 + return [
  33 + [
  34 + [ 'product_id' ],
  35 + 'required',
  36 + ],
  37 + [
  38 + [ 'product_id' ],
  39 + 'integer',
  40 + ],
  41 + [
  42 + [ 'value' ],
  43 + 'number',
  44 + ],
  45 + [
  46 + [ 'product_id' ],
  47 + 'unique',
  48 + ],
  49 + [
  50 + [ 'product_id' ],
  51 + 'exist',
  52 + 'skipOnError' => true,
  53 + 'targetClass' => Product::className(),
  54 + 'targetAttribute' => [ 'product_id' => 'id' ],
  55 + ],
  56 + ];
  57 + }
  58 +
  59 + /**
  60 + * @inheritdoc
  61 + */
  62 + public function attributeLabels()
  63 + {
  64 + return [
  65 + 'id' => Yii::t('app', 'ID'),
  66 + 'product_id' => Yii::t('app', 'Product ID'),
  67 + 'value' => Yii::t('app', 'Value'),
  68 + ];
  69 + }
  70 +
  71 + /**
  72 + * @return \yii\db\ActiveQuery
  73 + */
  74 + public function getProduct()
  75 + {
  76 + return $this->hasOne(Product::className(), [ 'id' => 'product_id' ]);
  77 + }
  78 +
  79 + /**
  80 + * @inheritdoc
  81 + */
  82 + public function getLinkAttribute(): string
  83 + {
  84 + return 'product_id';
  85 + }
  86 +
  87 + /**
  88 + * @inheritdoc
  89 + */
  90 + public function getValue(): float
  91 + {
  92 + return $this->value;
  93 + }
  94 +
  95 + /**
  96 + * @inheritdoc
  97 + */
  98 + public function setValue(float $value)
  99 + {
  100 + $this->value = $value;
  101 + }
  102 + }
... ...