Пример #1
0
 /**
  * Returns the variant attributes and updates the price list if necessary.
  *
  * @param \Aimeos\MShop\Order\Item\Base\Product\Iface $orderBaseProductItem Order product item
  * @param \Aimeos\MShop\Product\Item\Iface &$productItem Product item which is replaced if necessary
  * @param array &$prices List of product prices that will be updated if necessary
  * @param array $variantAttributeIds List of product variant attribute IDs
  * @param array $options Associative list of options
  * @return \Aimeos\MShop\Order\Item\Base\Product\Attribute\Iface[] List of order product attributes
  * @throws \Aimeos\Controller\Frontend\Basket\Exception If no product variant is found
  */
 protected function getVariantDetails(\Aimeos\MShop\Order\Item\Base\Product\Iface $orderBaseProductItem, \Aimeos\MShop\Product\Item\Iface &$productItem, array &$prices, array $variantAttributeIds, array $options)
 {
     $attr = array();
     $productItems = $this->getProductVariants($productItem, $variantAttributeIds);
     if (count($productItems) > 1) {
         $msg = sprintf('No unique article found for selected attributes and product ID "%1$s"', $productItem->getId());
         throw new \Aimeos\Controller\Frontend\Basket\Exception($msg);
     } else {
         if (($result = reset($productItems)) !== false) {
             $productItem = $result;
             $orderBaseProductItem->setProductCode($productItem->getCode());
             $subprices = $productItem->getRefItems('price', 'default', 'default');
             if (!empty($subprices)) {
                 $prices = $subprices;
             }
             $submedia = $productItem->getRefItems('media', 'default', 'default');
             if (($mediaItem = reset($submedia)) !== false) {
                 $orderBaseProductItem->setMediaUrl($mediaItem->getPreview());
             }
             $orderProductAttrManager = \Aimeos\MShop\Factory::createManager($this->getContext(), 'order/base/product/attribute');
             $variantAttributes = $productItem->getRefItems('attribute', null, 'variant');
             foreach ($this->getAttributes(array_keys($variantAttributes), array('text')) as $attrItem) {
                 $orderAttributeItem = $orderProductAttrManager->createItem();
                 $orderAttributeItem->copyFrom($attrItem);
                 $orderAttributeItem->setType('variant');
                 $attr[] = $orderAttributeItem;
             }
         } else {
             if (!isset($options['variant']) || $options['variant'] != false) {
                 $msg = sprintf('No article found for selected attributes and product ID "%1$s"', $productItem->getId());
                 throw new \Aimeos\Controller\Frontend\Basket\Exception($msg);
             }
         }
     }
     return $attr;
 }