Passed
Push — master ( b851c0...471699 )
by Aimeos
01:37
created

Ezpublish::saveItem()   C

Complexity

Conditions 7
Paths 238

Size

Total Lines 99
Code Lines 69

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 7
eloc 69
c 3
b 0
f 0
nc 238
nop 2
dl 0
loc 99
rs 6.6963

How to fix   Long Method   

Long Method

Small methods make your code easier to understand, in particular if combined with a good name. Besides, if your method is small, finding a good name is usually much easier.

For example, if you find yourself adding comments to a method's body, this is usually a good sign to extract the commented part to a new method, and use the comment as a starting point when coming up with a good name for this new method.

Commonly applied refactorings include:

1
<?php
2
3
/**
4
 * @license LGPLv3, http://opensource.org/licenses/LGPL-3.0
5
 * @copyright Aimeos (aimeos.org), 2016-2018
6
 * @package MShop
7
 * @subpackage Customer
8
 */
9
10
11
namespace Aimeos\MShop\Customer\Manager;
12
13
14
/**
15
 * Customer class implementation for ezPublish
16
 *
17
 * @package MShop
18
 * @subpackage Customer
19
 */
20
class Ezpublish
21
	extends \Aimeos\MShop\Customer\Manager\Standard
22
{
23
	private $searchConfig = array(
24
		'customer.id' => array(
25
			'label' => 'Customer ID',
26
			'code' => 'customer.id',
27
			'internalcode' => 'ezu."contentobject_id"',
28
			'type' => 'integer',
29
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_INT
30
		),
31
		// customer.siteid is not available
32
		'customer.label' => array(
33
			'label' => 'Customer label',
34
			'code' => 'customer.label',
35
			'internalcode' => 'ezu."login"',
36
			'type' => 'string',
37
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR
38
		),
39
		'customer.code' => array(
40
			'label' => 'Customer username',
41
			'code' => 'customer.code',
42
			'internalcode' => 'ezu."login_normalized"',
43
			'type' => 'string',
44
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR
45
		),
46
		'customer.salutation' => array(
47
			'label' => 'Customer salutation',
48
			'code' => 'customer.salutation',
49
			'internalcode' => 'ezu."salutation"',
50
			'type' => 'string',
51
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
52
		),
53
		'customer.company'=> array(
54
			'label' => 'Customer company',
55
			'code' => 'customer.company',
56
			'internalcode' => 'ezu."company"',
57
			'type' => 'string',
58
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
59
		),
60
		'customer.vatid'=> array(
61
			'label' => 'Customer VAT ID',
62
			'code' => 'customer.vatid',
63
			'internalcode' => 'ezu."vatid"',
64
			'type' => 'string',
65
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
66
		),
67
		'customer.title' => array(
68
			'label' => 'Customer title',
69
			'code' => 'customer.title',
70
			'internalcode' => 'ezu."title"',
71
			'type' => 'string',
72
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
73
		),
74
		'customer.firstname' => array(
75
			'label' => 'Customer firstname',
76
			'code' => 'customer.firstname',
77
			'internalcode' => 'ezu."firstname"',
78
			'type' => 'string',
79
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
80
		),
81
		'customer.lastname' => array(
82
			'label' => 'Customer lastname',
83
			'code' => 'customer.lastname',
84
			'internalcode' => 'ezu."lastname"',
85
			'type' => 'string',
86
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
87
		),
88
		'customer.address1' => array(
89
			'label' => 'Customer address part one',
90
			'code' => 'customer.address1',
91
			'internalcode' => 'ezu."address1"',
92
			'type' => 'string',
93
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
94
		),
95
		'customer.address2' => array(
96
			'label' => 'Customer address part two',
97
			'code' => 'customer.address2',
98
			'internalcode' => 'ezu."address2"',
99
			'type' => 'string',
100
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
101
		),
102
		'customer.address3' => array(
103
			'label' => 'Customer address part three',
104
			'code' => 'customer.address3',
105
			'internalcode' => 'ezu."address3"',
106
			'type' => 'string',
107
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
108
		),
109
		'customer.postal' => array(
110
			'label' => 'Customer postal',
111
			'code' => 'customer.postal',
112
			'internalcode' => 'ezu."postal"',
113
			'type' => 'string',
114
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
115
		),
116
		'customer.city' => array(
117
			'label' => 'Customer city',
118
			'code' => 'customer.city',
119
			'internalcode' => 'ezu."city"',
120
			'type' => 'string',
121
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
122
		),
123
		'customer.state' => array(
124
			'label' => 'Customer state',
125
			'code' => 'customer.state',
126
			'internalcode' => 'ezu."state"',
127
			'type' => 'string',
128
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
129
		),
130
		'customer.languageid' => array(
131
			'label' => 'Customer language',
132
			'code' => 'customer.languageid',
133
			'internalcode' => 'ezu."langid"',
134
			'type' => 'string',
135
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
136
		),
137
		'customer.countryid' => array(
138
			'label' => 'Customer country',
139
			'code' => 'customer.countryid',
140
			'internalcode' => 'ezu."countryid"',
141
			'type' => 'string',
142
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
143
		),
144
		'customer.telephone' => array(
145
			'label' => 'Customer telephone',
146
			'code' => 'customer.telephone',
147
			'internalcode' => 'ezu."telephone"',
148
			'type' => 'string',
149
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
150
		),
151
		'customer.email' => array(
152
			'label' => 'Customer email',
153
			'code' => 'customer.email',
154
			'internalcode' => 'ezu."email"',
155
			'type' => 'string',
156
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
157
		),
158
		'customer.telefax' => array(
159
			'label' => 'Customer telefax',
160
			'code' => 'customer.telefax',
161
			'internalcode' => 'ezu."telefax"',
162
			'type' => 'string',
163
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
164
		),
165
		'customer.website' => array(
166
			'label' => 'Customer website',
167
			'code' => 'customer.website',
168
			'internalcode' => 'ezu."website"',
169
			'type' => 'string',
170
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
171
		),
172
		'customer.birthday' => array(
173
			'label' => 'Customer birthday',
174
			'code' => 'customer.birthday',
175
			'internalcode' => 'ezu."birthday"',
176
			'type' => 'string',
177
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
178
		),
179
		'customer.password'=> array(
180
			'label' => 'Customer password',
181
			'code' => 'customer.password',
182
			'internalcode' => 'ezu."password_hash"',
183
			'type' => 'string',
184
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
185
		),
186
		'customer.status'=> array(
187
			'label' => 'Customer status',
188
			'code' => 'customer.status',
189
			'internalcode' => 'ezs."is_enabled"',
190
			'type' => 'integer',
191
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_INT
192
		),
193
		'customer.dateverified'=> array(
194
			'label' => 'Customer verification date',
195
			'code' => 'customer.dateverified',
196
			'internalcode' => 'ezu."vdate"',
197
			'type' => 'date',
198
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
199
		),
200
		'customer.ctime'=> array(
201
			'label' => 'Customer creation time',
202
			'code' => 'customer.ctime',
203
			'internalcode' => 'ezu."ctime"',
204
			'type' => 'datetime',
205
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
206
		),
207
		'customer.mtime'=> array(
208
			'label' => 'Customer modification time',
209
			'code' => 'customer.mtime',
210
			'internalcode' => 'ezu."mtime"',
211
			'type' => 'datetime',
212
			'internaltype' => \Aimeos\MW\DB\Statement\Base::PARAM_STR,
213
		),
214
		'customer.editor'=> array(
215
			'label'=>'Customer editor',
216
			'code'=>'customer.editor',
217
			'internalcode' => 'ezu."editor"',
218
			'type'=> 'string',
219
			'internaltype'=> \Aimeos\MW\DB\Statement\Base::PARAM_STR,
220
		),
221
		'customer:has' => array(
222
			'code' => 'customer:has()',
223
			'internalcode' => '(
224
				SELECT ezuli_has."id" FROM ezuser_list AS ezuli_has
225
				WHERE ezu."id" = ezuli_has."parentid" AND :site AND :key LIMIT 1
226
			)',
227
			'label' => 'Customer has list item, parameter(<domain>[,<list type>[,<reference ID>)]]',
228
			'type' => 'null',
229
			'internaltype' => 'null',
230
			'public' => false,
231
		),
232
		'customer:prop' => array(
233
			'code' => 'customer:prop()',
234
			'internalcode' => '(
235
				SELECT ezupr_prop."id" FROM ezuser_property AS ezupr_prop
236
				WHERE ezu."id" = ezupr_prop."parentid" AND :site AND :key LIMIT 1
237
			)',
238
			'label' => 'Customer has property item, parameter(<property type>[,<language code>[,<property value>]])',
239
			'type' => 'null',
240
			'internaltype' => 'null',
241
			'public' => false,
242
		),
243
	);
244
245
246
	/**
247
	 * Initializes the object.
248
	 *
249
	 * @param \Aimeos\MShop\Context\Item\Iface $context Context object
250
	 */
251
	public function __construct( \Aimeos\MShop\Context\Item\Iface $context )
252
	{
253
		parent::__construct( $context );
254
255
		$locale = $context->getLocale();
256
		$level = \Aimeos\MShop\Locale\Manager\Base::SITE_ALL;
257
		$level = $context->getConfig()->get( 'mshop/customer/manager/sitemode', $level );
258
259
		$siteIds = [$locale->getSiteId()];
260
261
		if( $level & \Aimeos\MShop\Locale\Manager\Base::SITE_PATH ) {
262
			$siteIds = array_merge( $siteIds, $locale->getSitePath() );
263
		}
264
265
		if( $level & \Aimeos\MShop\Locale\Manager\Base::SITE_SUBTREE ) {
266
			$siteIds = array_merge( $siteIds, $locale->getSiteSubTree() );
0 ignored issues
show
Unused Code introduced by
The assignment to $siteIds is dead and can be removed.
Loading history...
267
		}
268
269
270
		$this->searchConfig['customer:has']['function'] = function( &$source, array $params ) {
271
272
			foreach( $params as $key => $param ) {
273
				$params[$key] = trim( $param, '\'' );
274
			}
275
276
			$source = str_replace( ':site', $self->toExpression( 'ezuli_has."siteid"', $siteIds ), $source );
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $siteIds seems to be never defined.
Loading history...
Comprehensibility Best Practice introduced by
The variable $self seems to be never defined.
Loading history...
277
			$str = $self->toExpression( 'ezuli_has."key"', join( '|', $params ), isset( $params[2] ) ? '==' : '=~' );
278
			$source = str_replace( ':key', $str, $source );
279
280
			return $params;
281
		};
282
283
284
		$this->searchConfig['customer:prop']['function'] = function( &$source, array $params ) {
285
286
			foreach( $params as $key => $param ) {
287
				$params[$key] = trim( $param, '\'' );
288
			}
289
290
			$params[2] = ( isset( $params[2] ) ? md5( $params[2] ) : null );
291
			$source = str_replace( ':site', $self->toExpression( 'ezupr_prop."siteid"', $siteIds ), $source );
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable $self seems to be never defined.
Loading history...
Comprehensibility Best Practice introduced by
The variable $siteIds seems to be never defined.
Loading history...
292
			$str = $self->toExpression( 'ezupr_prop."key"', join( '|', $params ), isset( $params[2] ) ? '==' : '=~' );
293
			$source = str_replace( ':key', $str, $source );
294
295
			return $params;
296
		};
297
	}
298
299
300
	/**
301
	 * Removes old entries from the storage.
302
	 *
303
	 * @param array $siteids List of IDs for sites whose entries should be deleted
304
	 */
305
	public function cleanup( array $siteids )
306
	{
307
		$path = 'mshop/customer/manager/submanagers';
308
		foreach( $this->getContext()->getConfig()->get( $path, ['address', 'group', 'lists', 'property'] ) as $domain ) {
309
			$this->getObject()->getSubManager( $domain )->cleanup( $siteids );
310
		}
311
	}
312
313
314
	/**
315
	 * Removes multiple items specified by ids in the array.
316
	 *
317
	 * @param array $ids List of IDs
318
	 */
319
	public function deleteItems( array $ids )
320
	{
321
		$service = $this->getContext()->getEzUserService();
0 ignored issues
show
Bug introduced by
The method getEzUserService() does not exist on Aimeos\MShop\Context\Item\Iface. It seems like you code against a sub-type of Aimeos\MShop\Context\Item\Iface such as Aimeos\MShop\Context\Item\Ezpublish. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

321
		$service = $this->getContext()->/** @scrutinizer ignore-call */ getEzUserService();
Loading history...
322
323
		foreach( $ids as $id ) {
324
			$service->deleteUser( $service->loadUser( $id ) );
325
		}
326
	}
327
328
329
	/**
330
	 * Returns the list attributes that can be used for searching.
331
	 *
332
	 * @param boolean $withsub Return also attributes of sub-managers if true
333
	 * @return array List of attribute items implementing \Aimeos\MW\Criteria\Attribute\Iface
334
	 */
335
	public function getSearchAttributes( $withsub = true )
336
	{
337
		$path = 'mshop/customer/manager/submanagers';
338
339
		return $this->getSearchAttributesBase( $this->searchConfig, $path, ['address', 'group', 'lists', 'property'], $withsub );
340
	}
341
342
343
	/**
344
	 * Returns a new manager for customer extensions
345
	 *
346
	 * @param string $manager Name of the sub manager type in lower case
347
	 * @param string|null $name Name of the implementation, will be from configuration (or Default) if null
348
	 * @return mixed Manager for different extensions, e.g stock, tags, locations, etc.
349
	 */
350
	public function getSubManager( $manager, $name = null )
351
	{
352
		return $this->getSubManagerBase( 'customer', $manager, ( $name === null ? 'Ezpublish' : $name ) );
353
	}
354
355
356
	/**
357
	 * Saves a customer item object.
358
	 *
359
	 * @param \Aimeos\MShop\Customer\Item\Iface $item Customer item object
360
	 * @param boolean $fetch True if the new ID should be returned in the item
361
	 * @return \Aimeos\MShop\Common\Item\Iface $item Updated item including the generated ID
362
	 */
363
	public function saveItem( \Aimeos\MShop\Common\Item\Iface $item, $fetch = true )
364
	{
365
		self::checkClass( '\\Aimeos\\MShop\\Customer\\Item\\Iface', $item );
366
367
		if( !$item->isModified() )
368
		{
369
			$item = $this->savePropertyItems( $item, 'customer' );
370
			$item = $this->saveAddressItems( $item, 'customer' );
0 ignored issues
show
Bug introduced by
$item of type Aimeos\MShop\Common\Item\PropertyRef\Iface is incompatible with the type Aimeos\MShop\Common\Item\AddressRef\Iface expected by parameter $item of Aimeos\MShop\Customer\Ma...ase::saveAddressItems(). ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-type  annotation

370
			$item = $this->saveAddressItems( /** @scrutinizer ignore-type */ $item, 'customer' );
Loading history...
371
			return $this->saveListItems( $item, 'customer' );
372
		}
373
374
		$context = $this->getContext();
375
376
		$class = '\Aimeos\MShop\Context\Item\Ezpublish';
377
		if( !is_a( $context, $class ) ) {
378
			throw new \Aimeos\MShop\Customer\Exception( sprintf( 'Object is not of required type "%1$s"', $class ) );
379
		}
380
381
		$service = $context->getEzUserService();
382
		$email = $item->getPaymentAddress()->getEmail();
0 ignored issues
show
Bug introduced by
The method getPaymentAddress() does not exist on Aimeos\MShop\Common\Item\Iface. It seems like you code against a sub-type of Aimeos\MShop\Common\Item\Iface such as Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Base or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

382
		$email = $item->/** @scrutinizer ignore-call */ getPaymentAddress()->getEmail();
Loading history...
383
384
		if( $item->getId() !== null )
385
		{
386
			$struct = $service->newUserUpdateStruct();
387
			$struct->password = $item->getPassword();
0 ignored issues
show
Bug introduced by
The method getPassword() does not exist on Aimeos\MShop\Common\Item\Iface. It seems like you code against a sub-type of Aimeos\MShop\Common\Item\Iface such as Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Base or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

387
			/** @scrutinizer ignore-call */ 
388
   $struct->password = $item->getPassword();
Loading history...
388
			$struct->enabled = $item->getStatus();
0 ignored issues
show
Bug introduced by
The method getStatus() does not exist on Aimeos\MShop\Common\Item\Iface. It seems like you code against a sub-type of Aimeos\MShop\Common\Item\Iface such as Aimeos\MShop\Product\Item\Iface or Aimeos\MShop\Service\Item\Iface or Aimeos\MShop\Order\Item\Base\Product\Iface or Aimeos\MShop\Locale\Item\Site\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Text\Item\Iface or Aimeos\MShop\Common\Item\Status\Iface or Aimeos\MShop\Media\Item\Iface or Aimeos\MShop\Subscription\Item\Iface or Aimeos\MShop\Coupon\Item\Iface or Aimeos\MAdmin\Job\Item\Iface or Aimeos\MShop\Common\Item\Lists\Iface or Aimeos\MShop\Price\Item\Iface or Aimeos\MShop\Locale\Item\Iface or Aimeos\MShop\Common\Item\Type\Iface or Aimeos\MShop\Attribute\Item\Iface or Aimeos\MShop\Locale\Item\Language\Iface or Aimeos\MShop\Catalog\Item\Iface or Aimeos\MShop\Plugin\Item\Iface or Aimeos\MShop\Supplier\Item\Iface or Aimeos\MShop\Locale\Item\Currency\Iface or Aimeos\MShop\Attribute\Item\Standard or Aimeos\MShop\Catalog\Item\Standard or Aimeos\MShop\Customer\Item\Base or Aimeos\MShop\Plugin\Item\Standard or Aimeos\MShop\Media\Item\Standard or Aimeos\MAdmin\Job\Item\Standard or Aimeos\MShop\Common\Item\Type\Standard or Aimeos\MShop\Subscription\Item\Standard or Aimeos\MShop\Locale\Item\Site\Standard or Aimeos\MShop\Locale\Item\Currency\Standard or Aimeos\MShop\Text\Item\Standard or Aimeos\MShop\Locale\Item\Language\Standard or Aimeos\MShop\Locale\Item\Standard or Aimeos\MShop\Common\Item\Lists\Standard or Aimeos\MShop\Service\Item\Standard or Aimeos\MShop\Price\Item\Base or Aimeos\MShop\Supplier\Item\Standard or Aimeos\MShop\Coupon\Item\Standard or Aimeos\MShop\Product\Item\Standard or Aimeos\MShop\Order\Item\Base\Product\Standard or Aimeos\MShop\Product\Item\Iface or Aimeos\MShop\Service\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Text\Item\Iface or Aimeos\MShop\Media\Item\Iface or Aimeos\MShop\Price\Item\Iface or Aimeos\MShop\Attribute\Item\Iface or Aimeos\MShop\Catalog\Item\Iface or Aimeos\MShop\Supplier\Item\Iface or Aimeos\MShop\Product\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Media\Item\Iface or Aimeos\MShop\Price\Item\Iface or Aimeos\MShop\Attribute\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Supplier\Item\Iface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

388
			/** @scrutinizer ignore-call */ 
389
   $struct->enabled = $item->getStatus();
Loading history...
389
			$struct->email = $email;
390
391
			$user = $service->loadUser( $item->getId() );
392
			$service->updateUser( $user, $struct );
393
		}
394
		else
395
		{
396
			$struct = $service->newUserCreateStruct( $item->getCode(), $email, $item->getPassword(), 'eng-GB' );
0 ignored issues
show
Bug introduced by
The method getCode() does not exist on Aimeos\MShop\Common\Item\Iface. It seems like you code against a sub-type of Aimeos\MShop\Common\Item\Iface such as Aimeos\MShop\Product\Item\Iface or Aimeos\MShop\Service\Item\Iface or Aimeos\MShop\Locale\Item\Site\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Order\Item\Base\Service\Iface or Aimeos\MShop\Customer\Item\Group\Iface or Aimeos\MShop\Order\Item\Base\Coupon\Iface or Aimeos\MShop\Common\Item\Type\Iface or Aimeos\MShop\Attribute\Item\Iface or Aimeos\MShop\Locale\Item\Language\Iface or Aimeos\MShop\Order\Item\...Service\Attribute\Iface or Aimeos\MShop\Catalog\Item\Iface or Aimeos\MShop\Order\Item\...Product\Attribute\Iface or Aimeos\MShop\Coupon\Item\Code\Iface or Aimeos\MShop\Supplier\Item\Iface or Aimeos\MShop\Locale\Item\Currency\Iface or Aimeos\MShop\Attribute\Item\Standard or Aimeos\MShop\Catalog\Item\Standard or Aimeos\MShop\Customer\Item\Base or Aimeos\MShop\Customer\Item\Group\Standard or Aimeos\MShop\Common\Item\Type\Standard or Aimeos\MShop\Locale\Item\Site\Standard or Aimeos\MShop\Locale\Item\Currency\Standard or Aimeos\MShop\Locale\Item\Language\Standard or Aimeos\MShop\Order\Item\Base\Service\Base or Aimeos\MShop\Service\Item\Standard or Aimeos\MShop\Order\Item\Base\Coupon\Standard or Aimeos\MShop\Coupon\Item\Code\Standard or Aimeos\MShop\Order\Item\...vice\Attribute\Standard or Aimeos\MShop\Supplier\Item\Standard or Aimeos\MShop\Product\Item\Standard or Aimeos\MShop\Order\Item\...duct\Attribute\Standard or Aimeos\MShop\Product\Item\Iface or Aimeos\MShop\Service\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Common\Item\Type\Iface or Aimeos\MShop\Attribute\Item\Iface or Aimeos\MShop\Locale\Item\Language\Iface or Aimeos\MShop\Common\Item\Tree\Iface or Aimeos\MShop\Supplier\Item\Iface or Aimeos\MShop\Locale\Item\Currency\Iface or Aimeos\MShop\Product\Item\Iface or Aimeos\MShop\Service\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Attribute\Item\Iface or Aimeos\MShop\Catalog\Item\Iface or Aimeos\MShop\Supplier\Item\Iface or Aimeos\MShop\Product\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Attribute\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Supplier\Item\Iface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

396
			$struct = $service->newUserCreateStruct( $item->/** @scrutinizer ignore-call */ getCode(), $email, $item->getPassword(), 'eng-GB' );
Loading history...
397
			$struct->enabled = $item->getStatus();
398
399
			$user = $service->createUser( $struct, [] );
400
			$item->setId( $user->getUserId() );
401
		}
402
403
		$dbm = $context->getDatabaseManager();
404
		$dbname = $this->getResourceName();
405
		$conn = $dbm->acquire( $dbname );
406
407
		try
408
		{
409
			$date = date( 'Y-m-d H:i:s' );
410
			$columns = $this->getObject()->getSaveAttributes();
0 ignored issues
show
Bug introduced by
The method getSaveAttributes() does not exist on Aimeos\MShop\Common\Manager\Iface. Did you maybe mean getSearchAttributes()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

410
			$columns = $this->getObject()->/** @scrutinizer ignore-call */ getSaveAttributes();

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
411
			$ctime = ( $item->getTimeCreated() ? $item->getTimeCreated() : $date );
412
			$billingAddress = $item->getPaymentAddress();
413
414
			$path = 'mshop/customer/manager/ezpublish/update';
415
			$sql = $this->addSqlColumns( array_keys( $columns ), $this->getSqlConfig( $path ), false );
416
			$stmt = $this->getCachedStatement( $conn, $path, $sql );
0 ignored issues
show
Unused Code introduced by
The assignment to $stmt is dead and can be removed.
Loading history...
417
418
			$idx = 1;
419
			$stmt = $this->getCachedStatement( $conn, $path, $sql );
420
421
			foreach( $columns as $name => $entry ) {
422
				$stmt->bind( $idx++, $item->get( $name ), $entry->getInternalType() );
0 ignored issues
show
Bug introduced by
The method get() does not exist on Aimeos\MShop\Common\Item\Iface. Did you maybe mean getId()? ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

422
				$stmt->bind( $idx++, $item->/** @scrutinizer ignore-call */ get( $name ), $entry->getInternalType() );

This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.

This is most likely a typographical error or the method has been renamed.

Loading history...
423
			}
424
425
			$stmt->bind( $idx++, $billingAddress->getCompany() );
426
			$stmt->bind( $idx++, $billingAddress->getVatID() );
427
			$stmt->bind( $idx++, $billingAddress->getSalutation() );
428
			$stmt->bind( $idx++, $billingAddress->getTitle() );
429
			$stmt->bind( $idx++, $billingAddress->getFirstname() );
430
			$stmt->bind( $idx++, $billingAddress->getLastname() );
431
			$stmt->bind( $idx++, $billingAddress->getAddress1() );
432
			$stmt->bind( $idx++, $billingAddress->getAddress2() );
433
			$stmt->bind( $idx++, $billingAddress->getAddress3() );
434
			$stmt->bind( $idx++, $billingAddress->getPostal() );
435
			$stmt->bind( $idx++, $billingAddress->getCity() );
436
			$stmt->bind( $idx++, $billingAddress->getState() );
437
			$stmt->bind( $idx++, $billingAddress->getCountryId() );
438
			$stmt->bind( $idx++, $billingAddress->getLanguageId() );
439
			$stmt->bind( $idx++, $billingAddress->getTelephone() );
440
			$stmt->bind( $idx++, $billingAddress->getTelefax() );
441
			$stmt->bind( $idx++, $billingAddress->getWebsite() );
442
			$stmt->bind( $idx++, $item->getBirthday() );
0 ignored issues
show
Bug introduced by
The method getBirthday() does not exist on Aimeos\MShop\Common\Item\Iface. It seems like you code against a sub-type of Aimeos\MShop\Common\Item\Iface such as Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Base or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

442
			$stmt->bind( $idx++, $item->/** @scrutinizer ignore-call */ getBirthday() );
Loading history...
443
			$stmt->bind( $idx++, $item->getDateVerified() );
0 ignored issues
show
Bug introduced by
The method getDateVerified() does not exist on Aimeos\MShop\Common\Item\Iface. It seems like you code against a sub-type of Aimeos\MShop\Common\Item\Iface such as Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Base or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface or Aimeos\MShop\Customer\Item\Iface. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

443
			$stmt->bind( $idx++, $item->/** @scrutinizer ignore-call */ getDateVerified() );
Loading history...
444
			$stmt->bind( $idx++, $date ); // Modification time
445
			$stmt->bind( $idx++, $context->getEditor() );
446
			$stmt->bind( $idx++, $ctime ); // Creation time
447
			$stmt->bind( $idx++, $item->getId(), \Aimeos\MW\DB\Statement\Base::PARAM_INT );
448
449
			$stmt->execute()->finish();
450
451
			$dbm->release( $conn, $dbname );
452
		}
453
		catch( \Exception $e )
454
		{
455
			$dbm->release( $conn, $dbname );
456
			throw $e;
457
		}
458
459
		$item = $this->savePropertyItems( $item, 'customer' );
460
		$item = $this->saveAddressItems( $item, 'customer' );
461
		return $this->saveListItems( $item, 'customer' );
462
	}
463
464
465
	/**
466
	 * Returns the item objects matched by the given search criteria.
467
	 *
468
	 * @param \Aimeos\MW\Criteria\Iface $search Search criteria object
469
	 * @param integer &$total Number of items that are available in total
470
	 * @return array List of items implementing \Aimeos\MShop\Customer\Item\Iface
471
	 * @throws \Aimeos\MShop\Customer\Exception If creating items failed
472
	 */
473
	public function searchItems( \Aimeos\MW\Criteria\Iface $search, array $ref = [], &$total = null )
474
	{
475
		$dbm = $this->getContext()->getDatabaseManager();
476
		$dbname = $this->getResourceName();
477
		$conn = $dbm->acquire( $dbname );
478
		$map = [];
479
480
		try
481
		{
482
			$level = \Aimeos\MShop\Locale\Manager\Base::SITE_ALL;
483
			$cfgPathSearch = 'mshop/customer/manager/ezpublish/search';
484
			$cfgPathCount = 'mshop/customer/manager/ezpublish/count';
485
			$required = array( 'customer' );
486
487
			$results = $this->searchItemsBase( $conn, $search, $cfgPathSearch, $cfgPathCount, $required, $total, $level );
488
489
			while( ( $row = $results->fetch() ) !== false )
490
			{
491
				$map[ $row['customer.id'] ] = $row;
492
				$map[ $row['customer.id'] ]['customer.groups'] = [];
493
			}
494
495
496
			$path = 'mshop/customer/manager/ezpublish/groups';
497
			$stmt = $conn->create( $this->getGroupSql( array_keys( $map ), $path ) );
498
			$results = $stmt->execute();
499
500
			while( ( $row = $results->fetch() ) !== false ) {
501
				$map[(string) $row['contentobject_id']]['customer.groups'][] = $row['role_id'];
502
			}
503
504
			$dbm->release( $conn, $dbname );
505
		}
506
		catch( \Exception $e )
507
		{
508
			$dbm->release( $conn, $dbname  );
509
			throw $e;
510
		}
511
512
		return $this->buildItems( $map, $ref, 'customer' );
513
	}
514
515
516
	/**
517
	 * Creates a new customer item.
518
	 *
519
	 * @param array $values List of attributes for customer item
520
	 * @param \Aimeos\MShop\Common\Lists\Item\Iface[] $listItems List of list items
521
	 * @param \Aimeos\MShop\Common\Item\Iface[] $refItems List of referenced items
522
	 * @param \Aimeos\MShop\Common\Item\Address\Iface[] $addrItems List of referenced address items
523
	 * @param \Aimeos\MShop\Common\Item\Property\Iface[] $propItems List of property items
524
	 * @return \Aimeos\MShop\Customer\Item\Iface New customer item
525
	 */
526
	protected function createItemBase( array $values = [], array $listItems = [], array $refItems = [],
527
		array $addrItems = [], array $propItems = [] )
528
	{
529
		$address = new \Aimeos\MShop\Common\Item\Address\Simple( 'customer.', $values );
530
531
		return new \Aimeos\MShop\Customer\Item\Ezpublish(
532
			$address, $values, $listItems, $refItems, $addrItems, $propItems
533
		);
534
	}
535
536
537
	/**
538
	 * Returns the SQL statement for retrieving the customer group IDs
539
	 *
540
	 * @param array $ids List of customer IDs
541
	 * @param string $cfgpath Configuration path to the SQL statement
542
	 * @return string SQL statement ready for execution
543
	 */
544
	protected function getGroupSql( array $ids, $cfgpath )
545
	{
546
		if( empty( $ids ) ) { return '1=1'; }
547
548
		$search = $this->getObject()->createSearch();
549
		$search->setConditions( $search->compare( '==', 'id', $ids ) );
550
551
		$types = array( 'id' => \Aimeos\MW\DB\Statement\Base::PARAM_INT );
552
		$translations = array( 'id' => '"contentobject_id"' );
553
554
		$cond = $search->getConditionSource( $types, $translations );
555
556
		return str_replace( ':cond', $cond, $this->getSqlConfig( $cfgpath ) );
557
	}
558
}
559