GX-Task #47214
Von Daniel Würdemann vor mehr als 8 Jahren aktualisiert
# Unterstützung der AddonValues für den CustomerService
Nach *Category-*, *Order-* und *ProductService* werden die AddonValues ab Gambio GX 3.1.1.0_BETA4 nun auch im *CustomerService* unterstützt.
Betroffene Dateien:
* GXMainComponents/Extensions/Customers/CreateAccountProcess.inc.php
* GXMainComponents/Extensions/Customers/CustomerInputToCollectionTransformer.inc.php
* GXMainComponents/Services/Core/Customer/Customer.inc.php
* GXMainComponents/Services/Core/Customer/CustomerAddonValueStorage.inc.php
* GXMainComponents/Services/Core/Customer/CustomerInputValidator.inc.php
* GXMainComponents/Services/Core/Customer/CustomerRegistrationInputValidatorService.inc.php
* GXMainComponents/Services/Core/Customer/CustomerRepository.inc.php
* GXMainComponents/Services/Core/Customer/CustomerService.inc.php
* GXMainComponents/Services/Core/Customer/CustomerServiceFactory.inc.php
* GXMainComponents/Services/Core/Customer/CustomerWriteService.inc.php
* GXMainComponents/Services/Core/Customer/Interfaces/CustomerInterface.inc.php
* GXMainComponents/Services/Core/Customer/Interfaces/CustomerServiceInterface.inc.php
* GXMainComponents/Services/Core/Customer/Interfaces/CustomerWriteServiceInterface.inc.php
* GXMainComponents/Services/System/AddonValue/AddonValueStorageFactory.inc.php
---
## CustomerInterface
Das ```CustomerInterface``` erweitert nun das ```AddonValueContainerInterface```.
---
## Customer
Die Klasse ```Customer``` implementiert nun folgende Methoden.
* ```getAddonValueContainerId()```
* ```getAddonValue(StringType $key)```
* ```getAddonValues()```
* ```setAddonValue(StringType $key, StringType $value)```
* ```addAddonValues(KeyValueCollection $keyValueCollection)```
* ```deleteAddonValue(StringType $key)```
```Customer::__construct()``` weist ```Customer::$addonValues``` eine leere *EditableKeyValueCollection* zu.
---
## CustomerService
### CustomerService::createNewCustomer
vorher:
```php
public function createNewCustomer(
CustomerEmailInterface $email,
CustomerPasswordInterface $password,
DateTime $dateOfBirth,
CustomerVatNumberInterface $vatNumber,
CustomerCallNumberInterface $telephoneNumber,
CustomerCallNumberInterface $faxNumber,
AddressBlockInterface $addressBlock);
```
nachher:
```php
public function createNewCustomer(
CustomerEmailInterface $email,
CustomerPasswordInterface $password,
DateTime $dateOfBirth,
CustomerVatNumberInterface $vatNumber,
CustomerCallNumberInterface $telephoneNumber,
CustomerCallNumberInterface $faxNumber,
AddressBlockInterface $addressBlock,
KeyValueCollection $addonValues);
```
Statt ```CustomerService```, der ```CustomerReadService``` und ```CustomerWriteService``` vereint, wird aktuell ```CustomerReadService``` bzw. ```CustomerWriteService``` verwendet.
---
## CustomerWriteService
### CustomerWriteService::createNewRegistree
vorher:
```php
public function createNewRegistree(
CustomerEmailInterface $email,
CustomerPasswordInterface $password,
DateTime $dateOfBirth,
CustomerVatNumberInterface $vatNumber,
CustomerCallNumberInterface $telephoneNumber,
CustomerCallNumberInterface $faxNumber,
AddressBlockInterface $addressBlock
);
```
nachher:
```php
public function createNewRegistree(
CustomerEmailInterface $email,
CustomerPasswordInterface $password,
DateTime $dateOfBirth,
CustomerVatNumberInterface $vatNumber,
CustomerCallNumberInterface $telephoneNumber,
CustomerCallNumberInterface $faxNumber,
AddressBlockInterface $addressBlock,
KeyValueCollection $addonValues
);
```
O.g. veränderte Methodenaufrufe befinden sich an folgenden Stellen:
* ```CreateAccountProcess::_saveRegistree```
* ```CustomersApiV2Controller::post```
* ```CustomerService::createNewCustomer```
### CustomerWriteService::createNewRegistree
vorher:
```php
public function createNewGuest(
CustomerEmailInterface $email,
DateTime $dateOfBirth,
CustomerVatNumberInterface $vatNumber,
CustomerCallNumberInterface $telephoneNumber,
CustomerCallNumberInterface $faxNumber,
AddressBlockInterface $addressBlock
);
```
nachher:
```php
public function createNewGuest(
CustomerEmailInterface $email,
DateTime $dateOfBirth,
CustomerVatNumberInterface $vatNumber,
CustomerCallNumberInterface $telephoneNumber,
CustomerCallNumberInterface $faxNumber,
AddressBlockInterface $addressBlock,
KeyValueCollection $addonValues
);
```
O.g. veränderte Methodenaufrufe befinden sich an folgenden Stellen:
* ```CreateAccountProcess::_saveGuest```
* ```CustomersApiV2Controller::post```
* ```CustomerService::createNewGuest```
* ```PayPalController::actionReturnFromECS```
---
## CustomerRepository
### CustomerRepository::__construct
vorher:
```php
public function __construct(
CustomerWriterInterface $customerWriter,
CustomerReaderInterface $customerReader,
CustomerDeleterInterface $customerDeleter,
CustomerAddressRepositoryInterface $customerAddressRepository,
AbstractCustomerFactory $customerFactory;
```
nachher:
```php
public function __construct(
CustomerWriterInterface $customerWriter,
CustomerReaderInterface $customerReader,
CustomerDeleterInterface $customerDeleter,
CustomerAddressRepositoryInterface $customerAddressRepository,
AbstractCustomerFactory $customerFactory,
AddonValueServiceInterface $addonValueService);
```
### CustomerRepository::store
Diese Methode ruft nun ```$this->addonValueService->storeAddonValues($customer);``` nach Speicherung des Customers auf.
### CustomerRepository::getCustomerById
Diese Methode ruft nun ```$this->addonValueService-> loadAddonValues($customer);``` nach Laden des Customers auf.
### CustomerRepository::getRegistreeByEmail
Diese Methode ruft nun ```$this->addonValueService-> loadAddonValues($customer);``` sofern ein Customer gefunden wurde.
### CustomerRepository::deleteCustomerById
Diese Methode ruft nun ```$this->addonValueService-> deleteAddonValues($customer);``` nach Löschung des Customers auf.
### CustomerRepository::deleteGuestByEmail
Diese Methode ruft nun ```$this->addonValueService-> deleteAddonValues($customer);``` auf.
### CustomerRepository::getGuestByEmail
Diese Methode ruft nun ```$this->addonValueService-> loadAddonValues($customer);``` sofern ein Customer gefunden wurde.
### CustomerRepository::filterCustomers
Diese Methode ruft nun ```$this->addonValueService-> loadAddonValues($customer);``` für alle gefundenen Customer Objekte.
---
## CustomerInputToCollectionTransformer
### CustomerInputToCollectionTransformer::_getCustomerCollectionFromInputArray###
Diese Methode ruf nun ```CustomerInputToCollectionTransformer::_getCustomerAddonValuesFromInputArray``` auf.
Der Zugriff auf die *addonValues* erfolgt über ```$customerCollection->getValue('addon_values');```.
### CustomerInputToCollectionTransformer::_getCustomerAddonValuesFromInputArray
Diese Methode wurde hinzugefügt und gibt eine leere *EditableKeyValueCollection* zurück.
Mittels Overload kann diese Methode überladen werden, um eine *EditableKeyValueCollection* mit bestimmte Daten aus dem Übergabeparameter ```$intputArray```(enthält ```$_POST```) zu erstellen und zurückzugeben. Diese *EditableKeyValueCollection* sollte alle *addonValues* enthalten, die während der Validierung und Registrierung verarbeitet werden sollen.
---
## CustomerRegistrationInputValidatorService
### CustomerRegistrationInputValidatorService::validateCustomerDataByArray
Diese Methode ruft nun ```CustomerInputValidator::validateAddonValues($inputArray['addon_values'])``` auf. In ```$inputArray['addon_values']```ist der Rückgabewert der Methode ```CustomerInputToCollectionTransformer::_getCustomerAddonValuesFromInputArray``` gespeichert.
---
## CustomerInputValidator::validateAddonValues
Diese Methode wurde hinzugefügt und gibt ```true``` zurück.
Mittels Overload kann hier eine eigene Validierung der *addonValues* implementiert werden.
## Beispiel
Im Anhang dieses Tickets befindet sich die Datei *AddonValues_CustomerService_Sample.zip* mit einem Beispiel, welches die Gast- und Kundenregistrierung um ein zusätzliches Formularelement inkl. Validierung erweitert und den Wert in die Tabelle *addon_values_storage* speichert.