2013-08-20 17 views
8

Chcę zezwolić użytkownikowi na edycję komórek w tabeli danych tylko wtedy, gdy spełniony jest jakiś warunek.Warunkowa edycja komórki w elementach PrimeFaces datatable

Początkowo próbowałem <choose> do osiągnięcia tego celu:

<p:dataTable var="item" value="${bean.items}" editable="true" editMode="cell"> 
    <p:column headerText="column A"> 
     <c:choose> 
      <c:when test="${item.isEditable}"> 
       <p:cellEditor id="title"> 
        <f:facet name="output"> 
         <h:outputText value="#{item.title}"/> 
        </f:facet> 
        <f:facet name="input"> 
         <p:inputText value="#{item.title}"/> 
        </f:facet> 
       </p:cellEditor> 
      </c:when> 
      <c:otherwise> 
       <h:outputText value="#{item.title}"/> 
      </c:otherwise> 
     </c:choose> 
    </p:column> 
... 

ale to nie działa. Innym sposobem jest użycie rendered atrybut:

<p:column headerText="column A"> 
    <p:cellEditor rendered="${item.isEditable}"> 
     <f:facet name="output"> 
      <h:outputText value="#{item.title}"/> 
     </f:facet> 
     <f:facet name="input"> 
      <p:inputText value="#{item.title}"/> 
     </f:facet> 
    </p:cellEditor> 
    <h:outputText value="#{item.title}" rendered="#{!item.isEditable}"/> 
</p:column> 

że działa prawidłowo - użytkownik jest w stanie zmieniać tylko dozwolony komórek.

Nawet jeśli komórka nie jest edytowalna, nadal ma klasę ui-cell-editing i wygląda jak komórka edytowalna dla użytkownika.

Jaki jest poprawny sposób zastosowania warunku do edycji komórki?

Dziękujemy!

Odpowiedz

6

Aby poprawnie nauczyć się lekcji o niepowodzeniu JSTL, nie powiodło się z przyczyny wyjaśnionej w następującej odpowiedzi: JSTL in JSF2 Facelets... makes sense? W skrócie: #{item} nie jest dostępna w chwili uruchomienia JSTL.

Wracając do kwestii betonu: tej klasy styl włożona dzięki połączeniu editMode="cell" i fizycznej obecności z <p:cellEditor> składnika w <p:column>. Datowalny renderer PrimeFaces nie bierze pod uwagę, czy <p:cellEditor> jest renderowany czy nie. Po prostu wstawia klasę stylu ui-editable-column, która z kolei uruchamia styl ui-cell-editing za pośrednictwem JS/jQuery. Szukałeś we właściwym kierunku rozwiązania, JSTL, które może warunkowo fizycznie dodawać/usuwać komponenty JSF w drzewie komponentów JSF, ale niestety nie zadziała w tym konstrukcie.

Najlepiej jest opublikować an issue report dla facetów PrimeFaces, w których prosimy nie tylko o fizyczną obecność komponentu <p:cellEditor>, ale także o jego wynik isRendered(). Biorąc pod uwagę PrimeFaces wersji 3.5, która byłaby w line 796 of DataTableRenderer class który pierwotnie wygląda następująco (nowe linie wprowadzonego dla czytelności):

String styleClass = selectionEnabled 
    ? DataTable.SELECTION_COLUMN_CLASS 
    : (column.getCellEditor() != null) 
     ? DataTable.EDITABLE_COLUMN_CLASS 
     : null; 

i powinny być zmienione w następujący sposób:

String styleClass = selectionEnabled 
    ? DataTable.SELECTION_COLUMN_CLASS 
    : (column.getCellEditor() != null && column.getCellEditor().isRendered()) 
     ? DataTable.EDITABLE_COLUMN_CLASS 
     : null; 

Jeśli nie możesz czekać, w międzyczasie możesz wygenerować własny renderer.

package com.example; 

import org.primefaces.component.datatable.DataTableRenderer; 

public class MyDataTableRenderer extends DataTableRenderer { 

    @Override 
    protected void encodeCell(FacesContext context, DataTable table, UIColumn column, String clientId, boolean selected) throws IOException { 
     // Copypaste here the original encodeCell() source code and make modifications where necessary. 
    } 

} 

Następnie, aby zmusić go do pracy, zarejestrować go w następujący faces-config.xml:

<render-kit> 
    <renderer> 
     <description>Overrides the PrimeFaces table renderer with customized cell renderer.</description> 
     <component-family>org.primefaces.component</component-family> 
     <renderer-type>org.primefaces.component.DataTableRenderer</renderer-type> 
     <renderer-class>com.example.MyDataTableRenderer</renderer-class> 
    </renderer> 
</render-kit> 
+0

dziękuję @BalusC I na pewno spróbuje użyć niestandardowego renderujący i opublikować wyniki tutaj. Dziękuję bardzo za wyczerpującą odpowiedź! – Meta

+0

Nie ma za co. – BalusC

+0

Dziękuję bardzo za to, mam zamiar pracować na żądanie pull replikacji tego zachowania. –

Powiązane problemy