Passed
Push — master ( c76b2a...bbb2a4 )
by Aimeos
01:58 queued 11s
created

Ezpublish::__construct()   B

Complexity

Conditions 6
Paths 1

Size

Total Lines 37
Code Lines 20

Duplication

Lines 0
Ratio 0 %

Importance

Changes 3
Bugs 0 Features 0
Metric Value
cc 6
eloc 20
c 3
b 0
f 0
nc 1
nop 1
dl 0
loc 37
rs 8.9777
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
		$level = \Aimeos\MShop\Locale\Manager\Base::SITE_ALL;
256
		$level = $context->getConfig()->get( 'mshop/customer/manager/sitemode', $level );
257
258
		$siteIds = $this->getSiteIds( $level );
259
		$self = $this;
260
261
262
		$this->searchConfig['customer:has']['function'] = function( &$source, array $params ) use ( $self, $siteIds ) {
263
264
			foreach( $params as $key => $param ) {
265
				$params[$key] = trim( $param, '\'' );
266
			}
267
268
			$source = str_replace( ':site', $self->toExpression( 'ezuli_has."siteid"', $siteIds ), $source );
269
			$str = $self->toExpression( 'ezuli_has."key"', join( '|', $params ), isset( $params[2] ) ? '==' : '=~' );
270
			$source = str_replace( ':key', $str, $source );
271
272
			return $params;
273
		};
274
275
276
		$this->searchConfig['customer:prop']['function'] = function( &$source, array $params ) use ( $self, $siteIds ) {
277
278
			foreach( $params as $key => $param ) {
279
				$params[$key] = trim( $param, '\'' );
280
			}
281
282
			$params[2] = ( isset( $params[2] ) ? md5( $params[2] ) : null );
283
			$source = str_replace( ':site', $self->toExpression( 'ezupr_prop."siteid"', $siteIds ), $source );
284
			$str = $self->toExpression( 'ezupr_prop."key"', join( '|', $params ), isset( $params[2] ) ? '==' : '=~' );
285
			$source = str_replace( ':key', $str, $source );
286
287
			return $params;
288
		};
289
	}
290
291
292
	/**
293
	 * Removes old entries from the storage.
294
	 *
295
	 * @param array $siteids List of IDs for sites whose entries should be deleted
296
	 */
297
	public function clear( array $siteids )
298
	{
299
		$path = 'mshop/customer/manager/submanagers';
300
		foreach( $this->getContext()->getConfig()->get( $path, ['address', 'group', 'lists', 'property'] ) as $domain ) {
301
			$this->getObject()->getSubManager( $domain )->clear( $siteids );
302
		}
303
	}
304
305
306
	/**
307
	 * Removes multiple items specified by ids in the array.
308
	 *
309
	 * @param array $ids List of IDs
310
	 */
311
	public function deleteItems( array $ids )
312
	{
313
		$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

313
		$service = $this->getContext()->/** @scrutinizer ignore-call */ getEzUserService();
Loading history...
314
315
		foreach( $ids as $id ) {
316
			$service->deleteUser( $service->loadUser( $id ) );
317
		}
318
	}
319
320
321
	/**
322
	 * Returns the list attributes that can be used for searching.
323
	 *
324
	 * @param boolean $withsub Return also attributes of sub-managers if true
325
	 * @return array List of attribute items implementing \Aimeos\MW\Criteria\Attribute\Iface
326
	 */
327
	public function getSearchAttributes( $withsub = true )
328
	{
329
		$path = 'mshop/customer/manager/submanagers';
330
331
		return $this->getSearchAttributesBase( $this->searchConfig, $path, ['address', 'group', 'lists', 'property'], $withsub );
332
	}
333
334
335
	/**
336
	 * Returns a new manager for customer extensions
337
	 *
338
	 * @param string $manager Name of the sub manager type in lower case
339
	 * @param string|null $name Name of the implementation, will be from configuration (or Default) if null
340
	 * @return mixed Manager for different extensions, e.g stock, tags, locations, etc.
341
	 */
342
	public function getSubManager( $manager, $name = null )
343
	{
344
		return $this->getSubManagerBase( 'customer', $manager, ( $name === null ? 'Ezpublish' : $name ) );
345
	}
346
347
348
	/**
349
	 * Saves a customer item object.
350
	 *
351
	 * @param \Aimeos\MShop\Customer\Item\Iface $item Customer item object
352
	 * @param boolean $fetch True if the new ID should be returned in the item
353
	 * @return \Aimeos\MShop\Customer\Item\Iface $item Updated item including the generated ID
354
	 */
355
	public function saveItem( \Aimeos\MShop\Customer\Item\Iface $item, $fetch = true )
356
	{
357
		if( !$item->isModified() )
358
		{
359
			$item = $this->savePropertyItems( $item, 'customer' );
360
			$item = $this->saveAddressItems( $item, 'customer' );
361
			return $this->saveListItems( $item, 'customer' );
362
		}
363
364
		$context = $this->getContext();
365
366
		$class = '\Aimeos\MShop\Context\Item\Ezpublish';
367
		if( !is_a( $context, $class ) ) {
368
			throw new \Aimeos\MShop\Customer\Exception( sprintf( 'Object is not of required type "%1$s"', $class ) );
369
		}
370
371
		$service = $context->getEzUserService();
372
		$email = $item->getPaymentAddress()->getEmail();
373
374
		if( $item->getId() !== null )
375
		{
376
			$struct = $service->newUserUpdateStruct();
377
			$struct->password = $item->getPassword();
378
			$struct->enabled = $item->getStatus();
379
			$struct->email = $email;
380
381
			$user = $service->loadUser( $item->getId() );
382
			$service->updateUser( $user, $struct );
383
		}
384
		else
385
		{
386
			$struct = $service->newUserCreateStruct( $item->getCode(), $email, $item->getPassword(), 'eng-GB' );
387
			$struct->enabled = $item->getStatus();
388
389
			$user = $service->createUser( $struct, [] );
390
			$item->setId( $user->getUserId() );
391
		}
392
393
		$dbm = $context->getDatabaseManager();
394
		$dbname = $this->getResourceName();
395
		$conn = $dbm->acquire( $dbname );
396
397
		try
398
		{
399
			$date = date( 'Y-m-d H:i:s' );
400
			$columns = $this->getObject()->getSaveAttributes();
401
			$ctime = ( $item->getTimeCreated() ? $item->getTimeCreated() : $date );
402
			$billingAddress = $item->getPaymentAddress();
403
404
			$path = 'mshop/customer/manager/ezpublish/update';
405
			$sql = $this->addSqlColumns( array_keys( $columns ), $this->getSqlConfig( $path ), false );
406
			$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...
407
408
			$idx = 1;
409
			$stmt = $this->getCachedStatement( $conn, $path, $sql );
410
411
			foreach( $columns as $name => $entry ) {
412
				$stmt->bind( $idx++, $item->get( $name ), $entry->getInternalType() );
413
			}
414
415
			$stmt->bind( $idx++, $billingAddress->getCompany() );
416
			$stmt->bind( $idx++, $billingAddress->getVatID() );
417
			$stmt->bind( $idx++, $billingAddress->getSalutation() );
418
			$stmt->bind( $idx++, $billingAddress->getTitle() );
419
			$stmt->bind( $idx++, $billingAddress->getFirstname() );
420
			$stmt->bind( $idx++, $billingAddress->getLastname() );
421
			$stmt->bind( $idx++, $billingAddress->getAddress1() );
422
			$stmt->bind( $idx++, $billingAddress->getAddress2() );
423
			$stmt->bind( $idx++, $billingAddress->getAddress3() );
424
			$stmt->bind( $idx++, $billingAddress->getPostal() );
425
			$stmt->bind( $idx++, $billingAddress->getCity() );
426
			$stmt->bind( $idx++, $billingAddress->getState() );
427
			$stmt->bind( $idx++, $billingAddress->getCountryId() );
428
			$stmt->bind( $idx++, $billingAddress->getLanguageId() );
429
			$stmt->bind( $idx++, $billingAddress->getTelephone() );
430
			$stmt->bind( $idx++, $billingAddress->getTelefax() );
431
			$stmt->bind( $idx++, $billingAddress->getWebsite() );
432
			$stmt->bind( $idx++, $item->getBirthday() );
433
			$stmt->bind( $idx++, $item->getDateVerified() );
434
			$stmt->bind( $idx++, $date ); // Modification time
435
			$stmt->bind( $idx++, $context->getEditor() );
436
			$stmt->bind( $idx++, $ctime ); // Creation time
437
			$stmt->bind( $idx++, $item->getId(), \Aimeos\MW\DB\Statement\Base::PARAM_INT );
438
439
			$stmt->execute()->finish();
440
441
			$dbm->release( $conn, $dbname );
442
		}
443
		catch( \Exception $e )
444
		{
445
			$dbm->release( $conn, $dbname );
446
			throw $e;
447
		}
448
449
		$item = $this->savePropertyItems( $item, 'customer' );
450
		$item = $this->saveAddressItems( $item, 'customer' );
451
		return $this->saveListItems( $item, 'customer' );
452
	}
453
454
455
	/**
456
	 * Returns the item objects matched by the given search criteria.
457
	 *
458
	 * @param \Aimeos\MW\Criteria\Iface $search Search criteria object
459
	 * @param integer &$total Number of items that are available in total
460
	 * @return array List of items implementing \Aimeos\MShop\Customer\Item\Iface
461
	 * @throws \Aimeos\MShop\Customer\Exception If creating items failed
462
	 */
463
	public function searchItems( \Aimeos\MW\Criteria\Iface $search, array $ref = [], &$total = null )
464
	{
465
		$dbm = $this->getContext()->getDatabaseManager();
466
		$dbname = $this->getResourceName();
467
		$conn = $dbm->acquire( $dbname );
468
		$map = [];
469
470
		try
471
		{
472
			$level = \Aimeos\MShop\Locale\Manager\Base::SITE_ALL;
473
			$cfgPathSearch = 'mshop/customer/manager/ezpublish/search';
474
			$cfgPathCount = 'mshop/customer/manager/ezpublish/count';
475
			$required = array( 'customer' );
476
477
			$results = $this->searchItemsBase( $conn, $search, $cfgPathSearch, $cfgPathCount, $required, $total, $level );
478
479
			while( ( $row = $results->fetch() ) !== false )
480
			{
481
				$map[$row['customer.id']] = $row;
482
				$map[$row['customer.id']]['customer.groups'] = [];
483
			}
484
485
486
			$path = 'mshop/customer/manager/ezpublish/groups';
487
			$stmt = $conn->create( $this->getGroupSql( array_keys( $map ), $path ) );
488
			$results = $stmt->execute();
489
490
			while( ( $row = $results->fetch() ) !== false ) {
491
				$map[(string) $row['contentobject_id']]['customer.groups'][] = $row['role_id'];
492
			}
493
494
			$dbm->release( $conn, $dbname );
495
		}
496
		catch( \Exception $e )
497
		{
498
			$dbm->release( $conn, $dbname );
499
			throw $e;
500
		}
501
502
		$addrItems = [];
503
		if( in_array( 'customer/address', $ref, true ) ) {
504
			$addrItems = $this->getAddressItems( array_keys( $map ), 'customer' );
505
		}
506
507
		$propItems = []; $name = 'customer/property';
508
		if( isset( $ref[$name] ) || in_array( $name, $ref, true ) )
509
		{
510
			$propTypes = isset( $ref[$name] ) && is_array( $ref[$name] ) ? $ref[$name] : null;
511
			$propItems = $this->getPropertyItems( array_keys( $map ), 'customer', $propTypes );
512
		}
513
514
		return $this->buildItems( $map, $ref, 'customer', 'customer', $addrItems, $propItems );
0 ignored issues
show
Unused Code introduced by
The call to Aimeos\MShop\Customer\Manager\Base::buildItems() has too many arguments starting with $propItems. ( Ignorable by Annotation )

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

514
		return $this->/** @scrutinizer ignore-call */ buildItems( $map, $ref, 'customer', 'customer', $addrItems, $propItems );

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. Please note the @ignore annotation hint above.

Loading history...
Bug introduced by
'customer' of type string is incompatible with the type array expected by parameter $local of Aimeos\MShop\Customer\Manager\Base::buildItems(). ( Ignorable by Annotation )

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

514
		return $this->buildItems( $map, $ref, 'customer', /** @scrutinizer ignore-type */ 'customer', $addrItems, $propItems );
Loading history...
515
	}
516
517
518
	/**
519
	 * Creates a new customer item.
520
	 *
521
	 * @param array $values List of attributes for customer item
522
	 * @param \Aimeos\MShop\Common\Lists\Item\Iface[] $listItems List of list items
523
	 * @param \Aimeos\MShop\Common\Item\Iface[] $refItems List of referenced items
524
	 * @param \Aimeos\MShop\Common\Item\Address\Iface[] $addrItems List of referenced address items
525
	 * @param \Aimeos\MShop\Common\Item\Property\Iface[] $propItems List of property items
526
	 * @return \Aimeos\MShop\Customer\Item\Iface New customer item
527
	 */
528
	protected function createItemBase( array $values = [], array $listItems = [], array $refItems = [],
529
		array $addrItems = [], array $propItems = [] )
530
	{
531
		$address = new \Aimeos\MShop\Common\Item\Address\Simple( 'customer.', $values );
532
533
		return new \Aimeos\MShop\Customer\Item\Ezpublish(
534
			$address, $values, $listItems, $refItems, $addrItems, $propItems
535
		);
536
	}
537
538
539
	/**
540
	 * Returns the SQL statement for retrieving the customer group IDs
541
	 *
542
	 * @param array $ids List of customer IDs
543
	 * @param string $cfgpath Configuration path to the SQL statement
544
	 * @return string SQL statement ready for execution
545
	 */
546
	protected function getGroupSql( array $ids, $cfgpath )
547
	{
548
		if( empty( $ids ) ) { return '1=1'; }
549
550
		$search = $this->getObject()->createSearch();
551
		$search->setConditions( $search->compare( '==', 'id', $ids ) );
552
553
		$types = array( 'id' => \Aimeos\MW\DB\Statement\Base::PARAM_INT );
554
		$translations = array( 'id' => '"contentobject_id"' );
555
556
		$cond = $search->getConditionSource( $types, $translations );
557
558
		return str_replace( ':cond', $cond, $this->getSqlConfig( $cfgpath ) );
559
	}
560
}
561