mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-07 17:27:36 +00:00
334 lines
10 KiB
PHP
334 lines
10 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
namespace Magento\Review\Model\ResourceModel\Rating;
|
|
|
|
/**
|
|
* Rating collection resource model
|
|
*
|
|
* @api
|
|
* @since 100.0.2
|
|
*/
|
|
class Collection extends \Magento\Framework\Model\ResourceModel\Db\Collection\AbstractCollection
|
|
{
|
|
/**
|
|
* @var \Magento\Store\Model\StoreManagerInterface
|
|
*/
|
|
protected $_storeManager;
|
|
|
|
/**
|
|
* @var \Magento\Review\Model\ResourceModel\Rating\Option\CollectionFactory
|
|
*/
|
|
protected $_ratingCollectionF;
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
protected $_addStoreDataFlag = false;
|
|
|
|
/**
|
|
* @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\Store\Model\StoreManagerInterface $storeManager
|
|
* @param \Magento\Review\Model\ResourceModel\Rating\Option\CollectionFactory $ratingCollectionF
|
|
* @param mixed $connection
|
|
* @param \Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource
|
|
*/
|
|
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\Store\Model\StoreManagerInterface $storeManager,
|
|
\Magento\Review\Model\ResourceModel\Rating\Option\CollectionFactory $ratingCollectionF,
|
|
\Magento\Framework\DB\Adapter\AdapterInterface $connection = null,
|
|
\Magento\Framework\Model\ResourceModel\Db\AbstractDb $resource = null
|
|
) {
|
|
$this->_storeManager = $storeManager;
|
|
$this->_ratingCollectionF = $ratingCollectionF;
|
|
parent::__construct($entityFactory, $logger, $fetchStrategy, $eventManager, $connection, $resource);
|
|
}
|
|
|
|
/**
|
|
* @var bool
|
|
*/
|
|
protected $_isStoreJoined = false;
|
|
|
|
/**
|
|
* Resource initialization
|
|
*
|
|
* @return void
|
|
*/
|
|
protected function _construct()
|
|
{
|
|
$this->_init(\Magento\Review\Model\Rating::class, \Magento\Review\Model\ResourceModel\Rating::class);
|
|
}
|
|
|
|
/**
|
|
* Add entity filter
|
|
*
|
|
* @param int|string $entity
|
|
* @return $this
|
|
*/
|
|
public function addEntityFilter($entity)
|
|
{
|
|
$connection = $this->getConnection();
|
|
|
|
$this->getSelect()->join(
|
|
$this->getTable('rating_entity'),
|
|
'main_table.entity_id=' . $this->getTable('rating_entity') . '.entity_id',
|
|
['entity_code']
|
|
);
|
|
|
|
if (is_numeric($entity)) {
|
|
$this->addFilter(
|
|
'entity',
|
|
$connection->quoteInto($this->getTable('rating_entity') . '.entity_id=?', $entity),
|
|
'string'
|
|
);
|
|
} elseif (is_string($entity)) {
|
|
$this->addFilter(
|
|
'entity',
|
|
$connection->quoteInto($this->getTable('rating_entity') . '.entity_code=?', $entity),
|
|
'string'
|
|
);
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set order by position field
|
|
*
|
|
* @param string $dir
|
|
* @return $this
|
|
*/
|
|
public function setPositionOrder($dir = 'ASC')
|
|
{
|
|
$this->setOrder('main_table.position', $dir);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set store filter
|
|
*
|
|
* @param int $storeId
|
|
* @return $this
|
|
*/
|
|
public function setStoreFilter($storeId)
|
|
{
|
|
if ($this->_storeManager->isSingleStoreMode()) {
|
|
return $this;
|
|
}
|
|
$connection = $this->getConnection();
|
|
if (!is_array($storeId)) {
|
|
$storeId = [$storeId === null ? -1 : $storeId];
|
|
}
|
|
if ($storeId == 0) {
|
|
return $this;
|
|
}
|
|
if (!$this->_isStoreJoined) {
|
|
$this->getSelect()->distinct(
|
|
true
|
|
)->join(
|
|
['store' => $this->getTable('rating_store')],
|
|
'main_table.rating_id = store.rating_id',
|
|
[]
|
|
);
|
|
$this->_isStoreJoined = true;
|
|
}
|
|
$inCondition = $connection->prepareSqlCondition('store.store_id', ['in' => $storeId]);
|
|
$this->getSelect()->where($inCondition);
|
|
$this->setPositionOrder();
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Add options to ratings in collection
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function addOptionToItems()
|
|
{
|
|
$arrRatingId = $this->getColumnValues('rating_id');
|
|
|
|
if (!empty($arrRatingId)) {
|
|
/** @var \Magento\Review\Model\ResourceModel\Rating\Option\Collection $collection */
|
|
$collection = $this->_ratingCollectionF->create()->addRatingFilter(
|
|
$arrRatingId
|
|
)->setPositionOrder()->load();
|
|
|
|
foreach ($this as $rating) {
|
|
$rating->setOptions($collection->getItemsByColumnValue('rating_id', $rating->getId()));
|
|
}
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Add entity summary to item
|
|
*
|
|
* @param int $entityPkValue
|
|
* @param int $storeId
|
|
* @return $this
|
|
*/
|
|
public function addEntitySummaryToItem($entityPkValue, $storeId)
|
|
{
|
|
$arrRatingId = $this->getColumnValues('rating_id');
|
|
if (count($arrRatingId) == 0) {
|
|
return $this;
|
|
}
|
|
|
|
$connection = $this->getConnection();
|
|
|
|
$inCond = $connection->prepareSqlCondition('rating_option_vote.rating_id', ['in' => $arrRatingId]);
|
|
$sumCond = new \Zend_Db_Expr("SUM(rating_option_vote.{$connection->quoteIdentifier('percent')})");
|
|
$countCond = new \Zend_Db_Expr('COUNT(*)');
|
|
$select = $connection->select()->from(
|
|
['rating_option_vote' => $this->getTable('rating_option_vote')],
|
|
['rating_id' => 'rating_option_vote.rating_id', 'sum' => $sumCond, 'count' => $countCond]
|
|
)->join(
|
|
['review_store' => $this->getTable('review_store')],
|
|
'rating_option_vote.review_id=review_store.review_id AND review_store.store_id = :store_id',
|
|
[]
|
|
);
|
|
if (!$this->_storeManager->isSingleStoreMode()) {
|
|
$select->join(
|
|
['rst' => $this->getTable('rating_store')],
|
|
'rst.rating_id = rating_option_vote.rating_id AND rst.store_id = :rst_store_id',
|
|
[]
|
|
);
|
|
}
|
|
$select->join(
|
|
['review' => $this->getTable('review')],
|
|
'review_store.review_id=review.review_id AND review.status_id=1',
|
|
[]
|
|
)->where(
|
|
$inCond
|
|
)->where(
|
|
'rating_option_vote.entity_pk_value=:pk_value'
|
|
)->group(
|
|
'rating_option_vote.rating_id'
|
|
);
|
|
$bind = [':store_id' => (int)$storeId, ':pk_value' => $entityPkValue];
|
|
if (!$this->_storeManager->isSingleStoreMode()) {
|
|
$bind[':rst_store_id'] = (int)$storeId;
|
|
}
|
|
|
|
$data = $this->getConnection()->fetchAll($select, $bind);
|
|
|
|
foreach ($data as $item) {
|
|
$rating = $this->getItemById($item['rating_id']);
|
|
if ($rating && $item['count'] > 0) {
|
|
$rating->setSummary($item['sum'] / $item['count']);
|
|
}
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Add rating store name
|
|
*
|
|
* @param int $storeId
|
|
* @return $this
|
|
*/
|
|
public function addRatingPerStoreName($storeId)
|
|
{
|
|
$connection = $this->getConnection();
|
|
$ratingCodeCond = $connection->getIfNullSql('title.value', 'main_table.rating_code');
|
|
$this->getSelect()->joinLeft(
|
|
['title' => $this->getTable('rating_title')],
|
|
$connection->quoteInto('main_table.rating_id=title.rating_id AND title.store_id = ?', (int)$storeId),
|
|
['rating_code' => $ratingCodeCond]
|
|
);
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Add stores data to collection
|
|
*
|
|
* @return $this
|
|
*/
|
|
public function addStoreData()
|
|
{
|
|
if (!$this->_storeManager->isSingleStoreMode()) {
|
|
if (!$this->_isCollectionLoaded) {
|
|
$this->_addStoreDataFlag = true;
|
|
} elseif (!$this->_addStoreDataFlag) {
|
|
$this->_addStoreData();
|
|
}
|
|
}
|
|
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Load data
|
|
*
|
|
* @param bool $printQuery
|
|
* @param bool $logQuery
|
|
* @return $this
|
|
*/
|
|
public function load($printQuery = false, $logQuery = false)
|
|
{
|
|
if ($this->isLoaded()) {
|
|
return $this;
|
|
}
|
|
$this->_eventManager->dispatch('rating_rating_collection_load_before', ['collection' => $this]);
|
|
parent::load($printQuery, $logQuery);
|
|
if ($this->_addStoreDataFlag) {
|
|
$this->_addStoreData();
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Add store data
|
|
*
|
|
* @return $this
|
|
*/
|
|
protected function _addStoreData()
|
|
{
|
|
$ratingIds = [];
|
|
foreach ($this as $item) {
|
|
$ratingIds[] = $item->getId();
|
|
$item->setStores([]);
|
|
}
|
|
if (!$ratingIds) {
|
|
return $this;
|
|
}
|
|
$connection = $this->getConnection();
|
|
|
|
$inCondition = $connection->prepareSqlCondition('rating_id', ['in' => $ratingIds]);
|
|
|
|
$this->_select = $connection->select()->from($this->getTable('rating_store'))->where($inCondition);
|
|
|
|
$data = $connection->fetchAll($this->_select);
|
|
if (is_array($data) && count($data) > 0) {
|
|
foreach ($data as $row) {
|
|
$item = $this->getItemById($row['rating_id']);
|
|
$stores = $item->getStores();
|
|
$stores[] = $row['store_id'];
|
|
$item->setStores(array_unique($stores));
|
|
}
|
|
}
|
|
return $this;
|
|
}
|
|
|
|
/**
|
|
* Set Active Filter
|
|
*
|
|
* @param bool $isActive
|
|
* @return $this
|
|
*/
|
|
public function setActiveFilter($isActive = true)
|
|
{
|
|
$this->getSelect()->where('main_table.is_active=?', $isActive);
|
|
return $this;
|
|
}
|
|
}
|