Completed
Push — develop ( dfc635...db7182 )
by Steven
02:33
created

Crosssell   A

Complexity

Total Complexity 7

Size/Duplication

Total Lines 113
Duplicated Lines 7.08 %

Coupling/Cohesion

Components 1
Dependencies 2

Importance

Changes 8
Bugs 2 Features 2
Metric Value
wmc 7
c 8
b 2
f 2
lcom 1
cbo 2
dl 8
loc 113
rs 10

3 Methods

Rating   Name   Duplication   Size   Complexity  
B getItems() 0 28 5
A _getPersonalisedProductCollection() 8 8 1
B __construct() 0 27 1

How to fix   Duplicated Code   

Duplicated Code

Duplicate code is one of the most pungent code smells. A rule that is often used is to re-structure code once it is duplicated in three or more places.

Common duplication problems, and corresponding solutions are:

1
<?php
2
3
namespace Richdynamix\PersonalisedProducts\Block\Checkout\Cart;
4
5
use \Magento\Catalog\Block\Product\Context as Context;
6
use \Richdynamix\PersonalisedProducts\Helper\Config as Config;
7
use \Richdynamix\PersonalisedProducts\Model\Frontend\Checkout\Cart\Crosssell as CrosssellModel;
8
use \Magento\Catalog\Model\ProductFactory as ProductFactory;
9
use \Magento\CatalogInventory\Helper\Stock as StockHelper;
10
use \Magento\Framework\Module\Manager as Manager;
11
use \Magento\Catalog\Model\Product\Visibility;
12
use \Magento\Checkout\Model\Session;
13
use \Magento\Catalog\Model\Product\LinkFactory;
14
use \Magento\Quote\Model\Quote\Item\RelatedProducts;
15
16
/**
17
 * Class Crosssel
18
 *
19
 * @category  Richdynamix
20
 * @package   PersonalisedProducts
21
 * @author    Steven Richardson ([email protected]) @mage_gizmo
22
 */
23
class Crosssell extends \Magento\Checkout\Block\Cart\Crosssell
24
{
25
    /**
26
     * @var Config
27
     */
28
    private $_config;
29
30
    /**
31
     * @var CrosssellModel
32
     */
33
    private $_crosssell;
34
35
    /**
36
     * @var
37
     */
38
    private $_itemCollection;
39
40
    /**
41
     * @var Manager
42
     */
43
    private $_moduleManager;
44
45
    /**
46
     * Crosssell constructor.
47
     * @param Context $context
48
     * @param Config $config
49
     * @param CrosssellModel $crosssell
50
     * @param ProductFactory $productFactory
51
     * @param Manager $moduleManager
52
     * @param Visibility $productVisibility
53
     * @param Session $checkoutSession
54
     * @param LinkFactory $productLinkFactory
55
     * @param RelatedProducts $itemRelationsList
56
     * @param StockHelper $stockHelper
57
     * @param array $data
58
     */
59
    public function __construct(
60
        Context $context,
61
        Config $config,
62
        CrosssellModel $crosssell,
63
        ProductFactory $productFactory,
64
        Manager $moduleManager,
65
        Visibility $productVisibility,
66
        Session $checkoutSession,
67
        LinkFactory $productLinkFactory,
68
        RelatedProducts $itemRelationsList,
69
        StockHelper $stockHelper,
70
        array $data = []
71
    ) {
72
        $this->_config = $config;
73
        $this->_crosssell = $crosssell;
74
        $this->_productFactory = $productFactory;
75
        $this->_moduleManager = $moduleManager;
76
        parent::__construct(
77
            $context,
78
            $checkoutSession,
79
            $productVisibility,
80
            $productLinkFactory,
81
            $itemRelationsList,
82
            $stockHelper,
83
            $data
84
        );
85
    }
86
87
    /**
88
     * Get the crossell items for the basket page
89
     *
90
     * @return array
91
     */
92
    public function getItems()
93
    {
94
        if (!$this->_config->isEnabled()) {
95
            return parent::getItems();
96
        }
97
98
        $ninProductIds = $this->_getCartProductIds();
99
        $personalisedIds = $this->_crosssell->getProductCollection($ninProductIds);
100
101
        if (!$personalisedIds) {
102
            return parent::getItems();
103
        }
104
105
        $collection = $this->_getPersonalisedProductCollection($personalisedIds);
106
107
        $this->_itemCollection = $collection;
108
109
        if ($this->_moduleManager->isEnabled('Magento_Checkout')) {
110
            $this->_addProductAttributesAndPrices($this->_itemCollection);
111
        }
112
113
        $items = [];
114
        foreach ($collection as $item) {
115
            $items[] = $item;
116
        }
117
118
        return $items;
119
    }
120
121
    /**
122
     * We only want to show visible and enabled products.
123
     *
124
     * @param $personalisedIds
125
     * @return $this
126
     */
127 View Code Duplication
    private function _getPersonalisedProductCollection($personalisedIds)
0 ignored issues
show
Duplication introduced by
This method seems to be duplicated in your project.

Duplicated code is one of the most pungent code smells. If you need to duplicate the same code in three or more different places, we strongly encourage you to look into extracting the code into a single class or operation.

You can also find more detailed suggestions in the “Code” section of your repository.

Loading history...
128
    {
129
        $collection = $this->_productFactory->create()->getCollection()
130
            ->addAttributeToFilter('entity_id', ['in', $personalisedIds])
131
            ->addAttributeToFilter('visibility', Visibility::VISIBILITY_BOTH)
132
            ->addAttributeToFilter('status', array('eq' => 1));
133
        return $collection;
134
    }
135
}
136