![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-reports/Model/ResourceModel/Product/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Reports\Model\ResourceModel\Product; use Magento\Catalog\Model\ResourceModel\Product\Collection\ProductLimitationFactory; use Magento\Framework\DataObject; /** * Products Report collection. * * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.CookieAndSessionMisuse) * @api * @since 100.0.2 */ class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection { const SELECT_COUNT_SQL_TYPE_CART = 1; /** * Product entity identifier * * @var int */ protected $_productEntityId; /** * Product entity table name * * @var string */ protected $_productEntityTableName; /** * Product entity attribute set identifier * * @var int */ protected $_productEntityAttributeSetId; /** * Select count * * @var int */ protected $_selectCountSqlType = 0; /** * @var \Magento\Reports\Model\Event\TypeFactory */ protected $_eventTypeFactory; /** * @var \Magento\Catalog\Model\Product\Type */ protected $_productType; /** * @var \Magento\Quote\Model\ResourceModel\Quote\Collection */ protected $quoteResource; /** * @var DataObject */ private $_totals; /** * Collection constructor. * * @param \Magento\Framework\Data\Collection\EntityFactory $entityFactory * @param \Psr\Log\LoggerInterface $logger * @param \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy * @param \Magento\Framework\Event\ManagerInterface $eventManager * @param \Magento\Eav\Model\Config $eavConfig * @param \Magento\Framework\App\ResourceConnection $resource * @param \Magento\Eav\Model\EntityFactory $eavEntityFactory * @param \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper * @param \Magento\Framework\Validator\UniversalFactory $universalFactory * @param \Magento\Store\Model\StoreManagerInterface $storeManager * @param \Magento\Framework\Module\Manager $moduleManager * @param \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState * @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig * @param \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory * @param \Magento\Catalog\Model\ResourceModel\Url $catalogUrl * @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate * @param \Magento\Customer\Model\Session $customerSession * @param \Magento\Framework\Stdlib\DateTime $dateTime * @param \Magento\Customer\Api\GroupManagementInterface $groupManagement * @param \Magento\Catalog\Model\ResourceModel\Product $product * @param \Magento\Reports\Model\Event\TypeFactory $eventTypeFactory * @param \Magento\Catalog\Model\Product\Type $productType * @param \Magento\Quote\Model\ResourceModel\Quote\Collection $quoteResource * @param \Magento\Framework\DB\Adapter\AdapterInterface|null $connection * @param ProductLimitationFactory|null $productLimitationFactory * @param \Magento\Framework\EntityManager\MetadataPool|null $metadataPool * @param \Magento\Catalog\Model\Indexer\Category\Product\TableMaintainer|null $tableMaintainer * @param \Magento\Catalog\Model\Indexer\Product\Price\PriceTableResolver|null $priceTableResolver * @param \Magento\Framework\Indexer\DimensionFactory|null $dimensionFactory * * @throws \Magento\Framework\Exception\LocalizedException * @SuppressWarnings(PHPMD.ExcessiveParameterList) */ public function __construct( \Magento\Framework\Data\Collection\EntityFactory $entityFactory, \Psr\Log\LoggerInterface $logger, \Magento\Framework\Data\Collection\Db\FetchStrategyInterface $fetchStrategy, \Magento\Framework\Event\ManagerInterface $eventManager, \Magento\Eav\Model\Config $eavConfig, \Magento\Framework\App\ResourceConnection $resource, \Magento\Eav\Model\EntityFactory $eavEntityFactory, \Magento\Catalog\Model\ResourceModel\Helper $resourceHelper, \Magento\Framework\Validator\UniversalFactory $universalFactory, \Magento\Store\Model\StoreManagerInterface $storeManager, \Magento\Framework\Module\Manager $moduleManager, \Magento\Catalog\Model\Indexer\Product\Flat\State $catalogProductFlatState, \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig, \Magento\Catalog\Model\Product\OptionFactory $productOptionFactory, \Magento\Catalog\Model\ResourceModel\Url $catalogUrl, \Magento\Framework\Stdlib\DateTime\TimezoneInterface $localeDate, \Magento\Customer\Model\Session $customerSession, \Magento\Framework\Stdlib\DateTime $dateTime, \Magento\Customer\Api\GroupManagementInterface $groupManagement, \Magento\Catalog\Model\ResourceModel\Product $product, \Magento\Reports\Model\Event\TypeFactory $eventTypeFactory, \Magento\Catalog\Model\Product\Type $productType, \Magento\Quote\Model\ResourceModel\Quote\Collection $quoteResource, \Magento\Framework\DB\Adapter\AdapterInterface $connection = null, ProductLimitationFactory $productLimitationFactory = null, \Magento\Framework\EntityManager\MetadataPool $metadataPool = null, \Magento\Catalog\Model\Indexer\Category\Product\TableMaintainer $tableMaintainer = null, \Magento\Catalog\Model\Indexer\Product\Price\PriceTableResolver $priceTableResolver = null, \Magento\Framework\Indexer\DimensionFactory $dimensionFactory = null ) { $this->setProductEntityId($product->getEntityIdField()); $this->setProductEntityTableName($product->getEntityTable()); $this->setProductAttributeSetId($product->getEntityType()->getDefaultAttributeSetId()); parent::__construct( $entityFactory, $logger, $fetchStrategy, $eventManager, $eavConfig, $resource, $eavEntityFactory, $resourceHelper, $universalFactory, $storeManager, $moduleManager, $catalogProductFlatState, $scopeConfig, $productOptionFactory, $catalogUrl, $localeDate, $customerSession, $dateTime, $groupManagement, $connection, $productLimitationFactory, $metadataPool, $tableMaintainer, $priceTableResolver, $dimensionFactory ); $this->_eventTypeFactory = $eventTypeFactory; $this->_productType = $productType; $this->quoteResource = $quoteResource; } /** * Set Type for COUNT SQL Select. * * @codeCoverageIgnore * * @param int $type * @return $this */ public function setSelectCountSqlType($type) { $this->_selectCountSqlType = $type; return $this; } /** * Set product entity id. * * @codeCoverageIgnore * * @param string $entityId * @return $this */ public function setProductEntityId($entityId) { $this->_productEntityId = (int)$entityId; return $this; } /** * Get product entity id. * * @codeCoverageIgnore * * @return int */ public function getProductEntityId() { return $this->_productEntityId; } /** * Set product entity table name. * * @codeCoverageIgnore * * @param string $value * @return $this */ public function setProductEntityTableName($value) { $this->_productEntityTableName = $value; return $this; } /** * Get product entity table name. * * @codeCoverageIgnore * * @return string */ public function getProductEntityTableName() { return $this->_productEntityTableName; } /** * Get product attribute set id. * * @codeCoverageIgnore * * @return int */ public function getProductAttributeSetId() { return $this->_productEntityAttributeSetId; } /** * Set product attribute set id. * * @codeCoverageIgnore * * @param int $value * @return $this */ public function setProductAttributeSetId($value) { $this->_productEntityAttributeSetId = $value; return $this; } /** * Join fields * * @return $this */ protected function _joinFields() { $this->_totals = new \Magento\Framework\DataObject(); $this->addAttributeToSelect('entity_id')->addAttributeToSelect('name')->addAttributeToSelect('price'); return $this; } /** * Get select count sql * * @return \Magento\Framework\DB\Select */ public function getSelectCountSql() { if ($this->_selectCountSqlType == self::SELECT_COUNT_SQL_TYPE_CART) { $countSelect = clone $this->quoteResource->getSelect(); $countSelect->reset()->from( ['quote_item_table' => $this->getTable('quote_item')], ['COUNT(DISTINCT quote_item_table.product_id)'] )->join( ['quote_table' => $this->getTable('quote')], 'quote_table.entity_id = quote_item_table.quote_id AND quote_table.is_active = 1', [] ); return $countSelect; } $countSelect = clone $this->getSelect(); $countSelect->reset(\Magento\Framework\DB\Select::ORDER); $countSelect->reset(\Magento\Framework\DB\Select::LIMIT_COUNT); $countSelect->reset(\Magento\Framework\DB\Select::LIMIT_OFFSET); $countSelect->reset(\Magento\Framework\DB\Select::COLUMNS); $countSelect->reset(\Magento\Framework\DB\Select::GROUP); $countSelect->reset(\Magento\Framework\DB\Select::HAVING); $countSelect->columns("count(DISTINCT e.entity_id)"); return $countSelect; } /** * Set order * * @param string $attribute * @param string $dir * @return $this */ public function setOrder($attribute, $dir = self::SORT_ORDER_DESC) { if (in_array($attribute, ['carts'])) { $this->getSelect()->order($attribute . ' ' . $dir); } else { parent::setOrder($attribute, $dir); } return $this; } /** * Add views count. * * @param string $from * @param string $to * @return $this */ public function addViewsCount($from = '', $to = '') { /** * Getting event type id for catalog_product_view event */ $eventTypes = $this->_eventTypeFactory->create()->getCollection(); $productViewEvent = null; foreach ($eventTypes as $eventType) { if ($eventType->getEventName() == 'catalog_product_view') { $productViewEvent = (int)$eventType->getId(); break; } } $this->getSelect()->reset()->from( ['report_table_views' => $this->getTable('report_event')], ['views' => 'COUNT(report_table_views.event_id)'] )->join( ['e' => $this->getProductEntityTableName()], 'e.entity_id = report_table_views.object_id' )->where( 'report_table_views.event_type_id = ?', $productViewEvent )->group( 'e.entity_id' )->order( 'views ' . self::SORT_ORDER_DESC )->having( 'COUNT(report_table_views.event_id) > ?', 0 ); if ($from != '' && $to != '') { $this->getSelect()->where('logged_at >= ?', $from)->where('logged_at <= ?', $to); } return $this; } /** * Prepare between sql * * @param string $fieldName Field name with table suffix ('created_at' or 'main_table.created_at') * @param string $from * @param string $to * @return string Formatted sql string */ protected function _prepareBetweenSql($fieldName, $from, $to) { return sprintf( '(%s BETWEEN %s AND %s)', $fieldName, $this->getConnection()->quote($from), $this->getConnection()->quote($to) ); } /** * Add store restrictions to product collection * * @param array $storeIds * @param array $websiteIds * @return $this */ public function addStoreRestrictions($storeIds, $websiteIds) { if (!is_array($storeIds)) { $storeIds = [$storeIds]; } if (!is_array($websiteIds)) { $websiteIds = [$websiteIds]; } $filters = $this->_productLimitationFilters; if (isset($filters['store_id'])) { if (!in_array($filters['store_id'], $storeIds)) { $this->addStoreFilter($filters['store_id']); } else { $this->addStoreFilter($this->getStoreId()); } } else { $this->addWebsiteFilter($websiteIds); } return $this; } }