2013-08-20 12 views
8

मैं कुछ शर्त पूरी होने पर उपयोगकर्ता डेटा तालिका में कक्षों को संपादित करने की अनुमति देना चाहता हूं।प्राइमफेस में सशर्त सेल संपादन डेटाटेबल

शुरू में मैं <choose> की कोशिश की है इस लक्ष्य को हासिल करने के लिए:

<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> 
... 

लेकिन यह काम नहीं करता। - उपयोगकर्ता केवल अनुमति कोशिकाओं को संपादित करने में सक्षम हैं

<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> 

कि ठीक काम करता है: एक और दृष्टिकोण rendered विशेषता का उपयोग करने के लिए है।

लेकिन यदि सेल संपादन योग्य नहीं है, तब भी ui-cell-editing कक्षा है और उपयोगकर्ता के लिए संपादन योग्य सेल की तरह दिखती है।

सेल संपादन के लिए स्थिति लागू करने का सही तरीका क्या है?

धन्यवाद!

उत्तर

6

जेएसटीएल के पाठ को सही ढंग से सीखने के लिए, यह निम्नलिखित उत्तर में बताए गए कारण के लिए विफल रहा: JSTL in JSF2 Facelets... makes sense? संक्षेप में: #{item} जेएसटीएल रन के समय उपलब्ध नहीं है।

ठोस सवाल करने के लिए वापस आ रहा है: उस शैली वर्ग डाला गया है संयोजन editMode="cell" और <p:column> में <p:cellEditor> घटक केशारीरिक उपस्थिति के कारण। प्राइमफेस डेटाटेबल रेंडरर इस बात पर विचार नहीं कर रहा है कि <p:cellEditor> प्रस्तुत किया गया है या नहीं। यह सिर्फ ui-editable-column शैली वर्ग को सीधे सम्मिलित करता है जो बदले में जेएस/jQuery के माध्यम से ui-cell-editing शैली को ट्रिगर करता है। आप समाधान के लिए सही दिशा में देख रहे थे, जेएसटीएल जो जेएसएफ घटक पेड़ में जेएसएफ घटकों को सशर्त रूप से शारीरिक रूप से जोड़/हटा सकता है, लेकिन दुर्भाग्य से यह इस निर्माण में काम नहीं करेगा।

आपका सबसे अच्छा शर्त PrimeFaces लोग जिससे आप न केवल <p:cellEditor> घटक की भौतिक उपस्थिति पर विचार करने के पूछने के लिए an issue report पोस्ट करने के लिए है, लेकिन यह भी अपने isRendered() परिणाम।

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

और इस प्रकार संशोधित किया जाना चाहिए: PrimeFaces संस्करण 3.5, कि line 796 of DataTableRenderer class जो मूल रूप से इस तरह दिखता में होगा (नई-पंक्तियों पठनीयता के लिए शुरू की गई) को ध्यान में रखते

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

यदि आप इंतजार नहीं कर सकता, इस बीच आप एक कस्टम रेंडरर homegrow सकता है।

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. 
    } 

} 

फिर, इसे चलाने के लिए प्राप्त करने के लिए, यह रजिस्टर 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

धन्यवाद मैं निश्चित रूप से कस्टम रेंडरर का उपयोग करें और यहां परिणाम पोस्ट करने के लिए कोशिश करेंगे @BalusC। व्यापक उत्तर के लिए बहुत बहुत धन्यवाद! – Meta

+0

आपका स्वागत है। – BalusC

+0

इसके लिए आपको बहुत बहुत धन्यवाद, मैं इस व्यवहार को दोहराने के लिए पुल अनुरोध पर काम करने जा रहा हूं। –

संबंधित मुद्दे