/** * @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')); }
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(); }
/** * @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; }