123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173 |
- <?php
- /**
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Quote\Model\Quote\Address\Total;
- use Magento\Framework\Serialize\SerializerInterface;
- /**
- * Address Total Collector model
- */
- class Collector extends \Magento\Sales\Model\Config\Ordered
- {
- /**
- * Path to sort order values of checkout totals
- */
- const XML_PATH_SALES_TOTALS_SORT = 'sales/totals_sort';
- /**
- * Total models array ordered for right display sequence
- *
- * @var array
- */
- protected $_retrievers = [];
- /**
- * Corresponding store object
- *
- * @var \Magento\Store\Model\Store
- */
- protected $_store;
- /**
- * Config group for totals declaration
- *
- * @var string
- */
- protected $_configGroup = 'totals';
- /**
- * @var string
- */
- protected $_configSection = 'quote';
- /**
- * Cache key for collectors
- *
- * @var string
- */
- protected $_collectorsCacheKey = 'sorted_quote_collectors';
- /**
- * Core store config
- *
- * @var \Magento\Framework\App\Config\ScopeConfigInterface
- */
- protected $_scopeConfig;
- /**
- * @var \Magento\Quote\Model\Quote\Address\TotalFactory
- */
- protected $_totalFactory;
- /**
- * @param \Magento\Framework\App\Cache\Type\Config $configCacheType
- * @param \Psr\Log\LoggerInterface $logger
- * @param \Magento\Sales\Model\Config $salesConfig
- * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
- * @param \Magento\Store\Model\StoreManagerInterface $storeManager
- * @param \Magento\Quote\Model\Quote\Address\TotalFactory $totalFactory
- * @param \Magento\Framework\Simplexml\Element|mixed $sourceData
- * @param mixed $store
- * @param SerializerInterface $serializer
- */
- public function __construct(
- \Magento\Framework\App\Cache\Type\Config $configCacheType,
- \Psr\Log\LoggerInterface $logger,
- \Magento\Sales\Model\Config $salesConfig,
- \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig,
- \Magento\Store\Model\StoreManagerInterface $storeManager,
- \Magento\Quote\Model\Quote\Address\TotalFactory $totalFactory,
- $sourceData = null,
- $store = null,
- SerializerInterface $serializer = null
- ) {
- $this->_scopeConfig = $scopeConfig;
- $this->_totalFactory = $totalFactory;
- parent::__construct($configCacheType, $logger, $salesConfig, $sourceData, $serializer);
- $this->_store = $store ?: $storeManager->getStore();
- $this->_initModels()->_initCollectors()->_initRetrievers();
- }
- /**
- * Get total models array ordered for right calculation logic
- *
- * @return array
- */
- public function getCollectors()
- {
- return $this->_collectors;
- }
- /**
- * Get total models array ordered for right display sequence
- *
- * @return \Magento\Quote\Model\Quote\Address\Total\AbstractTotal[]
- */
- public function getRetrievers()
- {
- return $this->_retrievers;
- }
- /**
- * Init model class by configuration
- *
- * @param string $class
- * @param string $totalCode
- * @param array $totalConfig
- * @return \Magento\Quote\Model\Quote\Address\Total\AbstractTotal
- * @throws \Magento\Framework\Exception\LocalizedException
- */
- protected function _initModelInstance($class, $totalCode, $totalConfig)
- {
- $model = $this->_totalFactory->create($class);
- if (!$model instanceof \Magento\Quote\Model\Quote\Address\Total\AbstractTotal) {
- throw new \Magento\Framework\Exception\LocalizedException(
- __(
- 'The address total model should be extended from
- \Magento\Quote\Model\Quote\Address\Total\AbstractTotal.'
- )
- );
- }
- $model->setCode($totalCode);
- $this->_modelsConfig[$totalCode] = $this->_prepareConfigArray($totalCode, $totalConfig);
- $this->_modelsConfig[$totalCode] = $model->processConfigArray($this->_modelsConfig[$totalCode], $this->_store);
- return $model;
- }
- /**
- * Initialize retrievers array
- *
- * @return $this
- * @SuppressWarnings(PHPMD.UnusedPrivateMethod)
- */
- private function _initRetrievers()
- {
- $sorts = $this->_scopeConfig->getValue(
- self::XML_PATH_SALES_TOTALS_SORT,
- \Magento\Store\Model\ScopeInterface::SCOPE_STORE,
- $this->_store
- );
- foreach ($sorts as $code => $sortOrder) {
- if (isset($this->_models[$code])) {
- // Reserve enough space for collisions
- $retrieverId = 100 * (int)$sortOrder;
- // Check if there is a retriever with such id and find next available position if needed
- while (isset($this->_retrievers[$retrieverId])) {
- $retrieverId++;
- }
- $this->_retrievers[$retrieverId] = $this->_models[$code];
- }
- }
- ksort($this->_retrievers);
- $notSorted = array_diff(array_keys($this->_models), array_keys($sorts));
- foreach ($notSorted as $code) {
- $this->_retrievers[] = $this->_models[$code];
- }
- return $this;
- }
- }
|