ReportsProductCollectionPlugin.php 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. <?php
  2. namespace Dotdigitalgroup\Email\Plugin;
  3. /**
  4. * Class ReportsProductCollection
  5. *
  6. * @SuppressWarnings(PHPMD.UnusedFormalParameter)
  7. */
  8. class ReportsProductCollectionPlugin
  9. {
  10. /**
  11. * @var \Magento\Reports\Model\Event\TypeFactory
  12. */
  13. private $eventTypeFactory;
  14. /**
  15. * ReportsProductCollection constructor.
  16. *
  17. * @param \Magento\Reports\Model\Event\TypeFactory $typeFactory
  18. */
  19. public function __construct(\Magento\Reports\Model\Event\TypeFactory $typeFactory)
  20. {
  21. $this->eventTypeFactory = $typeFactory;
  22. }
  23. /**
  24. * @param \Magento\Reports\Model\ResourceModel\Product\Collection $collection
  25. * @param callable $proceed
  26. * @param string $from
  27. * @param string $to
  28. *
  29. * @return \Magento\Reports\Model\ResourceModel\Product\Collection
  30. */
  31. public function aroundAddViewsCount(
  32. \Magento\Reports\Model\ResourceModel\Product\Collection $collection,
  33. callable $proceed,
  34. $from = '',
  35. $to = ''
  36. ) {
  37. /**
  38. * Getting event type id for catalog_product_view event
  39. */
  40. $eventTypes = $this->eventTypeFactory->create()->getCollection();
  41. foreach ($eventTypes as $eventType) {
  42. if ($eventType->getEventName() == 'catalog_product_view') {
  43. $productViewEvent = (int)$eventType->getId();
  44. break;
  45. }
  46. }
  47. $collection->getSelect()->reset()->from(
  48. ['report_table_views' => $collection->getTable('report_event')],
  49. ['views' => 'COUNT(report_table_views.event_id)']
  50. )->join(
  51. ['e' => $collection->getProductEntityTableName()],
  52. 'e.entity_id = report_table_views.object_id'
  53. )->where(
  54. 'report_table_views.event_type_id = ?',
  55. $productViewEvent
  56. )->group(
  57. 'e.entity_id'
  58. )->order(
  59. 'views ' . $collection::SORT_ORDER_DESC
  60. )->having(
  61. 'COUNT(report_table_views.event_id) > ?',
  62. 0
  63. );
  64. if ($from != '' && $to != '') {
  65. $collection->getSelect()->where('logged_at >= ?', $from)->where('logged_at <= ?', $to);
  66. }
  67. return $collection;
  68. }
  69. }