/vendor/magento/module-bundle/Block/Catalog/Product/View/Type/Bundle.php
PHP | 354 lines | 215 code | 39 blank | 100 comment | 15 complexity | c8a6b270127aacb602fe89299cd1ba24 MD5 | raw file
- <?php
- /**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Bundle\Block\Catalog\Product\View\Type;
- use Magento\Bundle\Model\Option;
- use Magento\Catalog\Model\Product;
- /**
- * Catalog bundle product info block
- *
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class Bundle extends \Magento\Catalog\Block\Product\View\AbstractView
- {
- /**
- * @var array
- */
- protected $options;
- /**
- * Catalog product
- *
- * @var \Magento\Catalog\Helper\Product
- */
- protected $catalogProduct;
- /**
- * @var \Magento\Bundle\Model\Product\PriceFactory
- */
- protected $productPriceFactory;
- /**
- * @var \Magento\Framework\Json\EncoderInterface
- */
- protected $jsonEncoder;
- /**
- * @var \Magento\Framework\Locale\FormatInterface
- */
- protected $localeFormat;
- /**
- * @var array
- */
- private $selectedOptions = [];
- /**
- * @param \Magento\Catalog\Block\Product\Context $context
- * @param \Magento\Framework\Stdlib\ArrayUtils $arrayUtils
- * @param \Magento\Catalog\Helper\Product $catalogProduct
- * @param \Magento\Bundle\Model\Product\PriceFactory $productPrice
- * @param \Magento\Framework\Json\EncoderInterface $jsonEncoder
- * @param \Magento\Framework\Locale\FormatInterface $localeFormat
- * @param array $data
- */
- public function __construct(
- \Magento\Catalog\Block\Product\Context $context,
- \Magento\Framework\Stdlib\ArrayUtils $arrayUtils,
- \Magento\Catalog\Helper\Product $catalogProduct,
- \Magento\Bundle\Model\Product\PriceFactory $productPrice,
- \Magento\Framework\Json\EncoderInterface $jsonEncoder,
- \Magento\Framework\Locale\FormatInterface $localeFormat,
- array $data = []
- ) {
- $this->catalogProduct = $catalogProduct;
- $this->productPriceFactory = $productPrice;
- $this->jsonEncoder = $jsonEncoder;
- $this->localeFormat = $localeFormat;
- parent::__construct(
- $context,
- $arrayUtils,
- $data
- );
- }
- /**
- * @return array
- */
- public function getOptions()
- {
- if (!$this->options) {
- $product = $this->getProduct();
- $typeInstance = $product->getTypeInstance();
- $typeInstance->setStoreFilter($product->getStoreId(), $product);
- $optionCollection = $typeInstance->getOptionsCollection($product);
- $selectionCollection = $typeInstance->getSelectionsCollection(
- $typeInstance->getOptionsIds($product),
- $product
- );
- $this->options = $optionCollection->appendSelections(
- $selectionCollection,
- false,
- $this->catalogProduct->getSkipSaleableCheck()
- );
- }
- return $this->options;
- }
- /**
- * @return bool
- */
- public function hasOptions()
- {
- $this->getOptions();
- if (empty($this->options) || !$this->getProduct()->isSalable()) {
- return false;
- }
- return true;
- }
- /**
- * Returns JSON encoded config to be used in JS scripts
- *
- * @return string
- *
- */
- public function getJsonConfig()
- {
- /** @var Option[] $optionsArray */
- $optionsArray = $this->getOptions();
- $options = [];
- $currentProduct = $this->getProduct();
- $defaultValues = [];
- $preConfiguredFlag = $currentProduct->hasPreconfiguredValues();
- /** @var \Magento\Framework\DataObject|null $preConfiguredValues */
- $preConfiguredValues = $preConfiguredFlag ? $currentProduct->getPreconfiguredValues() : null;
- $position = 0;
- foreach ($optionsArray as $optionItem) {
- /* @var $optionItem Option */
- if (!$optionItem->getSelections()) {
- continue;
- }
- $optionId = $optionItem->getId();
- $options[$optionId] = $this->getOptionItemData($optionItem, $currentProduct, $position);
- // Add attribute default value (if set)
- if ($preConfiguredFlag) {
- $configValue = $preConfiguredValues->getData('bundle_option/' . $optionId);
- if ($configValue) {
- $defaultValues[$optionId] = $configValue;
- }
- }
- $position++;
- }
- $config = $this->getConfigData($currentProduct, $options);
- $configObj = new \Magento\Framework\DataObject(
- [
- 'config' => $config,
- ]
- );
- //pass the return array encapsulated in an object for the other modules to be able to alter it eg: weee
- $this->_eventManager->dispatch('catalog_product_option_price_configuration_after', ['configObj' => $configObj]);
- $config=$configObj->getConfig();
- if ($preConfiguredFlag && !empty($defaultValues)) {
- $config['defaultValues'] = $defaultValues;
- }
- return $this->jsonEncoder->encode($config);
- }
- /**
- * Get html for option
- *
- * @param Option $option
- * @return string
- */
- public function getOptionHtml(Option $option)
- {
- $optionBlock = $this->getChildBlock($option->getType());
- if (!$optionBlock) {
- return __('There is no defined renderer for "%1" option type.', $option->getType());
- }
- return $optionBlock->setOption($option)->toHtml();
- }
- /**
- * Get formed data from option selection item
- *
- * @param Product $product
- * @param Product $selection
- * @return array
- */
- private function getSelectionItemData(Product $product, Product $selection)
- {
- $qty = ($selection->getSelectionQty() * 1) ?: '1';
- $optionPriceAmount = $product->getPriceInfo()
- ->getPrice('bundle_option')
- ->getOptionSelectionAmount($selection);
- $finalPrice = $optionPriceAmount->getValue();
- $basePrice = $optionPriceAmount->getBaseAmount();
- $selection = [
- 'qty' => $qty,
- 'customQty' => $selection->getSelectionCanChangeQty(),
- 'optionId' => $selection->getId(),
- 'prices' => [
- 'oldPrice' => [
- 'amount' => $basePrice
- ],
- 'basePrice' => [
- 'amount' => $basePrice
- ],
- 'finalPrice' => [
- 'amount' => $finalPrice
- ]
- ],
- 'priceType' => $selection->getSelectionPriceType(),
- 'tierPrice' => $this->getTierPrices($product, $selection),
- 'name' => $selection->getName(),
- 'canApplyMsrp' => false
- ];
- return $selection;
- }
- /**
- * Get tier prices from option selection item
- *
- * @param Product $product
- * @param Product $selection
- * @return array
- */
- private function getTierPrices(Product $product, Product $selection)
- {
- // recalculate currency
- $tierPrices = $selection->getPriceInfo()
- ->getPrice(\Magento\Catalog\Pricing\Price\TierPrice::PRICE_CODE)
- ->getTierPriceList();
- foreach ($tierPrices as &$tierPriceInfo) {
- /** @var \Magento\Framework\Pricing\Amount\Base $price */
- $price = $tierPriceInfo['price'];
- $priceBaseAmount = $price->getBaseAmount();
- $priceValue = $price->getValue();
- $bundleProductPrice = $this->productPriceFactory->create();
- $priceBaseAmount = $bundleProductPrice->getLowestPrice($product, $priceBaseAmount);
- $priceValue = $bundleProductPrice->getLowestPrice($product, $priceValue);
- $tierPriceInfo['prices'] = [
- 'oldPrice' => [
- 'amount' => $priceBaseAmount
- ],
- 'basePrice' => [
- 'amount' => $priceBaseAmount
- ],
- 'finalPrice' => [
- 'amount' => $priceValue
- ]
- ];
- }
- return $tierPrices;
- }
- /**
- * Get formed data from selections of option
- *
- * @param Option $option
- * @param Product $product
- * @return array
- */
- private function getSelections(Option $option, Product $product)
- {
- $selections = [];
- $selectionCount = count($option->getSelections());
- foreach ($option->getSelections() as $selectionItem) {
- /* @var $selectionItem Product */
- $selectionId = $selectionItem->getSelectionId();
- $selections[$selectionId] = $this->getSelectionItemData($product, $selectionItem);
- if (($selectionItem->getIsDefault() || $selectionCount == 1 && $option->getRequired())
- && $selectionItem->isSalable()
- ) {
- $this->selectedOptions[$option->getId()][] = $selectionId;
- }
- }
- return $selections;
- }
- /**
- * Get formed data from option
- *
- * @param Option $option
- * @param Product $product
- * @param int $position
- * @return array
- */
- private function getOptionItemData(Option $option, Product $product, $position)
- {
- return [
- 'selections' => $this->getSelections($option, $product),
- 'title' => $option->getTitle(),
- 'isMulti' => in_array($option->getType(), ['multi', 'checkbox']),
- 'position' => $position
- ];
- }
- /**
- * Get formed config data from calculated options data
- *
- * @param Product $product
- * @param array $options
- * @return array
- */
- private function getConfigData(Product $product, array $options)
- {
- $isFixedPrice = $this->getProduct()->getPriceType() == \Magento\Bundle\Model\Product\Price::PRICE_TYPE_FIXED;
- $productAmount = $product
- ->getPriceInfo()
- ->getPrice(\Magento\Catalog\Pricing\Price\FinalPrice::PRICE_CODE)
- ->getPriceWithoutOption();
- $baseProductAmount = $product
- ->getPriceInfo()
- ->getPrice(\Magento\Catalog\Pricing\Price\RegularPrice::PRICE_CODE)
- ->getAmount();
- $config = [
- 'options' => $options,
- 'selected' => $this->selectedOptions,
- 'bundleId' => $product->getId(),
- 'priceFormat' => $this->localeFormat->getPriceFormat(),
- 'prices' => [
- 'oldPrice' => [
- 'amount' => $isFixedPrice ? $baseProductAmount->getValue() : 0
- ],
- 'basePrice' => [
- 'amount' => $isFixedPrice ? $productAmount->getBaseAmount() : 0
- ],
- 'finalPrice' => [
- 'amount' => $isFixedPrice ? $productAmount->getValue() : 0
- ]
- ],
- 'priceType' => $product->getPriceType(),
- 'isFixedPrice' => $isFixedPrice,
- ];
- return $config;
- }
- }