JSF

2010-06-30 17 views
5

में पृष्ठ/फ़ॉर्म को अक्षम करने के लिए कैसे करें मेरे आवेदन के लिए मैं अलग-अलग अनुमतियों वाले उपयोगकर्ताओं को रखना चाहता हूं। एक अनुमति उपयोगकर्ता को मेरे डेटाबेस से डेटा देखने की अनुमति देगी, जबकि एक और अनुमति उन्हें डेटा को संपादित करने की अनुमति देगी। लॉग इन पर मैं गीलेर को निर्धारित करने के लिए उनकी अनुमति जांचूंगा कि वे डेटा संपादित कर सकते हैं। अगर मेरे पास केवल पढ़ने की अनुमति है तो मैं अपने पृष्ठ की पूरी तरह से अक्षम करने के लिए कुछ रास्ता ढूंढ रहा हूं। वहाँ <h:form> टैग के भीतर सब कुछ निष्क्रिय करने के लिए एक आसान तरीका है? मुझे बैकिंगबीन द्वारा केवल एक बूलियन को देखकर, कई पृष्ठों को अक्षम करने में सक्षम होना चाहिए। किसी भी तरह की सहायता का स्वागत किया जाएगा।JSF

-EDIT-
क्या कोई कंटेनर है या ऐसा है कि मैं अपने इनपुट के चारों ओर लपेट सकता हूं जिसे अक्षम करने के लिए सेट किया जा सकता है? इस तरह से मैं केवल एक ही स्थान पर diable संदर्भित करने के लिए की आवश्यकता होगी भी छोड़ सकता है अपने स्वयं के अक्षम गुण सेट करने के लिए प्रत्येक क्षेत्र है कि अगर अन्य तर्क मेरे पास है में आवश्यक है?

उत्तर

6

आप बटन, लिंक, इनपुट फ़ील्ड (सब कुछ है कि संपादन की अनुमति देता) आदि ... उन सब को समर्थन की फलियों में समान मान की ओर इशारा करते निष्क्रिय कर सकते हैं।

<h:inputText disabled="#{!bean.permissionToWrite}"> 

मैं एक रूप में समाहित सब कुछ निष्क्रिय करने के लिए किसी भी तरह से पता नहीं है, लेकिन आप उस क्योंकि आप वेरी (अर्थात एक खोज बॉक्स) प्रस्तुत करने के लिए प्रपत्र के भीतर कर सकते हैं करने के लिए नहीं कर सकते हैं।

अद्यतन: एलेक्स लैर्ज़लेरे की टिप्पणी का जवाब। इस मामले में

IMHO disabled बजाय rendered उपयोग करें, क्योंकि आप एक inputText बॉक्स में उपयोगकर्ता के लिए एक फ़ील्ड का मान प्रदर्शित करने के लिए चाहते हो सकता है, लेकिन उसे यह संशोधित करने के लिए नहीं जाने के लिए बेहतर है। यदि आप इसे प्रस्तुत नहीं करते हैं, तो वह इसे नहीं देख सकता है। आप इसे प्रदर्शित करने के लिए outputText का उपयोग कर सकते हैं लेकिन फिर आपको एक के बजाय दो तत्व बनाए रखना होगा। आप उदाहरण के लिए एक h:panelGroup के अंदर अपने घटकों लपेट कर सकते हैं और यह प्रस्तुत करना या अपने तर्क के आधार पर नहीं है, लेकिन आप इनपुट फ़ील्ड से अंदर हैं अक्षम नहीं कर सकता:

अद्यतन प्रश्न में संपादित करने के लिए जवाब h:panelGroup, आपको इसे व्यक्तिगत रूप से करना है।

+0

+1 मुझे इसे मारो। एक विकल्प 'rendered' का उपयोग करना है और केवल कुछ भी छिपाएं जो उन उपयोगकर्ताओं से संपादित करने की क्षमता देता है जो ऐसा करने के लिए अधिकृत नहीं हैं। –

+0

यह एक विकल्प हो सकता है, हालांकि यह बहुत काम करेगा। मैं उम्मीद कर रहा था कि वहां कुछ और सुरुचिपूर्ण होगा (जो मुझे पता है संभव नहीं है) ' ' – SomeFatMan

+0

इतना तत्व नहीं है, तत्व जोड़ते समय, बस जोड़ें अक्षम पैरामीटर। भविष्य में भी आप उदाहरण के लिए भूमिकाओं या समूहों के अनुसार अनुमति समूह समूह कर सकते हैं :) – pakore

0

टॉमहॉक के घटकों में से अधिकांश displayValueOnly, visibleOnUserRole है और enabledOnUserRole तत्वों दृश्यता को नियंत्रित करने जिम्मेदार बताते हैं।

आशा निम्न लिंक आपके लिए उपयोगी हो जाएगा:

5

यह सरल कस्टम घटक अन्य घटकों रैप करने के लिए इस्तेमाल किया जा सकता है और यदि अक्षम अक्षम = "सत्य" या सत्य की मूल्यांकन करने वाली ईएल अभिव्यक्ति के साथ उपयोग किया जाता है तो यह उन्हें अक्षम कर देगा। जिस तरह से यह काम करने का इरादा है कि अगर एक wrappped घटक पहले से ही तो अक्षम किया गया है यह अक्षम = "true" के साथ करता है, तो disablePanel प्रयोग किया जाता है सक्षम नहीं हो (या ajax फिर से प्रदान की गई है)। घटक केवल UIInput & UICommand घटकों को अक्षम करने के लिए है, जो मुझे लगता है कि ठीक है, लेकिन बदला जा सकता है प्रयास करता है।

xmlns:fnc="http://myco.co.uk/fnc" 
... 
<fnc:disablePanel disabled="#{bean.isItDisabled}"> 
    <h:inputText/> 
    ... 
</fnc:disablePanel> 
... 

UIDisablePanel.java

package uk.co.myco.component; 

import java.io.IOException; 
import javax.faces.component.*; 
import javax.faces.context.FacesContext; 

/* 
* @author Brendan Healey (Oversteer) 
*/ 

@FacesComponent("uk.co.myco.component.UIDisablePanel") 
public class UIDisablePanel extends UIComponentBase { 

    private enum PropertyKeys { 
     disabled; 
    } 

    public UIDisablePanel() { 
     setRendererType(null); 
    } 

    @Override 
    public void encodeBegin(FacesContext context) throws IOException { 

     boolean toDisable = isDisabled(); 
     processDisablePanel(this, toDisable); 
     //super.encodeBegin(context); 
    } 

    public void processDisablePanel(UIComponent root, boolean toDisable) { 

     /* 
     * The key point here is that a child component of <x:disablePanel> may 
     * already be disabled, in which case we don't want to enable it if the 
     * <x:disablePanel disabled= attribute is set to true. 
     */ 

     for (UIComponent c : root.getChildren()) { 
      if (c instanceof UIInput || c instanceof UICommand) { 
       if(toDisable) { // <x:disablePanel disabled="true"> 
        Boolean curState = (Boolean) c.getAttributes().get("disabled"); 
        if(curState == null || curState == false) { 
         c.getAttributes().put("UIPanelDisableFlag", true); 
         c.getAttributes().put("disabled", true); 
        } 
       } 
       else { // <x:disablePanel disabled="false"> 
        if(c.getAttributes().get("UIPanelDisableFlag") != null) { 
         c.getAttributes().remove("UIPanelDisableFlag"); 
         c.getAttributes().put("disabled", false); 
        } 
       } 
      } 

      if (c.getChildCount() > 0) { 
       processDisablePanel(c, toDisable); 
      } 
     } 

    } 

    @Override 
    public String getFamily() { 
     // Got to override it but it doesn't get called. 
     throw new UnsupportedOperationException("Not supported yet."); 
    } 

    public boolean isDisabled() { 
     return (boolean) getStateHelper().eval(PropertyKeys.disabled, false); 
    } 

    public void setDisabled(boolean disabled) { 
     getStateHelper().put(PropertyKeys.disabled, disabled); 
    } 
} 

disablepanel.taglib।xml

<?xml version="1.0" encoding="UTF-8"?> 
<facelet-taglib version="2.0" 
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
    http://java.sun.com/xml/ns/javaee/web-facelettaglibrary_2_0.xsd"> 
    <namespace>http://myco.co.uk/fnc</namespace> 
    <tag> 
     <tag-name>disablePanel</tag-name> 
     <component> 
      <component-type>uk.co.myco.component.UIDisablePanel</component-type> 
     </component> 
     <attribute> 
      <name>disabled</name> 
     </attribute> 
    </tag> 
</facelet-taglib> 
+0

हम इस कोड का उपयोग कर रहे हैं और यह अभी तक ठीक से काम करता है। मैंने पाया कि जब मेरे पास मेरे अक्षम पैनेल में एक घटक है जो पहले < 'जैसी स्थिति के साथ सक्षम है उस स्थिति को बदलें और सक्षम करने के लिए पूरे अक्षम पैनेल को अपडेट करें, यह इनपुट टेक्स्ट को सही ढंग से अक्षम नहीं करता है लेकिन पहली बार दृश्य को प्रस्तुत किए जाने पर प्रारंभिक अक्षम-स्थिति का उपयोग करता है। कोई विचार? – odaa

0

यह आपके पृष्ठ से सभी घटकों को अक्षम करने का एक समाधान है। कि नोटा, इस के साथ , आप भी केवल घटकों के एक समूह एक बार

मैं विधि डाल disableUIComponent एक उपयोगिता वर्ग के भीतर क्योंकि मैं कई JSFBeans में इसका इस्तेमाल करना चाहता था पर अक्षम कर सकते हैं।

public class UtilsPrimefaces { 

/** 
* Disable all the children components 
* @param uiComponentName 
*/ 
public static void disableUIComponent(String uiComponentName) { 
    UIComponent component = FacesContext.getCurrentInstance() 
      .getViewRoot().findComponent(uiComponentName); 
    if(component!=null) { 
     disableAll(component.getChildren()); 
    } 
} 

/** 
* Recursive method to disable the list 
* @param components Widget PD list 
*/ 
private static void disableAll(List<UIComponent> components) { 

    for (UIComponent component : components) { 
     logger.info(component.getClass().getTypeName());    

     if (component instanceof InputText) { 
      ((InputText) component).setDisabled(true); 

     } else if (component instanceof InputNumber) { 
      ((InputNumber) component).setDisabled(true); 

     } else if (component instanceof InputTextarea) { 
      ((InputTextarea) component).setDisabled(true); 

     } else if (component instanceof HtmlInputText) { 
      ((HtmlInputText) component).setDisabled(true); 

     } else if(component instanceof SelectOneMenu) { 
      ((SelectOneMenu) component).setDisabled(true); 

     } else if(component instanceof SelectBooleanCheckbox) { 
      ((SelectBooleanCheckbox) component).setDisabled(true); 

     } else if(component instanceof CommandButton) { 
      ((CommandButton) component).setDisabled(true);    
     } 
     disableAll(component.getChildren()); 
    } 
} 

और फिर आप अपने सेम में उपयोग कर सकते हैं। यह आपको एक पृष्ठ है कि 3 scrollPanels था के लिए एक उदाहरण है और मैं केवल Panel1 और panel3 निष्क्रिय करने के लिए चाहता था:

@PostConstruct 
public void init() {   
    super.init(); 
    if(userHasPermissions() || loadPageInReadOnly()) { 
     Utils.disableUIComponent(":form:panel1"); 
     Utils.disableUIComponent(":form:panel3"); 
    } 
} 

यह मेरे लिए काम करता है :) primefaces पी एस मैं उपयोग कर रहा था 2.2

+1

धन्यवाद। प्रत्येक जेएसएफ के नए संस्करणों के लिए, http://showcase.omnifaces.org/taghandlers/massAttribute जांचें वास्तव में यह है, लेकिन अधिक लचीला और बिना अपने कोड के ... – Kukeltje

0

Omnifaces एक massAttribute taghandler है इसके लिए कई विकल्पों के साथ। एक यह है कि आप क्या जरूरत के लिए बंद कर दिया आता

<o:massAttribute name="disabbled" value="true" target="javax.faces.component.UIInput"> 
    <h:outputLabel for="input1" /> 
    <h:inputText id="input1" /> 
    <h:outputLabel for="input2" /> 
    <h:inputText id="input2" /> 
    <h:outputLabel for="input3" /> 
    <h:inputText id="input3" /> 
</o:massAttribute> 

यह सभी घटक है कि javax.faces.component.UIInput से विस्तार अक्षम करता है।