| Total Complexity | 40 | 
| Total Lines | 553 | 
| Duplicated Lines | 0 % | 
| Changes | 16 | ||
| Bugs | 0 | Features | 0 | 
Complex classes like Ezpublish often do a lot of different things. To break such a class down, we need to identify a cohesive component within that class. A common approach to find such a component is to look for fields/methods that share the same prefixes, or suffixes.
Once you have determined the fields that belong together, you can apply the Extract Class refactoring. If the component makes sense as a sub-class, Extract Subclass is also a candidate, and is often faster.
While breaking up the class, it is a good idea to analyze how other classes use Ezpublish, and based on these observations, apply Extract Interface, too.
| 1 | <?php | ||
| 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' => ':site :key AND ezuli."id"', | ||
| 224 | 'internaldeps' => ['LEFT JOIN "ezuser_list" AS ezuli ON ( ezuli."parentid" = ezu."id" )'], | ||
| 225 | 'label' => 'Customer has list item, parameter(<domain>[,<list type>[,<reference ID>)]]', | ||
| 226 | 'type' => 'null', | ||
| 227 | 'internaltype' => 'null', | ||
| 228 | 'public' => false, | ||
| 229 | ), | ||
| 230 | 'customer:prop' => array( | ||
| 231 | 'code' => 'customer:prop()', | ||
| 232 | 'internalcode' => ':site :key AND ezupr."id"', | ||
| 233 | 'internaldeps' => ['LEFT JOIN "ezuser_property" AS ezupr ON ( ezupr."parentid" = ezu."id" )'], | ||
| 234 | 'label' => 'Customer has property item, parameter(<property type>[,<language code>[,<property value>]])', | ||
| 235 | 'type' => 'null', | ||
| 236 | 'internaltype' => 'null', | ||
| 237 | 'public' => false, | ||
| 238 | ), | ||
| 239 | ); | ||
| 240 | |||
| 241 | |||
| 242 | /** | ||
| 243 | * Initializes the object. | ||
| 244 | * | ||
| 245 | * @param \Aimeos\MShop\Context\Item\Iface $context Context object | ||
| 246 | */ | ||
| 247 | public function __construct( \Aimeos\MShop\Context\Item\Iface $context ) | ||
| 248 | 	{ | ||
| 249 | parent::__construct( $context ); | ||
| 250 | |||
| 251 | $level = \Aimeos\MShop\Locale\Manager\Base::SITE_ALL; | ||
| 252 | $level = $context->getConfig()->get( 'mshop/customer/manager/sitemode', $level ); | ||
| 253 | |||
| 254 | $siteIds = $this->getSiteIds( $level ); | ||
| 255 | $self = $this; | ||
| 256 | |||
| 257 | |||
| 258 | 		$this->searchConfig['customer:has']['function'] = function( &$source, array $params ) use ( $self, $siteIds ) { | ||
| 259 | |||
| 260 | 			array_walk_recursive( $params, function( &$v ) { | ||
| 261 | $v = trim( $v, '\'' ); | ||
| 262 | } ); | ||
| 263 | |||
| 264 | $keys = []; | ||
| 265 | $params[1] = isset( $params[1] ) ? $params[1] : ''; | ||
| 266 | $params[2] = isset( $params[2] ) ? $params[2] : ''; | ||
| 267 | |||
| 268 | 			foreach( (array) $params[2] as $id ) { | ||
| 269 | $keys[] = $params[0] . '|' . ( $params[1] ? $params[1] . '|' : '' ) . $id; | ||
| 270 | } | ||
| 271 | |||
| 272 | $sitestr = $siteIds ? $self->toExpression( 'ezuli."siteid"', $siteIds ) . ' AND' : ''; | ||
| 273 | $keystr = $self->toExpression( 'ezuli."key"', $keys, $params[2] !== '' ? '==' : '=~' ); | ||
| 274 | $source = str_replace( [':site', ':key'], [$sitestr, $keystr], $source ); | ||
| 275 | |||
| 276 | return $params; | ||
| 277 | }; | ||
| 278 | |||
| 279 | |||
| 280 | 		$this->searchConfig['customer:prop']['function'] = function( &$source, array $params ) use ( $self, $siteIds ) { | ||
| 281 | |||
| 282 | 			array_walk_recursive( $params, function( &$v ) { | ||
| 283 | $v = trim( $v, '\'' ); | ||
| 284 | } ); | ||
| 285 | |||
| 286 | $keys = []; | ||
| 287 | $params[1] = array_key_exists( 1, $params ) ? $params[1] : ''; | ||
| 288 | $params[2] = isset( $params[2] ) ? $params[2] : ''; | ||
| 289 | |||
| 290 | 			foreach( (array) $params[2] as $id ) { | ||
| 291 | $keys[] = $params[0] . '|' . ( $params[1] ? $params[1] . '|' : '' ) .( $id !== '' ? md5( $id ) : '' ); | ||
| 292 | } | ||
| 293 | |||
| 294 | $sitestr = $siteIds ? $self->toExpression( 'ezupr."siteid"', $siteIds ) . ' AND' : ''; | ||
| 295 | $keystr = $self->toExpression( 'ezupr."key"', $keys, $params[2] !== '' ? '==' : '=~' ); | ||
| 296 | $source = str_replace( [':site', ':key'], [$sitestr, $keystr], $source ); | ||
| 297 | |||
| 298 | return $params; | ||
| 299 | }; | ||
| 300 | } | ||
| 301 | |||
| 302 | |||
| 303 | /** | ||
| 304 | * Removes old entries from the storage. | ||
| 305 | * | ||
| 306 | * @param array $siteids List of IDs for sites whose entries should be deleted | ||
| 307 | */ | ||
| 308 | public function clear( array $siteids ) | ||
| 309 | 	{ | ||
| 310 | $path = 'mshop/customer/manager/submanagers'; | ||
| 311 | 		foreach( $this->getContext()->getConfig()->get( $path, ['address', 'group', 'lists', 'property'] ) as $domain ) { | ||
| 312 | $this->getObject()->getSubManager( $domain )->clear( $siteids ); | ||
| 313 | } | ||
| 314 | } | ||
| 315 | |||
| 316 | |||
| 317 | /** | ||
| 318 | * Removes multiple items. | ||
| 319 | * | ||
| 320 | * @param \Aimeos\MShop\Common\Item\Iface[]|string[] $itemIds List of item objects or IDs of the items | ||
| 321 | * @return \Aimeos\MShop\Common\Manager\Iface Manager object for chaining method calls | ||
| 322 | */ | ||
| 323 | public function deleteItems( array $itemIds ) | ||
| 324 | 	{ | ||
| 325 | $service = $this->getContext()->getEzUserService(); | ||
|  | |||
| 326 | |||
| 327 | 		foreach( $itemIds as $id ) { | ||
| 328 | $service->deleteUser( $service->loadUser( (string) $id ) ); | ||
| 329 | } | ||
| 330 | |||
| 331 | return $this->deleteRefItems( $itemIds ); | ||
| 332 | } | ||
| 333 | |||
| 334 | |||
| 335 | /** | ||
| 336 | * Returns the list attributes that can be used for searching. | ||
| 337 | * | ||
| 338 | * @param boolean $withsub Return also attributes of sub-managers if true | ||
| 339 | * @return array List of attribute items implementing \Aimeos\MW\Criteria\Attribute\Iface | ||
| 340 | */ | ||
| 341 | public function getSearchAttributes( $withsub = true ) | ||
| 342 | 	{ | ||
| 343 | $path = 'mshop/customer/manager/submanagers'; | ||
| 344 | |||
| 345 | return $this->getSearchAttributesBase( $this->searchConfig, $path, ['address', 'group', 'lists', 'property'], $withsub ); | ||
| 346 | } | ||
| 347 | |||
| 348 | |||
| 349 | /** | ||
| 350 | * Returns a new manager for customer extensions | ||
| 351 | * | ||
| 352 | * @param string $manager Name of the sub manager type in lower case | ||
| 353 | * @param string|null $name Name of the implementation, will be from configuration (or Default) if null | ||
| 354 | * @return mixed Manager for different extensions, e.g stock, tags, locations, etc. | ||
| 355 | */ | ||
| 356 | public function getSubManager( $manager, $name = null ) | ||
| 357 | 	{ | ||
| 358 | return $this->getSubManagerBase( 'customer', $manager, ( $name === null ? 'Ezpublish' : $name ) ); | ||
| 359 | } | ||
| 360 | |||
| 361 | |||
| 362 | /** | ||
| 363 | * Saves a customer item object. | ||
| 364 | * | ||
| 365 | * @param \Aimeos\MShop\Customer\Item\Iface $item Customer item object | ||
| 366 | * @param boolean $fetch True if the new ID should be returned in the item | ||
| 367 | * @return \Aimeos\MShop\Customer\Item\Iface $item Updated item including the generated ID | ||
| 368 | */ | ||
| 369 | public function saveItem( \Aimeos\MShop\Customer\Item\Iface $item, $fetch = true ) | ||
| 370 | 	{ | ||
| 371 | if( !$item->isModified() ) | ||
| 372 | 		{ | ||
| 373 | $item = $this->savePropertyItems( $item, 'customer' ); | ||
| 374 | $item = $this->saveAddressItems( $item, 'customer' ); | ||
| 375 | return $this->saveListItems( $item, 'customer' ); | ||
| 376 | } | ||
| 377 | |||
| 378 | $context = $this->getContext(); | ||
| 379 | |||
| 380 | $class = '\Aimeos\MShop\Context\Item\Ezpublish'; | ||
| 381 | 		if( !is_a( $context, $class ) ) { | ||
| 382 | throw new \Aimeos\MShop\Customer\Exception( sprintf( 'Object is not of required type "%1$s"', $class ) ); | ||
| 383 | } | ||
| 384 | |||
| 385 | $service = $context->getEzUserService(); | ||
| 386 | $email = $item->getPaymentAddress()->getEmail(); | ||
| 387 | |||
| 388 | if( $item->getId() !== null ) | ||
| 389 | 		{ | ||
| 390 | $struct = $service->newUserUpdateStruct(); | ||
| 391 | $struct->password = $item->getPassword(); | ||
| 392 | $struct->enabled = $item->getStatus(); | ||
| 393 | $struct->email = $email; | ||
| 394 | |||
| 395 | $user = $service->loadUser( $item->getId() ); | ||
| 396 | $service->updateUser( $user, $struct ); | ||
| 397 | } | ||
| 398 | else | ||
| 399 | 		{ | ||
| 400 | $struct = $service->newUserCreateStruct( $item->getCode(), $email, $item->getPassword(), 'eng-GB' ); | ||
| 401 | $struct->enabled = $item->getStatus(); | ||
| 402 | |||
| 403 | $user = $service->createUser( $struct, [] ); | ||
| 404 | $item->setId( $user->getUserId() ); | ||
| 405 | } | ||
| 406 | |||
| 407 | $dbm = $context->getDatabaseManager(); | ||
| 408 | $dbname = $this->getResourceName(); | ||
| 409 | $conn = $dbm->acquire( $dbname ); | ||
| 410 | |||
| 411 | try | ||
| 412 | 		{ | ||
| 413 | $date = date( 'Y-m-d H:i:s' ); | ||
| 414 | $columns = $this->getObject()->getSaveAttributes(); | ||
| 415 | $ctime = ( $item->getTimeCreated() ? $item->getTimeCreated() : $date ); | ||
| 416 | $billingAddress = $item->getPaymentAddress(); | ||
| 417 | |||
| 418 | $path = 'mshop/customer/manager/ezpublish/update'; | ||
| 419 | $sql = $this->addSqlColumns( array_keys( $columns ), $this->getSqlConfig( $path ), false ); | ||
| 420 | $stmt = $this->getCachedStatement( $conn, $path, $sql ); | ||
| 421 | |||
| 422 | $idx = 1; | ||
| 423 | $stmt = $this->getCachedStatement( $conn, $path, $sql ); | ||
| 424 | |||
| 425 | 			foreach( $columns as $name => $entry ) { | ||
| 426 | $stmt->bind( $idx++, $item->get( $name ), $entry->getInternalType() ); | ||
| 427 | } | ||
| 428 | |||
| 429 | $stmt->bind( $idx++, $billingAddress->getCompany() ); | ||
| 430 | $stmt->bind( $idx++, $billingAddress->getVatID() ); | ||
| 431 | $stmt->bind( $idx++, $billingAddress->getSalutation() ); | ||
| 432 | $stmt->bind( $idx++, $billingAddress->getTitle() ); | ||
| 433 | $stmt->bind( $idx++, $billingAddress->getFirstname() ); | ||
| 434 | $stmt->bind( $idx++, $billingAddress->getLastname() ); | ||
| 435 | $stmt->bind( $idx++, $billingAddress->getAddress1() ); | ||
| 436 | $stmt->bind( $idx++, $billingAddress->getAddress2() ); | ||
| 437 | $stmt->bind( $idx++, $billingAddress->getAddress3() ); | ||
| 438 | $stmt->bind( $idx++, $billingAddress->getPostal() ); | ||
| 439 | $stmt->bind( $idx++, $billingAddress->getCity() ); | ||
| 440 | $stmt->bind( $idx++, $billingAddress->getState() ); | ||
| 441 | $stmt->bind( $idx++, $billingAddress->getCountryId() ); | ||
| 442 | $stmt->bind( $idx++, $billingAddress->getLanguageId() ); | ||
| 443 | $stmt->bind( $idx++, $billingAddress->getTelephone() ); | ||
| 444 | $stmt->bind( $idx++, $billingAddress->getTelefax() ); | ||
| 445 | $stmt->bind( $idx++, $billingAddress->getWebsite() ); | ||
| 446 | $stmt->bind( $idx++, $item->getBirthday() ); | ||
| 447 | $stmt->bind( $idx++, $item->getDateVerified() ); | ||
| 448 | $stmt->bind( $idx++, $date ); // Modification time | ||
| 449 | $stmt->bind( $idx++, $context->getEditor() ); | ||
| 450 | $stmt->bind( $idx++, $ctime ); // Creation time | ||
| 451 | $stmt->bind( $idx++, $item->getId(), \Aimeos\MW\DB\Statement\Base::PARAM_INT ); | ||
| 452 | |||
| 453 | $stmt->execute()->finish(); | ||
| 454 | |||
| 455 | $dbm->release( $conn, $dbname ); | ||
| 456 | } | ||
| 457 | catch( \Exception $e ) | ||
| 458 | 		{ | ||
| 459 | $dbm->release( $conn, $dbname ); | ||
| 460 | throw $e; | ||
| 461 | } | ||
| 462 | |||
| 463 | $item = $this->savePropertyItems( $item, 'customer' ); | ||
| 464 | $item = $this->saveAddressItems( $item, 'customer' ); | ||
| 465 | return $this->saveListItems( $item, 'customer' ); | ||
| 466 | } | ||
| 467 | |||
| 468 | |||
| 469 | /** | ||
| 470 | * Returns the item objects matched by the given search criteria. | ||
| 471 | * | ||
| 472 | * @param \Aimeos\MW\Criteria\Iface $search Search criteria object | ||
| 473 | * @param integer &$total Number of items that are available in total | ||
| 474 | * @return array List of items implementing \Aimeos\MShop\Customer\Item\Iface | ||
| 475 | * @throws \Aimeos\MShop\Customer\Exception If creating items failed | ||
| 476 | */ | ||
| 477 | public function searchItems( \Aimeos\MW\Criteria\Iface $search, array $ref = [], &$total = null ) | ||
| 478 | 	{ | ||
| 479 | $dbm = $this->getContext()->getDatabaseManager(); | ||
| 480 | $dbname = $this->getResourceName(); | ||
| 481 | $conn = $dbm->acquire( $dbname ); | ||
| 482 | $map = []; | ||
| 483 | |||
| 484 | try | ||
| 485 | 		{ | ||
| 486 | $level = \Aimeos\MShop\Locale\Manager\Base::SITE_ALL; | ||
| 487 | $cfgPathSearch = 'mshop/customer/manager/ezpublish/search'; | ||
| 488 | $cfgPathCount = 'mshop/customer/manager/ezpublish/count'; | ||
| 489 | $required = array( 'customer' ); | ||
| 490 | |||
| 491 | $results = $this->searchItemsBase( $conn, $search, $cfgPathSearch, $cfgPathCount, $required, $total, $level ); | ||
| 492 | |||
| 493 | while( ( $row = $results->fetch() ) !== false ) | ||
| 494 | 			{ | ||
| 495 | $map[$row['customer.id']] = $row; | ||
| 496 | $map[$row['customer.id']]['customer.groups'] = []; | ||
| 497 | } | ||
| 498 | |||
| 499 | |||
| 500 | $path = 'mshop/customer/manager/ezpublish/groups'; | ||
| 501 | $stmt = $conn->create( $this->getGroupSql( array_keys( $map ), $path ) ); | ||
| 502 | $results = $stmt->execute(); | ||
| 503 | |||
| 504 | 			while( ( $row = $results->fetch() ) !== false ) { | ||
| 505 | $map[(string) $row['contentobject_id']]['customer.groups'][] = $row['role_id']; | ||
| 506 | } | ||
| 507 | |||
| 508 | $dbm->release( $conn, $dbname ); | ||
| 509 | } | ||
| 510 | catch( \Exception $e ) | ||
| 511 | 		{ | ||
| 512 | $dbm->release( $conn, $dbname ); | ||
| 513 | throw $e; | ||
| 514 | } | ||
| 515 | |||
| 516 | $addrItems = []; | ||
| 517 | 		if( in_array( 'customer/address', $ref, true ) ) { | ||
| 518 | $addrItems = $this->getAddressItems( array_keys( $map ), 'customer' ); | ||
| 519 | } | ||
| 520 | |||
| 521 | $propItems = []; $name = 'customer/property'; | ||
| 522 | if( isset( $ref[$name] ) || in_array( $name, $ref, true ) ) | ||
| 523 | 		{ | ||
| 524 | $propTypes = isset( $ref[$name] ) && is_array( $ref[$name] ) ? $ref[$name] : null; | ||
| 525 | $propItems = $this->getPropertyItems( array_keys( $map ), 'customer', $propTypes ); | ||
| 526 | } | ||
| 527 | |||
| 528 | return $this->buildItems( $map, $ref, 'customer', $addrItems, $propItems ); | ||
| 529 | } | ||
| 530 | |||
| 531 | |||
| 532 | /** | ||
| 533 | * Creates a new customer item. | ||
| 534 | * | ||
| 535 | * @param array $values List of attributes for customer item | ||
| 536 | * @param \Aimeos\MShop\Common\Lists\Item\Iface[] $listItems List of list items | ||
| 537 | * @param \Aimeos\MShop\Common\Item\Iface[] $refItems List of referenced items | ||
| 538 | * @param \Aimeos\MShop\Common\Item\Address\Iface[] $addrItems List of referenced address items | ||
| 539 | * @param \Aimeos\MShop\Common\Item\Property\Iface[] $propItems List of property items | ||
| 540 | * @return \Aimeos\MShop\Customer\Item\Iface New customer item | ||
| 541 | */ | ||
| 542 | protected function createItemBase( array $values = [], array $listItems = [], array $refItems = [], | ||
| 543 | array $addrItems = [], array $propItems = [] ) | ||
| 544 | 	{ | ||
| 545 | $address = new \Aimeos\MShop\Common\Item\Address\Simple( 'customer.', $values ); | ||
| 546 | |||
| 547 | return new \Aimeos\MShop\Customer\Item\Ezpublish( | ||
| 548 | $address, $values, $listItems, $refItems, $addrItems, $propItems | ||
| 549 | ); | ||
| 550 | } | ||
| 551 | |||
| 552 | |||
| 553 | /** | ||
| 554 | * Returns the SQL statement for retrieving the customer group IDs | ||
| 555 | * | ||
| 556 | * @param array $ids List of customer IDs | ||
| 557 | * @param string $cfgpath Configuration path to the SQL statement | ||
| 558 | * @return string SQL statement ready for execution | ||
| 559 | */ | ||
| 560 | protected function getGroupSql( array $ids, $cfgpath ) | ||
| 573 | } | ||
| 574 | } | ||
| 575 |