Completed
Pull Request — master (#358)
by Simon
04:39
created

CustomerGroup::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 3
c 0
b 0
f 0
nc 1
nop 2
dl 0
loc 5
rs 9.4285
1
<?php
2
/**
3
 * (c) shopware AG <[email protected]>
4
 * For the full copyright and license information, please view the LICENSE
5
 * file that was distributed with this source code.
6
 */
7
8
namespace ShopwarePlugins\Connect\Subscribers;
9
10
use Enlight\Event\SubscriberInterface;
11
use Shopware\Components\Model\ModelManager;
12
use ShopwarePlugins\Connect\Components\Logger;
13
14
class CustomerGroup implements SubscriberInterface
15
{
16
    /**
17
     * @var ModelManager
18
     */
19
    private $modelManager;
20
21
    /**
22
     * @var Logger
23
     */
24
    private $logger;
25
26
    /**
27
     * @param ModelManager $modelManager
28
     * @param Logger $logger
29
     */
30
    public function __construct(ModelManager $modelManager, Logger $logger)
31
    {
32
        $this->modelManager = $modelManager;
33
        $this->logger = $logger;
34
    }
35
36
    /**
37
     * {@inheritdoc}
38
     */
39
    public static function getSubscribedEvents()
40
    {
41
        return [
42
            'Enlight_Controller_Action_PreDispatch_Backend_Base' => 'filterCustomerGroup',
43
            'Shopware\Models\Customer\Repository::getCustomerGroupsQueryBuilder::after' => 'filterCustomerGroupFromQueryBuilder',
44
            'Shopware\Models\Customer\Repository::getCustomerGroupsWithoutIdsQueryBuilder::before' => 'addToWithoutIdsQueryBuilder'
45
        ];
46
    }
47
48
    /**
49
     * Remove 'connect' customer group from the base store - except 'showConnect' is set
50
     *
51
     * @param \Enlight_Event_EventArgs $args
52
     */
53
    public function filterCustomerGroup(\Enlight_Event_EventArgs $args)
54
    {
55
        /** @var \Enlight_Controller_Action $controller */
56
        $controller = $args->get('subject');
57
        $request = $controller->Request();
58
59
        if ($request->getActionName() !== 'getCustomerGroups') {
60
            return;
61
        }
62
63
        try {
64
            if (!$this->getConnectCustomerGroupId()) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->getConnectCustomerGroupId() of type integer|null is loosely compared to false; this is ambiguous if the integer can be zero. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
65
                return;
66
            }
67
            if ($request->getParam('showConnect', false)) {
68
                return;
69
            }
70
            $filter = $request->getParam('filter', []);
71
            $filter[] = ['property' => 'id', 'value' => $this->getConnectCustomerGroupId(), 'expression' => '<>'];
72
            $request->setParam('filter', $filter);
73
        } catch (\Exception $e) {
74
            $this->logger->write(true, 'filterCustomerGroup', $e->getMessage());
75
76
            return;
77
        }
78
    }
79
80
    /**
81
     * This one will remove connect from the default customer group query
82
     *
83
     * @param \Enlight_Hook_HookArgs $args
84
     */
85
    public function filterCustomerGroupFromQueryBuilder(\Enlight_Hook_HookArgs $args)
86
    {
87
        if (!$this->getConnectCustomerGroupId()) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->getConnectCustomerGroupId() of type integer|null is loosely compared to false; this is ambiguous if the integer can be zero. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
88
            return;
89
        }
90
91
        // Allow the article module to list the connect customer group
92
        $pathInfo = Shopware()->Front()->Request()->getPathInfo();
93
        if (strpos($pathInfo, '/backend/Article') !== false) {
94
            return;
95
        }
96
97
        $builder = $args->getReturn();
98
        $builder->andWhere('groups.id != :groupId')->setParameter('groupId', $this->getConnectCustomerGroupId());
99
100
        $args->setReturn($builder);
101
    }
102
103
    /**
104
     * This one is used by the category module e.g.
105
     *
106
     * @param \Enlight_Hook_HookArgs $args
107
     */
108
    public function addToWithoutIdsQueryBuilder(\Enlight_Hook_HookArgs $args)
109
    {
110
        if (!$this->getConnectCustomerGroupId()) {
0 ignored issues
show
Bug Best Practice introduced by
The expression $this->getConnectCustomerGroupId() of type integer|null is loosely compared to false; this is ambiguous if the integer can be zero. You might want to explicitly use === null instead.

In PHP, under loose comparison (like ==, or !=, or switch conditions), values of different types might be equal.

For integer values, zero is a special case, in particular the following results might be unexpected:

0   == false // true
0   == null  // true
123 == false // false
123 == null  // false

// It is often better to use strict comparison
0 === false // false
0 === null  // false
Loading history...
111
            return;
112
        }
113
114
        $userIds = $args->get('usedIds');
115
116
        if (!$userIds) {
117
            $userIds = [];
118
        }
119
        $userIds[] = $this->getConnectCustomerGroupId();
120
121
        $args->set('usedIds', $userIds);
122
    }
123
124
    /**
125
     * Will return the id of the connect customer group - or null if no such group can be found
126
     *
127
     * @return int|null
128
     */
129
    private function getConnectCustomerGroupId()
130
    {
131
        $repo = $this->modelManager->getRepository('Shopware\Models\Attribute\CustomerGroup');
132
        /** @var \Shopware\Models\Attribute\CustomerGroup $model */
133
        $model = $repo->findOneBy(['connectGroup' => true]);
134
135
        $customerGroup = null;
0 ignored issues
show
Unused Code introduced by
$customerGroup is not used, you could remove the assignment.

This check looks for variable assignements that are either overwritten by other assignments or where the variable is not used subsequently.

$myVar = 'Value';
$higher = false;

if (rand(1, 6) > 3) {
    $higher = true;
} else {
    $higher = false;
}

Both the $myVar assignment in line 1 and the $higher assignment in line 2 are dead. The first because $myVar is never used and the second because $higher is always overwritten for every possible time line.

Loading history...
136
        if ($model && $model->getCustomerGroup()) {
137
            return $model->getCustomerGroup()->getId();
138
        }
139
140
        return null;
141
    }
142
}
143