Como mostrar detalhes da linha atual de p: dataTable em uma caixa de diálogo p: e atualizar após salvar
Eu tenho um aplicativo JSF 2 que possui duas páginas, uma para listar alunos e outra para mostrar detalhes de um determinado aluno. A página de listagem possui um link para a página de detalhes em cada linha da tabela de alunos, que abre uma nova guia no navegador para mostrar esses detalhes, quando clicada.
Agora, os requisitos foram alterados para não mostrar mais detalhes em uma nova guia, mas em um diálogo modal na página de listagem.
Minha idéia é simplesmente incorporar o conteúdo da página de detalhes na caixa de diálogo modal para que a página de listagem não fique muito grande e difícil de manter. Aqui comece minhas dúvidas. Após algumas pesquisas, alterei o link em cada linha da listagem para o seguinte botão:
<p:commandButton value="Details" type="button"
onclick="PF('dialog-details').show()">
</p:commandButton>
O diálogo é declarado da seguinte maneira:
<p:dialog widgetVar="dialog-details" header="Details" modal="true" width="95%">
<ui:include src="student_details.xhtml">
<ui:param name="id" value="#{student.id}"/>
</ui:include>
</p:dialog>
Finalmente, a página de detalhes foi alterada para ser algo como isto:
<ui:composition
xmlns="http://www.w3.org/1999/xhtml" xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui" xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets">
<f:metadata>
<f:viewParam name="id" value="#{studentBean.id}" />
</f:metadata>
<h1 class="title ui-widget-header ui-corner-all">Details of #{studentBean.bean.name} / #{studentBean.bean.number}</h1>
</ui:composition>
Quando clico no botão, a caixa de diálogo é exibida e o conteúdo é a página de detalhes. Eu vejo o seguinte conteúdo na caixa de diálogo:
Details of /
Sem erros, mas os dados que devem ser mostrados não são. Um ponto de interrupção foi definido emStudentBean.setId()
(esse método carrega uma propriedade chamadabean
com oStudent
instância correspondente ao ID passado), mas nunca é atingido.
Depois de algum tempo pensando sobre isso, cheguei a entender por que não funciona. O parâmetro passado para a página de detalhes éstudent.id
, masstudent
é o nome usado como ovar
no<p:datatable/>
que mostram todos os alunos, entãostudent
não é válido em<p:dialog/>
que está fora do<p:datatable/>
.
Então, o que eu preciso é de uma maneira de mostrar a caixa de diálogo usando o ID do aluno correspondente em uma determinada linha. Idealmente, eu gostaria de uma chamada ajax aqui, para que os detalhes fossem carregados apenas quando necessários.
Alguma ideia?