Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF+RichFaces: Как перерендрить форму после ошибки валидации? / 17 сообщений из 17, страница 1 из 1
20.04.2012, 12:14:29
    #37762687
Африканец
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
Hi All,

Скорее всего, это ламерский вопрос, но я уже отчаялся с ним бороться, так что прошу не бить ногами.

Есть страница, на которой 2 панели в одной форме; в одной панели (objectsPanel) - таблица объектов, во второй (objectPanel) - поля для редактирования.

По линку из таблицы объектов загружается объект и рендрится вторая панель. Проблема в том, что после ошибке валидации во второй панели, при нажатии на линк не перерисовываюся заполненные поля второй панели. Если после ошибки валидации нажать кнопку "Reset" - все перерисовывается нормально.

Что я делаю не так?

Код: html
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
	
<a4j:outputPanel id="objectsPanel">
	<rich:dataTable id="objectsTable" width="700" var="record" rowKeyVar="recordNumber" value="#{documentTypeConfigBean.objects}">
                <rich:column>
                    <h:outputText value="#{recordNumber+1}" />
                </rich:column>
                <rich:column>
                    <h:outputText value="#{record.id}"/>
                </rich:column>
                <rich:column>
                    <h:outputText value="#{record.names['en']}"/>
                </rich:column>
                <rich:column>
		    <a4j:commandLink execute="@this" render="objectPanel" action="#{documentTypeConfigBean.loadObject}" immediate="true">
                        <h:graphicImage value="/images/icons/edit.gif" alt="Edit Document Type" />
	                <a4j:param value="#{record.id}" assignTo="#{documentTypeConfigBean.objectId}" />
	            </a4j:commandLink>					
                </rich:column>
	</rich:dataTable>
</a4j:outputPanel>

<a4j:outputPanel id="objectPanel">
	<h:messages/>
	<br/>
	<h:panelGrid columns="2">
		<h:outputText value="Doc.Type Id"/>
		<h:inputText id="objectId" 
			value="#{documentTypeConfigBean.object.id}" 
			readonly="#{!empty documentTypeConfigBean.object.id}"
			required="true"
			requiredMessage="Doc.Type Id is required">
		</h:inputText>
	</h:panelGrid>
	<fieldset>
            <legend><b>Names</b></legend>
            <h:panelGrid columns="3">
            	<c:forEach items="#{languages}" var="language">
            		<h:outputText value="#{language.name}"/>
            		<h:inputText value="#{documentTypeConfigBean.object.names[language.id]}" 
            					size="30"
            					required="true"
            					requiredMessage="Names[#{language.name}] is required"/>
            		<h:graphicImage value="#{language.image}" alt="#{language.name}" height="12" width="18"/>
            	</c:forEach>
            </h:panelGrid>
        </fieldset>					
	<a4j:commandButton type="submit" value="Submit" action="#{documentTypeConfigBean.addObject}" render="objectsPanel, objectPanel, popupModalPanel" oncomplete="if (#{empty facesContext.messageList}) #{rich:component('popupModal')}.show();"/>						            
	<a4j:commandButton type="reset" value="Reset" action="#{documentTypeConfigBean.resetObject}" render="objectPanel"/>
</a4j:outputPanel>
...
Рейтинг: 0 / 0
20.04.2012, 12:32:23
    #37762723
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
авторПроблема в том, что после ошибке валидации во второй панели, при нажатии на линк не перерисовываюся заполненные поля второй панели. Если после ошибки валидации нажать кнопку "Reset" - все перерисовывается нормально.


Вот тут поподробнее пожалуйста, если можно по шагам - ввел то-то, нажал то-то получил то-то, я не понимаю о каком линке вы говорите, а искать связь как-то лень если честно)
...
Рейтинг: 0 / 0
20.04.2012, 12:37:52
    #37762742
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
Ну вроде понял я что вы хотите
Код: html
1.
2.
<a4j:commandLink execute="@this" render="objectPanel" action="#{documentTypeConfigBean.loadObject}" immediate="true">
	            </a4j:commandLink>



Зачем вы используете аттрибут immediate="true"? Вы знаете как он работает? Я думаю если убрать то все заработает, другое дело что может быть он у вас какие-то функции выполняет - тогда будем думать еще
...
Рейтинг: 0 / 0
20.04.2012, 12:41:31
    #37762754
Африканец
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
забыл ник,

Линк вот этот, который подгружает объект и рендрит форму:

Код: html
1.
2.
3.
4.
<a4j:commandLink execute="@this" render="objectPanel" action="#{documentTypeConfigBean.loadObject}" immediate="true">
    <h:graphicImage value="/images/icons/edit.gif" alt="Edit Document Type" />
    <a4j:param value="#{record.id}" assignTo="#{documentTypeConfigBean.objectId}" />
</a4j:commandLink>					



Последовательность шагов такова:

1. Заполняю форму не до конца, вызывая ошибку валидации при создании нового объекта;
2. Кликаю на линк в таблице существующих объектов в надежде получить для редактирования существующий объект;
3. Обнаруживаю, что при рендеринге формы не обновилось содержимое полей, которые я заполнил на шаге 1.
...
Рейтинг: 0 / 0
20.04.2012, 12:42:46
    #37762760
Африканец
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
забыл ник,

не работает и без immediate="true". Если его нет - еще и messages от валидации показывает.
...
Рейтинг: 0 / 0
20.04.2012, 13:00:03
    #37762830
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
Ну мне две вещи бросились в глаза.
1) Попробуйте execute="@form" или execute="form" - не помню точный синтаксис, суть в том чтобы вся форма перерендерилась.
2)
Код: html
1.
<a4j:param value="#{record.id}" assignTo="#{documentTypeConfigBean.objectId}" />

а потом
Код: html
1.
value="#{documentTypeConfigBean.object.id}"


Может где-то опечатка закралась

Кстати было бы полезно увидеть ваш java код
...
Рейтинг: 0 / 0
20.04.2012, 13:17:48
    #37762885
Африканец
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
забыл ник,

1. С execute="@form" не срабатывает action у линка; если убрать immediate="true", то пытается валидировать пустую форму
2. Это не опечатка, есть отдельная переменная objectId, куда кладется значение id из таблицы при нажатии на линк. Потом в форме редактируются поля объекта

Насколько я понимаю, форма каким-то образом "помнит", что она не прошла валидацию, и это отражается на ее отрисовке. Есть какая-нибудь возможность "стереть" эту память? Я пробовал чистить коллекцию messages и ресетить объект - ноль эмоций. Кнопка reset замечательно с этим справляется, но как вызвать ее программно - непонятно.

Вот java-код:

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
	public String loadObject() throws Exception {
		object = new DocumentType( objectId );
		object = documentFacade.getDocumentType( object );
		return null;
	}

	public String addObject() throws Exception {
		documentFacade.addDocumentType( object );
		objects = null;
		return null;
	}
	
	public void resetObject(){
		object = new DocumentType();
		object.setNames( new HashMap() );
		for (Iterator it = CommonsConfigHelper.getConfig().getLanguages().iterateLanguage(); it.hasNext(); ){
			Language ln = (Language)it.next();
			object.getNames().put(ln.getId(), null);
		}
		log.debug("Document type reset!");
	}
...
Рейтинг: 0 / 0
20.04.2012, 13:28:16
    #37762916
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
Еще пару вопросов - пока я разбираюсь - панель вообще отрисовывается по второму нажатию на линк? Чтобы проверить можно запихнуть в панель скрипт с alert('rendered') и 2 - вы дебаггером смотрели - все методы вызываются?
...
Рейтинг: 0 / 0
20.04.2012, 13:34:10
    #37762934
Африканец
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
забыл ник,

Отрисовывается. В форме все поля required. Если часть из них не заполнена до валидации - именно они перерисовываются с новыми данными, заполненные остаются такими, какими были до валидации
...
Рейтинг: 0 / 0
20.04.2012, 13:38:03
    #37762946
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
Я думаю что кнопка ресет работает потому что это дефолтное поведение для кнопки ресет у формы - очистить все поля, то есть теоретически вы можете повесить на свой линк javascript, который пробегается по всем поям, и обнуляет текст - это как временный воркэраунд, но конечно хотелось бы разобраться почему такое происходит.
...
Рейтинг: 0 / 0
20.04.2012, 13:39:18
    #37762948
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
забыл никЯ думаю что кнопка ресет работает потому что это дефолтное поведение для кнопки ресет у формы - очистить все поля, то есть теоретически вы можете повесить на свой линк javascript, который пробегается по всем поям, и обнуляет текст - это как временный воркэраунд, но конечно хотелось бы разобраться почему такое происходит.

Опппа.. получается что часть данных с одного объекта - часть из другого? Ну ок, сейчас подумаю
...
Рейтинг: 0 / 0
20.04.2012, 13:39:48
    #37762951
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
Ой не то процитировал.. ну вы поняли
...
Рейтинг: 0 / 0
20.04.2012, 13:47:51
    #37762964
Африканец
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
забыл ник,

На форме все поля с одного объекта - documentTypeConfigBean.object
...
Рейтинг: 0 / 0
20.04.2012, 13:52:49
    #37762976
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
таки да - вы были правы - инпуты хранят submittedValue, но это можно победить, вот список ресурсов которые вам должны помочь.
http://stackoverflow.com/questions/619050/jsf-commandbutton-with-immediate-true
https://cwiki.apache.org/confluence/display/MYFACES/Clear+Input+Components
https://community.jboss.org/thread/4367
...
Рейтинг: 0 / 0
20.04.2012, 13:54:34
    #37762984
забыл ник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
Африканецзабыл ник,

Отрисовывается. В форме все поля required. Если часть из них не заполнена до валидации - именно они перерисовываются с новыми данными, заполненные остаются такими, какими были до валидации

Концептуально - они из разных объектов, я это имел ввиду - Один объект - ваш новый объект, а второй - тот что был. Ну да не суть важно, я думаю решение выше
...
Рейтинг: 0 / 0
20.04.2012, 14:36:16
    #37763094
Африканец
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
Спасибо, попробую разобраться
...
Рейтинг: 0 / 0
20.04.2012, 18:15:48
    #37763779
Африканец
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
JSF+RichFaces: Как перерендрить форму после ошибки валидации?
авторСпасибо, попробую разобраться

Вроде бы нашел решение: http://balusc.blogspot.com/2012/03/reset-non-processed-input-components-on.html

Предложенные в линках, к сожалению, не сработали (кроме тупого перехода по navigation rule, конечно). Или я их реализовал криво.

Огромное Вам спасибо за идеи и дай Вам Бог здоровья.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / JSF+RichFaces: Как перерендрить форму после ошибки валидации? / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]