Персонализация формы SAP Spartacus

#hybris #spartacus-storefront #sap-commerce-cloud

#java #angular #sap-коммерция-облако #spartacus-витрина магазина

Вопрос:

Мне нужно изменить форму регистрации, чтобы отобразить сообщение об ошибке, если на данный адрес электронной почты уже зарегистрирована учетная запись. Серверная часть SAP Hybris, витрина Spartacus в Angular. В настоящее время у меня есть пользовательский класс проверки, который работает правильно:

 import org.springframework.util.Assert;
import org.springframework.validation.Errors;
import org.springframework.validation.Validator;
    public class EmailExistingValidator implements Validator {
    /*
    ...
    */
        @Override
        public void validate(Object o, Errors errors) {
            Object fieldValue = errors.getFieldValue(this.fieldPath);
    
            if (fieldValue == null || fieldValue instanceof String amp;amp;userIdExists((String) fieldValue)) {
                errors.rejectValue(this.fieldPath, "field.required", new String[]{this.fieldPath}, "This email is already in use.");
            }
        }
    }
 

В этом случае на витрине магазина отображается красное сообщение об ошибке: «UID недействителен», но я хочу изменить его на «Адрес электронной почты недействителен или он уже используется».

Как я могу это сделать?

Поскольку я исследовал проблему, эта строка в витрине магазина происходит из константы с именем ValidationError.invalid.uid, расположенной в файле с именем spartacus-assets.js , вот так:

 invalid: {
                card_expirationMonth: 'The credit card expiration date entered is not valid.',
                firstName: 'First Name entered is not valid.',
                lastName: 'Last Name entered is not valid.',
                password: 'Password entered is not valid.',
                uid: 'UID is not valid.',
            },
 

Насколько я знаю, сообщения о подтверждении и / или ошибках заполняются как-то так (строка 6):

 handleValidationError(_request, response) {
    this.getErrors(response)
        .filter((e) => e.type === 'ValidationError')
        .forEach((error) => {
        this.globalMessageService.add({
            key: `httpHandlers.validationErrors.${error.reason}.${error.subject}`,
        }, GlobalMessageType.MSG_TYPE_ERROR);
    });
 

Они доступны из коробки, все расположены в node_modules, поэтому я не могу здесь что-то переписать, потому что после установки npm все они исчезнут.

Возможно ли изменить это сообщение? Есть ли какое-либо решение для решения этой проблемы? Я что-то пропустил или я ошибаюсь? Я приветствую любые комментарии, я очень новичок в SAP Commerce, как вы можете заметить.

Ответ №1:

В настоящее время логика обработки ошибок http централизована в классах HttpErrorHandler s.

Ошибки проверки http обрабатываются общим способом — тип ошибки и сообщение от серверной части преобразуются в ключ перевода интерфейса, затем переводятся для текущего языка и отображаются в компоненте глобального сообщения в интерфейсном интерфейсе. пользовательский интерфейс.

Если вы хотите по-другому обработать какую-то конкретную ошибку из какой-то конкретной конечной точки (например, показать пользовательское сообщение / использовать пользовательский ключ перевода), вы можете расширить метод BadRequestHandler.handleValidationError() или .handleError() .

Смотрите исходный код: https://github.com/SAP/spartacus/blob/1b22bf5376c1fc5a88877aaaf4682f1838347b90/projects/core/src/global-message/http-interceptors/handlers/bad-request/bad-request.handler.ts#L64-L78