Проверка компонента формы Hybris - PullRequest
0 голосов
/ 26 сентября 2018

Я написал пользовательский компонент, который является простой формой.После отправки формы, я хочу проверить форму и в случае ошибки, я хочу отобразить их.Я попытался создать метод с сопоставлением запросов POST в моем классе MyFormComponentController extends AbstractAcceleratorCMSComponentController<MyFormComponentModel>, но он выдает ошибку, в которой говорится, что метод недопустим.Поэтому я написал контроллер и добавил действие к своему компоненту формы

@Controller
@RequestMapping(value = "/action")
public class MyFormPageController extends AbstractPageController {

    @RequestMapping(method = RequestMethod.POST)
    public String doMyPageController(@Valid final MyForm myForm, final BindingResult bindingResult, final Model model)
            return ???; //..in case of error?

Но когда в моей форме есть ошибка, и я не хочу возвращаться, возвращается к виду, отображается только компонент.Я пытался передать туда значение, которое я получил от метода getView() в моем компонентном контроллере, но это не помогло.

РЕДАКТИРОВАТЬ: Я также пытался сделать отправку формы с помощью вызова ajax, например:

$(document).on("submit",'#myForm', function(e){
            e.preventDefault();
            var postData = $("#myForm").serialize();
            var url= $(".js-my-action").data("url");
            $.ajax({
                url: url,
                data: JSON.stringify(postData),
                type: "POST",
                success: function (response){
                }
            });
        })

и метод, который я хочу вызвать:

@RequestMapping(value = "/action", method = RequestMethod.POST)
    public String doMyPageController(@RequestBody @Valid final MyForm catalogOrderForm, final Model model) throws IOException, JaloBusinessException, CMSItemNotFoundException {

Здесь я попытался изменить @RequestBody на @ModelAttribute с именем формы, но я получаю только Acces denied (CSRFToken)ошибка:

ERROR [hybrisHTTP24] [SikoAcceleratorAccessDeniedHandler] Access denied happend - org.springframework.security.web.csrf.InvalidCsrfTokenException: Invalid CSRF Token '66d045fd-c9ae-4210-ae97-f2a0e739bcbf"' was found on the request parameter 'CSRFToken' or header 'CSRFToken'.

Данные, которые я передаю в вызове ajax:

"firstName=Test&lastName=Test&street=Test&city=Test&postalCode=38801&email=test%40test.com&_inspiration=on&_kitchen=on&_door=on&_gdpr=on&CSRFToken=66d045fd-c9ae-4210-ae97-f2a0e739bcbf"

Затем я попытался передать данные в вызове ajax, как:

data: {myForm: postData}

но это тоже не сработало.

Ответы [ 4 ]

0 голосов
/ 26 сентября 2018

Использование форм в компоненте CMS является сложной задачей.Решение может зависеть от вашего варианта использования.Вот несколько решений, которые я видел до сих пор:

Использовать компонент только для определенных URL / страниц Рассмотрим страницу корзины.Есть много форм.Они предназначены только для использования на странице корзины (/ cart).Вы также можете определить страницу содержимого для просмотра в случае неудачи / успеха.Страница поиска будет примером для этого.Когда вы используете поисковый компонент, вы всегда будете перенаправлены на страницу поиска / поиск пустой страницы при вводе условия поиска.

Использовать информацию реферера Компонент входа в систему использует немного более интеллектуальный подход.Когда вы входите с определенной страницы (например, страницы продукта), контроллер входа проверяет URL-адрес реферера и перенаправляет на страницу, которую вы посетили ранее.

Параметр в форме для URL Некоторые решения добавляютдополнительный строковый параметр к форме для хранения текущего URL.Я также видел решения, где параметр хранится в сеансе с использованием SessionService.Это решение, однако, имеет тот недостаток, что в течение одного сеанса может использоваться только одна форма.

Настройка для каждого компонента CMS, где он используется и где он перенаправляется на успех / сбой Также можно определить определенную страницу содержимого / URL-адрес для отображения после успеха / сбоя.В этом случае у вас может быть несколько экземпляров этого компонента, которые все перенаправляют на определенную страницу в случае успеха / неудачи.

Использовать AJAX Другое решение - отправить форму с использованием AJAX и обработать ошибку /Успешные действия в JavaScript.

Могут быть другие и более допустимые реализации.Пожалуйста, поделитесь своими мыслями со мной.

0 голосов
/ 26 сентября 2018

Поскольку вы используете Spring, ответом будет умопомрачительно легко :

На вашем контроллере поместите @Valid аннотацию

Это приведет к ошибке 400должен быть возвращен с вашего контроллера вместе с полезной нагрузкой JSON, в которой указана точная причина ошибки для каждой обнаруженной ошибки.

См. Преобразование и проверка типов Spring 3

0 голосов
/ 26 сентября 2018

Компонент на разных страницах - Поскольку вы создали компонент для визуализации формы, я надеюсь, что вы захотите использовать этот компонент на нескольких страницах.В этом случае вы не можете вернуть любой вид жесткого кода, потому что форму можно отправить с любой страницы (вид).Что бы я предложил для обработки отправки формы через вызов ajax.

Компонент на отдельных страницах - Если вы знаете, что этот компонент будет использоваться на одной странице.Затем вы можете просто использовать обычную отправку страниц и вернуть этот просмотр страницы с вашего контроллера.Здесь вам не требуется использовать AJAX.


Предложение:

Вместо создания пользовательского компонента только для вашей формы, вы можете создать экземпляр JspIncludeComponent и укажите свой JSP / VIEW.

Как и

$contentCatalog=yourContentCatalog
$contentCV=catalogVersion(catalog(id[default=$contentCatalog]),version[default='Staged'])

INSERT_UPDATE JspIncludeComponent ; $contentCV[unique=true] ; uid[unique=true]    ; name                  ; page                                          
                                  ;                         ; formComponent       ; Form Component        ; /WEB-INF/views/desktop/pages/form/newsForm.jsp 

РЕДАКТИРОВАТЬ:

Ошибка отказа в доступе (CSRFToken) - Hybris Commerce предоставляет механизм защиты CSRF, то естьвключен по умолчанию.CSRFHandlerInterceptor проверяет каждый запрос POST для токена CSRF.Чтобы обойти проверку CSRF для любого запроса, вы можете добавить шаблон URL в список csrfAllowedUrlPatterns.

Чтобы решить вашу проблему, просто используйте пружинную форму, которая отображает CSRFToken в скрытом поле.Теперь вы можете отправить всю форму, используя form.serialize().

JSP:

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>

    <form:form id="myForm" action="${myFormActionURL}" method="POST" modelAttribute="myForm">
        <input type="text" placeholder="<spring:theme code="myform.firstName"/>" name="fname" required>
         ...
    </form:form>

AJAX:

var form = $("#myForm");
    $.ajax({
        url: url,
        data: form.serialize(),
        type: 'POST',
        success: function (data) {

        },
        error: function (data) {

        }
    });

Контроллер:

@SuppressWarnings("boxing")
@ResponseBody
@RequestMapping(value = "/myForm", method = RequestMethod.POST)
public String saveMyForm(@Valid @ModelAttribute("myForm") final MyForm myForm, final Model model)
{
        return "succcess";
}
0 голосов
/ 26 сентября 2018

Вы можете использовать ResponseEntity в качестве типа возврата.

@RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<string> doMyPageController...
        return new ResponseEntity<"Error message" , HttpStatus.BAD_REQUEST>

Вам необходимо обработать этот ответ в файле jsp.У Accelerator есть несколько тегов для обработки этих ответов, вы можете проверить шаблон магазина.

...