Completed
Push — master ( 702095...b9dfd2 )
by Aimeos
02:26
created

Ezpublish   A

Complexity

Total Complexity 23

Size/Duplication

Total Lines 459
Duplicated Lines 0 %

Coupling/Cohesion

Components 2
Dependencies 1

Importance

Changes 4
Bugs 0 Features 1
Metric Value
wmc 23
c 4
b 0
f 1
lcom 2
cbo 1
dl 0
loc 459
rs 10

9 Methods

Rating   Name   Duplication   Size   Complexity  
A cleanup() 0 7 2
A createItem() 0 4 1
A deleteItems() 0 8 2
A getSearchAttributes() 0 6 1
A getSubManager() 0 4 2
C saveItem() 0 85 7
B searchItems() 0 41 4
A createItemBase() 0 10 2
A getGroupSql() 0 14 2
1
<?php
2
3
/**
4
 * @license LGPLv3, http://opensource.org/licenses/LGPL-3.0
5
 * @copyright Aimeos (aimeos.org), 2016
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
	);
222
223
	private $addressManager;
224
225
226
	/**
227
	 * Removes old entries from the storage.
228
	 *
229
	 * @param array $siteids List of IDs for sites whose entries should be deleted
230
	 */
231
	public function cleanup( array $siteids )
232
	{
233
		$path = 'mshop/customer/manager/submanagers';
234
		foreach( $this->getContext()->getConfig()->get( $path, array( 'address', 'lists' ) ) as $domain ) {
235
			$this->getSubManager( $domain )->cleanup( $siteids );
236
		}
237
	}
238
239
240
	/**
241
	 * Instantiates a new customer item object.
242
	 *
243
	 * @return \Aimeos\MShop\Customer\Item\Iface New customer item object
244
	 */
245
	public function createItem()
246
	{
247
		return $this->createItemBase();
248
	}
249
250
251
	/**
252
	 * Removes multiple items specified by ids in the array.
253
	 *
254
	 * @param array $ids List of IDs
255
	 */
256
	public function deleteItems( array $ids )
257
	{
258
		$service = $this->getContext()->getEzUserService();
259
260
		foreach( $ids as $id ) {
261
			$service->deleteUser( $service->loadUser( $id ) );
262
		}
263
	}
264
265
266
	/**
267
	 * Returns the list attributes that can be used for searching.
268
	 *
269
	 * @param boolean $withsub Return also attributes of sub-managers if true
270
	 * @return array List of attribute items implementing \Aimeos\MW\Criteria\Attribute\Iface
271
	 */
272
	public function getSearchAttributes( $withsub = true )
273
	{
274
		$path = 'mshop/customer/manager/submanagers';
275
276
		return $this->getSearchAttributesBase( $this->searchConfig, $path, array( 'address', 'lists' ), $withsub );
277
	}
278
279
280
	/**
281
	 * Returns a new manager for customer extensions
282
	 *
283
	 * @param string $manager Name of the sub manager type in lower case
284
	 * @param string|null $name Name of the implementation, will be from configuration (or Default) if null
285
	 * @return mixed Manager for different extensions, e.g stock, tags, locations, etc.
286
	 */
287
	public function getSubManager( $manager, $name = null )
288
	{
289
		return $this->getSubManagerBase( 'customer', $manager, ( $name === null ? 'Ezpublish' : $name ) );
290
	}
291
292
293
	/**
294
	 * Saves a customer item object.
295
	 *
296
	 * @param \Aimeos\MShop\Customer\Item\Iface $item Customer item object
297
	 * @param boolean $fetch True if the new ID should be returned in the item
298
	 */
299
	public function saveItem( \Aimeos\MShop\Common\Item\Iface $item, $fetch = true )
300
	{
301
		$iface = '\\Aimeos\\MShop\\Customer\\Item\\Iface';
302
		if( !( $item instanceof $iface ) ) {
303
			throw new \Aimeos\MShop\Customer\Exception( sprintf( 'Object is not of required type "%1$s"', $iface ) );
304
		}
305
306
		if( !$item->isModified() ) { return; }
307
308
		$context = $this->getContext();
309
310
		$class = '\Aimeos\MShop\Context\Item\Ezpublish';
311
		if( !is_a( $context, $class ) ) {
312
			throw new \Aimeos\MShop\Customer\Exception( sprintf( 'Object is not of required type "%1$s"', $class ) );
313
		}
314
315
		$service = $context->getEzUserService();
316
		$email = $item->getPaymentAddress()->getEmail();
317
318
		if( $item->getId() !== null )
319
		{
320
			$struct = $service->newUserUpdateStruct();
321
			$struct->password = $item->getPassword();
322
			$struct->enabled = $item->getStatus();
323
			$struct->email = $email;
324
325
			$user = $service->loadUser( $item->getId() );
326
			$service->updateUser( $user, $struct );
327
		}
328
		else
329
		{
330
			$struct = $service->newUserCreateStruct( $item->getCode(), $email, $item->getPassword(), 'eng-GB' );
331
			$struct->enabled = $item->getStatus();
332
333
			$user = $service->createUser( $struct, array() );
334
			$item->setId( $user->getUserId() );
335
		}
336
337
		$dbm = $context->getDatabaseManager();
338
		$dbname = $this->getResourceName();
339
		$conn = $dbm->acquire( $dbname );
340
341
		try
342
		{
343
			$date = date( 'Y-m-d H:i:s' );
344
			$ctime = ( $item->getTimeCreated() ? $item->getTimeCreated() : $date );
345
			$billingAddress = $item->getPaymentAddress();
346
347
			$path = 'mshop/customer/manager/ezpublish/update';
348
			$stmt = $this->getCachedStatement( $conn, $path );
349
350
			$stmt->bind( 1, $billingAddress->getCompany() );
351
			$stmt->bind( 2, $billingAddress->getVatID() );
352
			$stmt->bind( 3, $billingAddress->getSalutation() );
353
			$stmt->bind( 4, $billingAddress->getTitle() );
354
			$stmt->bind( 5, $billingAddress->getFirstname() );
355
			$stmt->bind( 6, $billingAddress->getLastname() );
356
			$stmt->bind( 7, $billingAddress->getAddress1() );
357
			$stmt->bind( 8, $billingAddress->getAddress2() );
358
			$stmt->bind( 9, $billingAddress->getAddress3() );
359
			$stmt->bind( 10, $billingAddress->getPostal() );
360
			$stmt->bind( 11, $billingAddress->getCity() );
361
			$stmt->bind( 12, $billingAddress->getState() );
362
			$stmt->bind( 13, $billingAddress->getCountryId() );
363
			$stmt->bind( 14, $billingAddress->getLanguageId() );
364
			$stmt->bind( 15, $billingAddress->getTelephone() );
365
			$stmt->bind( 16, $billingAddress->getTelefax() );
366
			$stmt->bind( 17, $billingAddress->getWebsite() );
367
			$stmt->bind( 18, $item->getBirthday() );
368
			$stmt->bind( 19, $item->getDateVerified() );
369
			$stmt->bind( 20, $date ); // Modification time
370
			$stmt->bind( 21, $context->getEditor() );
371
			$stmt->bind( 22, $ctime ); // Creation time
372
			$stmt->bind( 23, $item->getId(), \Aimeos\MW\DB\Statement\Base::PARAM_INT );
373
374
			$stmt->execute()->finish();
375
376
			$dbm->release( $conn, $dbname );
377
		}
378
		catch( \Exception $e )
379
		{
380
			$dbm->release( $conn, $dbname );
381
			throw $e;
382
		}
383
	}
384
385
386
	/**
387
	 * Returns the item objects matched by the given search criteria.
388
	 *
389
	 * @param \Aimeos\MW\Criteria\Iface $search Search criteria object
390
	 * @param integer &$total Number of items that are available in total
391
	 * @return array List of items implementing \Aimeos\MShop\Customer\Item\Iface
392
	 * @throws \Aimeos\MShop\Customer\Exception If creating items failed
393
	 */
394
	public function searchItems( \Aimeos\MW\Criteria\Iface $search, array $ref = array(), &$total = null )
395
	{
396
		$dbm = $this->getContext()->getDatabaseManager();
397
		$dbname = $this->getResourceName();
398
		$conn = $dbm->acquire( $dbname );
399
		$map = array();
400
401
		try
402
		{
403
			$level = \Aimeos\MShop\Locale\Manager\Base::SITE_ALL;
404
			$cfgPathSearch = 'mshop/customer/manager/ezpublish/search';
405
			$cfgPathCount = 'mshop/customer/manager/ezpublish/count';
406
			$required = array( 'customer' );
407
408
			$results = $this->searchItemsBase( $conn, $search, $cfgPathSearch, $cfgPathCount, $required, $total, $level );
409
410
			while( ( $row = $results->fetch() ) !== false )
411
			{
412
				$map[ $row['customer.id'] ] = $row;
413
				$map[ $row['customer.id'] ]['groups'] = array();
414
			}
415
416
417
			$path = 'mshop/customer/manager/ezpublish/groups';
418
			$stmt = $conn->create( $this->getGroupSql( array_keys( $map ), $path ) );
419
			$results = $stmt->execute();
420
421
			while( ( $row = $results->fetch() ) !== false ) {
422
				$map[ $row['contentobject_id'] ]['groups'][] = $row['role_id'];
423
			}
424
425
			$dbm->release( $conn, $dbname );
426
		}
427
		catch( \Exception $e )
428
		{
429
			$dbm->release( $conn, $dbname  );
430
			throw $e;
431
		}
432
433
		return $this->buildItems( $map, $ref, 'customer' );
434
	}
435
436
437
	/**
438
	 * Creates a new customer item.
439
	 *
440
	 * @param array $values List of attributes for customer item
441
	 * @param array $listItems List items associated to the customer item
442
	 * @param array $refItems Items referenced by the customer item via the list items
443
	 * @return \Aimeos\MShop\Customer\Item\Iface New customer item
444
	 */
445
	protected function createItemBase( array $values = array(), array $listItems = array(), array $refItems = array() )
446
	{
447
		if( !isset( $this->addressManager ) ) {
448
			$this->addressManager = $this->getSubManager( 'address' );
449
		}
450
451
		$address = $this->addressManager->createItem();
452
453
		return new \Aimeos\MShop\Customer\Item\Ezpublish( $address, $values, $listItems, $refItems );
454
	}
455
456
457
	/**
458
	 * Returns the SQL statement for retrieving the customer group IDs
459
	 *
460
	 * @param array $ids List of customer IDs
461
	 * @param string $cfgpath Configuration path to the SQL statement
462
	 * @return string SQL statement ready for execution
463
	 */
464
	protected function getGroupSql( array $ids, $cfgpath )
465
	{
466
		if( empty( $ids ) ) { return '1=1'; }
467
468
		$search = $this->createSearch();
469
		$search->setConditions( $search->compare( '==', 'id', $ids ) );
470
471
		$types = array( 'id' => \Aimeos\MW\DB\Statement\Base::PARAM_INT );
472
		$translations = array( 'id' => '"contentobject_id"' );
473
474
		$cond = $search->getConditionString( $types, $translations );
475
476
		return str_replace( ':cond', $cond, $this->getSqlConfig( $cfgpath ) );
477
	}
478
}
479