[RESOLVIDO] JSF 2 - Formulário com conteúdo DINÂMICO

Prezados,

Preciso implementar um formulário dinâmico. Vou tentar explicar bem detalhadamente…

Tenho uma tabela com uma lista de temas:

<p:dataTable id="tabela_temas" var="tema" ...

O usuário pode selecionar um tema desta tabela. Após selecionar um tema, devo ir no banco de dados e recuperar todas as perguntas associadas a este tema:

public List<Pergunta> getPerguntas() {
		if (this.temaSelecionado != null) {
			PerguntaRN perguntaRN = new PerguntaRN();
			this.perguntas = perguntaRN.buscarPorTema(temaSelecionado.getId());
...

Agora que começa a parte boa :twisted:. Para cada pergunta, deverá ser fornecida uma resposta. O tipo de pergunta (texto simples, multipla escolha, etc…) define o tipo de campo da resposta. Ou seja, para determinadas perguntas terei um campo de resposta do tipo inputText, para outras terei um campo do tipo selectOneRadio, e por aí vai…

Como teste tentei fazer o seguinte. Na entidade pergunta, criei um atributo transient do tipo String que deverá conter o htmldo campo de resposta. Então alterei o método getPerguntas ficando assim:

public List<Pergunta> getPerguntas() {
		if (this.subtemaSelecionado != null) {
			PerguntaRN perguntaRN = new PerguntaRN();
			this.perguntas = perguntaRN.buscarPorSubtema(subtemaSelecionado.getId());
			
			// Verifica o tipo de pergunta, para definir qual será o tipo de compo de resposta
			for (Pergunta pergunta : this.perguntas) {
				//if (pergunta.getTipoPergunta().equals("")) {
					pergunta.setHtmlCampoResposta("<h:outputText />");
				//}
			}
		}
		return perguntas;
	}

E no XHTML fiz:

<h:panelGrid columns="2" cellpadding="2">
				<ui:repeat var="pergunta" value="#{temaBean.perguntas}">
					<h:outputText value="#{pergunta.descricaoPergunta}" style="font-weight: bold;" />					
					<br /> 
					#{pergunta.htmlCampoResposta}
					<br /><br /> 
				</ui:repeat>			
			</h:panelGrid>

Só que infelizmente não funcionou. É impresso o valor da String… e o campo não é renderizado…

Poderiam me ajudar?

Fala cara, blz?

Já fiz algo parecido, na época era algo mais ou menos assim:

As questoes no banco possuíam:

  • A pergunta (duh)
  • Um campo que determinava seu tipo (não lembro como eram os valores, vou inventar aqui) como “T” (texto), “R” (radio) e “D” (data)
  • A resposta (duh²)

Então eu fazia o formulario como algo do tipo:


<h:panelGrid columns="2" cellpadding="2">  
    <ui:repeat var="questao" value="#{bean.questoes}">  
        <h:outputText value="#{questao.pergunta}" />                   
        <br />   
        <h:inputText value="#{pergunta.resposta}" rendered="questao.texto" /> <!-- Questao possui um metodo isTexto() que verifica se o tipo eh igual a "T" -->
        <x:umComponenteDate value="#{pergunta.resposta}" rendered="questao.data" /> <!-- Questao possui um metodo isData() que verifica se o tipo eh igual a "D" -->
        <h:selectOneRadio="#{pergunta.resposta}" rendered="questao.radio" /> <!-- Questao possui um metodo isRadio() que verifica se o tipo eh igual a "R" -->
        <br /><br />   
    </ui:repeat>            
</h:panelGrid>  

[quote=Rendrys]Fala cara, blz?

Já fiz algo parecido, na época era algo mais ou menos assim:

As questoes no banco possuíam:

  • A pergunta (duh)
  • Um campo que determinava seu tipo (não lembro como eram os valores, vou inventar aqui) como “T” (texto), “R” (radio) e “D” (data)
  • A resposta (duh²)

Então eu fazia o formulario como algo do tipo:


<h:panelGrid columns="2" cellpadding="2">  
    <ui:repeat var="questao" value="#{bean.questoes}">  
        <h:outputText value="#{questao.pergunta}" />                   
        <br />   
        <h:inputText value="#{pergunta.resposta}" rendered="questao.texto" /> <!-- Questao possui um metodo isTexto() que verifica se o tipo eh igual a "T" -->
        <x:umComponenteDate value="#{pergunta.resposta}" rendered="questao.data" /> <!-- Questao possui um metodo isData() que verifica se o tipo eh igual a "D" -->
        <h:selectOneRadio="#{pergunta.resposta}" rendered="questao.radio" /> <!-- Questao possui um metodo isRadio() que verifica se o tipo eh igual a "R" -->
        <br /><br />   
    </ui:repeat>            
</h:panelGrid>  

[/quote]

Boa Rendrys!!! Como não pensei nisso, hehehehehehe. Vou tentar aqui e qualquer coisa peço socorro.

Vlw d+ :wink:

Beleza, boa sorte! :smiley:

Bom dia, eu estou trabalhando em uma aplicação, um tipo de quiz com perguntas e respostas, mas não consigo inserir os dados no banco de uma forma em que depois possa exibir a questão com as prováveis respostas e o jogador marca a resposta correta.

como eu poderia fazer isso?

Dá pra seguir a mesma lógica…

Uma “questão” possui uma pergunta e uma lista de respostas, sendo que uma delas pode estar marcada com uma flag indicando ser a correta.

Em um pseudo-código, vc teria:

for (questao : questoes) {
  text:questao.pergunta

  for (resposta : questao.respostas) {
    radio/check:resposta
  }
}

Tópico de alguns meses de ‘idade’… Mas tem tudo a ver com o que eu quero fazer.
É uma solução parecida…

Usando o rendered.
Mas eu qero ter um select … o cara seleciona o campo e clica num botão.
o botão por ajax, troca o valor da variavel que o ‘rendered’ está…
e com ajax da um update no formulario.

mas nao funcionou :frowning:

podem ajudar?