Ação disparada por um botão fora de um form

7 respostas
H

Eu estou montando várias fichas, uma dentro de cada aba. Cada uma delas tem seu próprio h:form e fora destes formulários há um h:commandButton que chama uma ação que salva todos estes formulários de uma só vez.

Acontece que quando eu faço o debug dentro do método da ação chamada os valores dos formulários não estão com os valores setados nos input texts e etc dos formulários.

O método do comandButton não enxerga os valores setados pelo usuário justamente porque ele não está dentro do h:form? Há alguma forma de burlar isso?

7 Respostas

marcelo.bellissimo

O mais correto seria você fazer um form só, onde ficaria este botão que dispara a ação, e essas fichas seriam “includes” dentro desse form… não sei como está estruturada essa sua página, mas creio que desta maneira daria certo… os valores só são setados no form ao disparar o submit do mesmo, como você está fazendo isso por um outro botão que não está associado á nenhum form, ele não seta os valores…

H
marcelo.bellissimo:
O mais correto seria você fazer um form só, onde ficaria este botão que dispara a ação, e essas fichas seriam "includes" dentro desse form... não sei como está estruturada essa sua página, mas creio que desta maneira daria certo... os valores só são setados no form ao disparar o submit do mesmo, como você está fazendo isso por um outro botão que não está associado á nenhum form, ele não seta os valores...

Então, eu tentei fazer isso já, só que aí eu clico no botão de salvar ele simplesmenta não executa nenhuma ação e nem mesmo fecha o modal panel.

A estrutura do que fiz está assim: Primeiramente abro este modalPanel:
<rich:modalPanel id="FichasPanel" style="overflow:auto" height="450" width="880">
					<f:facet name="header">
						<h:outputText value="Prontuário" />
					</f:facet>
					<f:facet name="controls">
						<h:panelGroup>
							<h:graphicImage value="/images/modal/close.png" id="hidelink2" styleClass="hidelink" />
							<rich:componentControl for="FichasPanel" attachTo="hidelink2" operation="hide" event="onclick" />
						</h:panelGroup>
					</f:facet>
					<h:form>
						<jsp:include page="Fichas.jsp"></jsp:include>
						<h:panelGrid id="pgridEditar" columns="2">
							<a4j:commandButton value="Atualizardafsd" action="#{manterProntuario.salvar}" reRender="rpanel" oncomplete="if (#{facesContext.maximumSeverity==null}) #{rich:component('FichasPanel')}.hide();" />
							<a4j:commandButton value="Cancelar" action="#{manterProntuario.cancelar}" onclick="#{rich:component('FichasPanel')}.hide();return false;" />
						</h:panelGrid>
					</h:form>
</rich:modalPanel>

No código acima eu adiciono um include para a jsp que tem o tabPanel das fichas (Fichas.jsp), além disso tem o botão de salvar. Detalhe que ambos estão dentro do h:form.

A página Fichas.jsp é assim:
<rich:tabPanel  id="tabpanel" switchType="ajax" width="900" >
		<rich:tab id="Prontuário" label="Prontuário">
			<f:subview id="subviewProntuario">
				<jsp:include page="Fichas/Prontuario.jsp"></jsp:include>
			</f:subview>
	
		</rich:tab>

		<rich:tab  id="Anamnese" label="Anamnese" ontableave="#{rich:component('confirmModalPanel')}.show()">
			<f:subview id="subviewAnamnese">
				<jsp:include page="Fichas/Anamnese.jsp"></jsp:include>
			</f:subview>
		</rich:tab>

		<rich:tab label="Endodontia">
			<f:subview id="subviewEndodontica">
				<jsp:include page="Fichas/Endodontica.jsp"></jsp:include>

			</f:subview>
		</rich:tab>
		<rich:tab id="Estomatologia" label="Estomatologia">
			<f:subview id="subviewEstomatologia">
				<jsp:include page="Fichas/Estomatologia.jsp"></jsp:include>
			</f:subview>
		</rich:tab>
		<rich:tab label="Oclusal">
			<f:subview id="subviewOclusal">
				<jsp:include page="Fichas/Oclusal.jsp"></jsp:include>
			</f:subview>
		</rich:tab>
		<rich:tab label="Odontogeriátrica">
			<f:subview id="subviewOdontogeriatrica">
				<jsp:include page="Fichas/Odontogeriatrica.jsp"></jsp:include>
			</f:subview>
		</rich:tab>
		<rich:tab label="Odontopediátrica">
			<f:subview id="subviewOdontopediatrica">
				<jsp:include page="Fichas/Odontopediatrica.jsp"></jsp:include>
			</f:subview>
		</rich:tab>
		<rich:tab label="Periodontia">
			<f:subview id="subviewPeriodontia">
				<jsp:include page="Fichas/Periodontia.jsp"></jsp:include>
			</f:subview>
		</rich:tab>
		<rich:tab label="Prótese">
			<f:subview id="subviewProtese">
				<jsp:include page="Fichas/Protese.jsp"></jsp:include>
			</f:subview>
		</rich:tab>
	</rich:tabPanel>
Basicamente eu tenho 8 abas, cada uma com um formulário diferente incluído. Por exemplo, a Anamnese.jsp que segue o mesmo modelo de todas as fichas:
<h:panelGrid columns="1">
		<h:outputText value="Você tem ou já teve alguma dessas enfermidades?"></h:outputText>
	</h:panelGrid>
	<h:panelGrid columns="6">
		<h:outputText value="Asma:"></h:outputText>
		<h:selectBooleanCheckbox value="#{manterProntuario.currentAnamnese.asma}"></h:selectBooleanCheckbox>

		<h:outputText value="Anemia:"></h:outputText>
		<h:selectBooleanCheckbox value="#{manterProntuario.currentAnamnese.anemia}"></h:selectBooleanCheckbox>
.
.
.
E assim vai, por mais de 100 campos. Há algo errado no esquema que fiz?
H

Ah, e testei trocar o a4j:commandButton pelo h:commandButton, dessa forma ele fecha o modalPanel porém não executa a action da mesma forma.

H

Colocando no commandButton um immediate=“true” o método é executado. Isto quer dizer que é algum problema com validação que está impedindo a minha action de ser executada, não é?

Porém não coloquei required em nenhuma das fichas, o que mais poderia estar causando isso?

H

Já descobri o problema. Parece que ele não valida os meus inputTexts que possuem um objeto do tipo Date como value.

Estou resolvendo o problema utilizando o rich:calendar para esses campos, apesar que ainda não entendi o porque dele não validar o inputText do tipo Date (sendo que nem pedi pra validar).

marcelo.bellissimo

Bem vindo ao clube… “não sei porquê”, mas o que eu mais escuto do pessoal que mexe com JSF são essas quatro palavras, seguidas de qualquer coisa no final… “não entendi o porque…”

H

Então, eu apenas desconfio que ele sempre faça este tipo de validação (como entrar com caracter em campo que exige integer) e que ele aceite apenas algum formato especifico de data, havendo a necessidade de se usar um converter para o Date no inputText.

Criado 7 de abril de 2010
Ultima resposta 9 de abr. de 2010
Respostas 7
Participantes 2