RichFaces 4 dataTable编辑问题

时间:2013-04-19 10:29:50

标签: jpa richfaces popuppanel

我想像这里一样编辑这样的表 - > http://showcase.richfaces.org/richfaces/component-sample.jsf?demo=dataTable&sample=dataTableEdit&skin=blueSky。问题在于,当我在editPane(popupPanel)中进行更改时,他们不会被私人OsobaTelefon edytujOsobe记住。这使得JPA无法更新。我有所有的getter和setter,类OsobaTelefon实现了Serializable。

@ManagedBean(name = "administrator")
@ViewScoped
@SessionScoped
public class Administrator implements Serializable
@EJB
private UzytkownikFacade uzytkownikFacade;

private static final long serialVersionUID = 1L;
@EJB
private OsobaFacade osobaFacade;

private Osoba osobaAdmina;
private int numerStrony = 1;
private Uzytkownik uzytkownik;
private List<Osoba> listaOsob;
private static final int CLIENT_ROWS_IN_AJAX_MODE = 10;
private int clientRows;
private int wybranaOsoba;
private OsobaTelefon edytujOsobe; //it doesn't remember the changes made in editPane
private List<OsobaTelefon> osobyITelefony;


/**
 * Creates a new instance of Administrator
 */
public Administrator() {

}


public void aktualizacjaWybranejOsoby() {

    this.osobyITelefony.set(this.wybranaOsoba, this.edytujOsobe);

    Osoba nowaOsoba = new Osoba();
    List<Telefon> nowaListaTelefonow = new ArrayList<Telefon>();

    OsobaTelefon osobaTelefon = this.osobyITelefony.get(this.wybranaOsoba);
    int o = this.osobyITelefony.get(this.wybranaOsoba).getIdosoby();
    int of = this.osobyITelefony.get(this.wybranaOsoba).getIdtelefonu();

    System.out.println("Wybrana osoba ID " + o);
    System.out.println("Wybrane ID fona " + of);

    boolean znalezionoOsobe = false;
    Iterator<Osoba> iteOs = this.listaOsob.iterator();
    while (!znalezionoOsobe && iteOs.hasNext()) {
        Osoba os = iteOs.next();
        if (os.getIdosoba() == o) {
            znalezionoOsobe = true;

            nowaOsoba.setIdosoba(os.getIdosoba());
            nowaOsoba.setImie(osobaTelefon.getImie());
            nowaOsoba.setNazwisko(osobaTelefon.getNazwisko());
            nowaOsoba.setKodpocztowy(osobaTelefon.getKodpocztowy());
            nowaOsoba.setMiejscowosc(osobaTelefon.getMiejscowosc());
            nowaOsoba.setUlica(osobaTelefon.getUlica());
            nowaOsoba.setUzytkownikList(os.getUzytkownikList());

            Telefon nowyTelefon = new Telefon();
            for (Telefon tel : os.getTelefonList()) {

                if (tel.getIdtelefon() == of) {
                    nowyTelefon.setFkIdosoba(nowaOsoba);
                    nowyTelefon.setIdtelefon(of);
                    nowyTelefon.setNumer(this.edytujOsobe.getNumer());
                    System.out.println("Nr tel. "+tel.getNumer());
                    nowyTelefon.setOpis(this.edytujOsobe.getOpis());
                    nowyTelefon.setZastrzezony(this.edytujOsobe.getZastrzezony());
                    nowaListaTelefonow.add(nowyTelefon);
                } else {
                    nowaListaTelefonow.add(tel);
                }
            }

            nowaOsoba.setTelefonList(nowaListaTelefonow);
            this.osobaFacade.aktualizujOsoba(nowaOsoba);
            this.pobierzOsobyDoTabeli();

        }

    }


}

public List<Osoba> pobierzOsobyDoTabeli() {
    //getting people with phone to List<OsobaTelefon> works good
}

public void switchAjaxLoading(ValueChangeEvent event) {
    this.clientRows = (Boolean) event.getNewValue() ? CLIENT_ROWS_IN_AJAX_MODE : 0;
}

public void zapelnijListeTelefonow() {
    //getting people phone number to List<Phone> works good
}

public void usunOsobe() {
//deleting people works good
}

}

XHTML

<a4j:status onstart="#{rich:component('statPane')}.show()" onstop="#{rich:component('statPane')}.hide()" />
    <h:form id="formProjekty">
        <rich:dataTable value="#{administrator.osobyITelefony}" 
                        var="pr"
                        iterationStatusVar="ite" 
                        id="table" 
                        rows="8" >

            <rich:column width="auto">
                <f:facet name="header">Imię</f:facet>
                <h:outputText value="#{pr.imie}" />
            </rich:column> 

            <rich:column>
                <a4j:commandLink styleClass="no-decor" 
                                 render="editGrid"
                                 execute="@this" 
                                 oncomplete="#{rich:component('editPane')}.show()">
                    <h:graphicImage library="img" name="edit.gif" alt="Edycja"/>
                    <a4j:param value="#{ite.index}"
                               assignTo="#{administrator.wybranaOsoba}" />
                    <f:setPropertyActionListener target="#{administrator.edytujOsobe}"
                                                 value="#{pr}" />
                </a4j:commandLink>
                <a4j:commandLink styleClass="no-decor" 
                                 execute="@this"
                                 render="@none" 
                                 oncomplete="#{rich:component('confirmPane')}.show()">
                    <h:graphicImage library="img" name="delete.gif" alt="Usuń"/>
                    <a4j:param value="#{ite.index}"
                               assignTo="#{administrator.wybranaOsoba}" />
                    <f:setPropertyActionListener target="#{administrator.edytujOsobe}"
                                                 value="#{pr}" />
                </a4j:commandLink>
            </rich:column>

            <f:facet name="footer">
                <rich:dataScroller page="#{administrator.numerStrony}" />
            </f:facet>
        </rich:dataTable>

        <a4j:jsFunction name="remove" 
                        action="#{administrator.usunOsobe()}"
                        render="table" 
                        execute="@this"
                        oncomplete="#{rich:component('confirmPane')}.hide();" />

        <a4j:jsFunction name="edycja" 
                        action="#{administrator.aktualizacjaWybranejOsoby()}"
                        render="table" 
                        execute="@this"
                        oncomplete="#{rich:component('editPane')}.hide();" />


        <rich:popupPanel id="statPane" autosized="true">
            <h:graphicImage library="img" name="ai.gif" alt="Czekaj"/>
            Proszę czekać...
        </rich:popupPanel>

        <rich:popupPanel id="confirmPane" autosized="true">
            Czy na pewno usunać?
            <a4j:commandButton value="Tak" onclick="remove();
                    return false;" />
            <a4j:commandButton value="Nie"
                               onclick="#{rich:component('confirmPane')}.hide();
                    return false;" />
        </rich:popupPanel>

        <rich:popupPanel header="Edycja Osoby" 
                         id="editPane" 
                         domElementAttachment="parent" width="180" height="420">

                    <h:panelGrid columns="1" id="editGrid">
                        <h:panelGroup >
                            <h:outputText value="Imię" /><br />
                            <h:inputText value="#{administrator.edytujOsobe.imie}" >
                                <f:validateLength maximum="32" minimum="3"/>
                            </h:inputText>
                        </h:panelGroup>

                    </h:panelGrid><br/>
                    <a4j:commandButton value="Aktualizuj" 
                                       onclick="edycja(); return false;"/>
                    <a4j:commandButton value="Anuluj"
                                       onclick="#{rich:component('editPane')}.hide();
                    return false;" />

        </rich:popupPanel>
    </h:form>

1 个答案:

答案 0 :(得分:0)

如果你可以改变它,那么让你的Aktualizuj a4j-link更容易一些。试试吧:

  <a4j:commandButton value="Aktualizuj"
                    onclick="#{rich:component('editPane')}.hide();"
                    action="#{administrator.aktualizacjaWybranejOsoby()}"  render="table"/>

<a4j:commandButton value="Aktualizuj" onclick="#{rich:component('editPane')}.hide();" action="#{administrator.aktualizacjaWybranejOsoby()}" render="table"/>

并在你的inputText和你的链接上放置一个a4j:区域,只发送所需的值:

    <rich:popupPanel header="Edycja Osoby" 
                     id="editPane" 
                     domElementAttachment="parent" width="180" height="420">
            <a4j:region>
                <h:panelGrid columns="1" id="editGrid">
                    <h:panelGroup >
                        <h:outputText value="Imię" /><br />
                        <h:inputText value="#{administrator.edytujOsobe.imie}" >
                            <f:validateLength maximum="32" minimum="3"/>
                        </h:inputText>
                    </h:panelGroup>

                </h:panelGrid><br/>
               <a4j:commandButtonvalue="Aktualizuj" onclick="#    {rich:component('editPane')}.hide();"action="#{administrator.aktualizacjaWybranejOsoby()}" render="table"/>
                <a4j:commandButton value="Anuluj"
                                   onclick="#{rich:component('editPane')}.hide();
                return false;" />
              </a4j:region>
    </rich:popupPanel>

我还添加了一个render =&#34; table&#34;到Aktualizuj a4j:链接以更新数据表中的值