Completed
Push — master ( 642b7c...557405 )
by Tim
9s
created

BundleOptionObserver::persistProductBundleOption()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 0
CRAP Score 2

Importance

Changes 0
Metric Value
dl 0
loc 4
ccs 0
cts 4
cp 0
rs 10
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 1
crap 2
1
<?php
2
3
/**
4
 * TechDivision\Import\Product\Bundle\Observers\BundleOptionObserver
5
 *
6
 * NOTICE OF LICENSE
7
 *
8
 * This source file is subject to the Open Software License (OSL 3.0)
9
 * that is available through the world-wide-web at this URL:
10
 * http://opensource.org/licenses/osl-3.0.php
11
 *
12
 * PHP version 5
13
 *
14
 * @author    Tim Wagner <[email protected]>
15
 * @copyright 2016 TechDivision GmbH <[email protected]>
16
 * @license   http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
17
 * @link      https://github.com/techdivision/import-product-bundle
18
 * @link      http://www.techdivision.com
19
 */
20
21
namespace TechDivision\Import\Product\Bundle\Observers;
22
23
use TechDivision\Import\Utils\StoreViewCodes;
24
use TechDivision\Import\Product\Bundle\Utils\ColumnKeys;
25
use TechDivision\Import\Product\Bundle\Utils\MemberNames;
26
use TechDivision\Import\Product\Observers\AbstractProductImportObserver;
27
28
/**
29
 * Oberserver that provides functionality for the bundle option replace operation.
30
 *
31
 * @author    Tim Wagner <[email protected]>
32
 * @copyright 2016 TechDivision GmbH <[email protected]>
33
 * @license   http://opensource.org/licenses/osl-3.0.php Open Software License (OSL 3.0)
34
 * @link      https://github.com/techdivision/import-product-bundle
35
 * @link      http://www.techdivision.com
36
 */
37
class BundleOptionObserver extends AbstractProductImportObserver
38
{
39
40
    /**
41
     * Process the observer's business logic.
42
     *
43
     * @return array The processed row
44
     */
45 View Code Duplication
    protected function process()
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...
46
    {
47
48
        // prepare the store view code
49
        $this->prepareStoreViewCode($this->getRow());
0 ignored issues
show
Unused Code introduced by
The call to BundleOptionObserver::prepareStoreViewCode() has too many arguments starting with $this->getRow().

This check compares calls to functions or methods with their respective definitions. If the call has more arguments than are defined, it raises an issue.

If a function is defined several times with a different number of parameters, the check may pick up the wrong definition and report false positives. One codebase where this has been known to happen is Wordpress.

In this case you can add the @ignore PhpDoc annotation to the duplicate definition and it will be ignored.

Loading history...
50
51
        // return immediately if we're have no store view code set
52
        if (StoreViewCodes::ADMIN !== $this->getStoreViewCode(StoreViewCodes::ADMIN)) {
53
            return;
54
        }
55
56
        // query whether or not the option has already been created
57
        if (!$this->exists($name = $this->getValue(ColumnKeys::BUNDLE_VALUE_NAME))) {
58
            // load the bundle option
59
            $bundleOption = $this->initializeBundleOption($this->prepareAttributes());
60
61
            // persist the product bundle option
62
            $optionId = $this->persistProductBundleOption($bundleOption);
63
64
            // store the name => option ID mapping
65
            $this->addNameOptionIdMapping($name, $optionId);
66
        }
67
    }
68
69
    /**
70
     * Prepare the attributes of the entity that has to be persisted.
71
     *
72
     * @return array The prepared attributes
73
     */
74 View Code Duplication
    protected function prepareAttributes()
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...
75
    {
76
77
        // reset the position counter for the bundle selection
78
        $this->resetPositionCounter();
79
80
        // load and map the parent option ID
81
        $parentId = $this->mapSku($this->getValue(ColumnKeys::BUNDLE_PARENT_SKU));
82
83
        // extract the parent/child ID as well as type and position
84
        $required = $this->getValue(ColumnKeys::BUNDLE_VALUE_REQUIRED);
85
        $type = $this->getValue(ColumnKeys::BUNDLE_VALUE_TYPE);
86
        $position = 1;
87
88
        // return the prepared product
89
        return $this->initializeEntity(
90
            array(
91
                MemberNames::PARENT_ID => $parentId,
92
                MemberNames::REQUIRED  => $required,
93
                MemberNames::POSITION  => $position,
94
                MemberNames::TYPE      => $type
95
            )
96
        );
97
    }
98
99
    /**
100
     * Initialize the bundle option with the passed attributes and returns an instance.
101
     *
102
     * @param array $attr The bundle option attributes
103
     *
104
     * @return array The initialized bundle option
105
     */
106
    protected function initializeBundleOption(array $attr)
107
    {
108
        return $attr;
109
    }
110
111
    /**
112
     * Reset the position counter to 1.
113
     *
114
     * @return void
115
     */
116
    protected function resetPositionCounter()
117
    {
118
        $this->getSubject()->resetPositionCounter();
119
    }
120
121
    /**
122
     * Add's the mapping for the passed name => option ID.
123
     *
124
     * @param string  $name     The name of the option
125
     * @param integer $optionId The created option ID
126
     *
127
     * @return void
128
     */
129
    protected function addNameOptionIdMapping($name, $optionId)
130
    {
131
        $this->getSubject()->addNameOptionIdMapping($name, $optionId);
132
    }
133
134
    /**
135
     * Query whether or not the option with the passed name has already been created.
136
     *
137
     * @param string $name The option name to query for
138
     *
139
     * @return boolean TRUE if the option already exists, else FALSE
140
     */
141
    protected function exists($name)
142
    {
143
        return $this->getSubject()->exists($name);
144
    }
145
146
    /**
147
     * Return the entity ID for the passed SKU.
148
     *
149
     * @param string $sku The SKU to return the entity ID for
150
     *
151
     * @return integer The mapped entity ID
152
     * @throws \Exception Is thrown if the SKU is not mapped yet
153
     */
154
    protected function mapSku($sku)
155
    {
156
        return $this->getSubject()->mapSkuToEntityId($sku);
157
    }
158
159
    /**
160
     * Persist's the passed product bundle option data and return's the ID.
161
     *
162
     * @param array $productBundleOption The product bundle option data to persist
163
     *
164
     * @return string The ID of the persisted entity
165
     */
166
    protected function persistProductBundleOption($productBundleOption)
167
    {
168
        return $this->getSubject()->persistProductBundleOption($productBundleOption);
169
    }
170
}
171