Пример #1
0
 /**
  * @throws CHttpException
  */
 public function actionAdd()
 {
     if (!Yii::app()->getRequest()->getIsPostRequest()) {
         throw new CHttpException(404);
     }
     $product = Yii::app()->getRequest()->getPost('Product');
     if (empty($product['id'])) {
         throw new CHttpException(404);
     }
     $model = CartProduct::model()->findByPk((int) $product['id']);
     if (null === $model) {
         throw new CHttpException(404);
     }
     $variantsId = Yii::app()->getRequest()->getPost('ProductVariant', []);
     $variants = [];
     foreach ((array) $variantsId as $var) {
         if (!$var) {
             continue;
         }
         $variant = ProductVariant::model()->findByPk($var);
         if ($variant && $variant->product_id == $model->id) {
             $variants[] = $variant;
         }
     }
     $model->selectedVariants = $variants;
     $quantity = empty($product['quantity']) ? 1 : (int) $product['quantity'];
     Yii::app()->cart->put($model, $quantity);
     Yii::app()->ajax->success(Yii::t("CartModule.cart", 'Product successfully added to your basket'));
 }
Пример #2
0
 public function beforeSave()
 {
     if (Product::model()->exists('id = :product_id', [":product_id" => $this->product_id])) {
         $this->variant_ids = array_filter($this->variant_ids);
         // удаляем варианты, которые не были выбраны, старые не трогаем, чтобы оставить данные, на случай, если вариант был удален из системы
         foreach ($this->oldVariants as $key => $var) {
             if (!in_array($var['id'], $this->variant_ids)) {
                 unset($this->oldVariants[$key]);
             }
         }
         $oldVariantIds = array_map(function ($x) {
             return $x['id'];
         }, $this->oldVariants);
         $newVariants = [];
         foreach ($this->variant_ids as $varId) {
             if (!in_array($varId, $oldVariantIds)) {
                 /* @var $variant ProductVariant */
                 $variant = ProductVariant::model()->findByPk($varId);
                 if ($variant) {
                     // сохраняем информацию на случай удаления варианта из системы
                     $newVariants[] = array_merge($variant->attributes, ['attribute_name' => $variant->attribute->name, 'attribute_title' => $variant->attribute->title, 'optionValue' => $variant->getOptionValue()]);
                 }
             }
         }
         $combinedVariants = array_merge($this->oldVariants, $newVariants);
         $this->variants = serialize($combinedVariants);
     }
     return parent::beforeSave();
 }
Пример #3
0
 /**
  * @param array $variantsIds
  * @return float|mixed
  */
 public function getPrice(array $variantsIds = [])
 {
     $variants = [];
     if (!empty($variantsIds)) {
         $criteria = new CDbCriteria();
         $criteria->addInCondition("id", $variantsIds);
         $variants = ProductVariant::model()->findAll($criteria);
     } else {
         $variants = $this->selectedVariants;
     }
     $basePrice = $this->getResultPrice();
     /* выбираем вариант, который меняет базовую цену максимально */
     /* @var $variants ProductVariant[] */
     $hasBasePriceVariant = false;
     foreach ($variants as $variant) {
         if ($variant->type == ProductVariant::TYPE_BASE_PRICE) {
             if (!$hasBasePriceVariant) {
                 $hasBasePriceVariant = true;
                 $basePrice = $variant->amount;
             } else {
                 if ($basePrice < $variant->amount) {
                     $basePrice = $variant->amount;
                 }
             }
         }
     }
     $newPrice = $basePrice;
     foreach ($variants as $variant) {
         switch ($variant->type) {
             case ProductVariant::TYPE_SUM:
                 $newPrice += $variant->amount;
                 break;
             case ProductVariant::TYPE_PERCENT:
                 $newPrice += $basePrice * ($variant->amount / 100);
                 break;
         }
     }
     return $newPrice;
 }