对于我的应用程序,我希望拥有不同权限的用户。一个权限允许用户查看我的数据库中的数据,而另一个权限允许他们编辑数据。在登录时,我会检查他们的许可,以确定他们是否可以编辑数据。如果用户具有只读权限,我正在寻找一些方法来禁用整个页面。是否有一种简单的方法可以禁用<h:form>
标记内的所有内容?我需要能够禁用多个页面,希望通过查看supbean中的一个布尔值来实现。任何帮助将不胜感激。
CNC中
是否有任何容器或类似物可以包裹我的输入可以设置为禁用?这样我只需要在一个地方引用diable,并且如果我在其他逻辑中需要它,还可以让每个字段设置自己的disable属性吗?
答案 0 :(得分:6)
您可以禁用按钮,链接,输入字段(允许编辑的所有内容)等...将它们全部指向辅助bean中的相同值。
<h:inputText disabled="#{!bean.permissionToWrite}">
我不知道如何禁用表单中包含的所有内容,但您可能不希望这样做,因为您可能希望用户提交带有表单的搜索查询(即搜索框)。
更新:回答Alex Larzelere的评论。
在这种情况下,恕我直言最好使用disabled
而不是rendered
,因为您可能希望在inputText
框中向用户显示字段的值,但不要让他修改它。如果你不渲染它,他就看不到它。您也可以使用outputText
来显示它,但是您必须维护两个元素而不是一个元素。
更新回答问题中的修改:
例如,您可以将组件包装在h:panelGroup
内并根据您的逻辑进行渲染,但是您无法禁用h:panelGroup
内部的输入字段,您必须单独执行此操作
答案 1 :(得分:5)
这个简单的自定义组件可用于包装其他组件,如果使用属性disabled =“true”或EL表达式评估为true,它将禁用它们。它的工作方式是,如果已经禁用了一个包装的组件,那么如果使用disablePanel(或者ajax重新呈现)且disabled =“true”,它将不会被启用。该组件仅尝试禁用UIInput&amp; 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>
答案 2 :(得分:0)
Tomahawk的大多数组件都有displayValueOnly,visibleOnUserRole和enabledOnUserRole属性来控制元素的可见性。
希望以下链接对您有用:
答案 3 :(得分: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());
}
}
然后你可以在你的bean中使用。这是一个包含3个scrollPanel的页面示例,我只想禁用panel1和panel3:
@PostConstruct
public void init() {
super.init();
if(userHasPermissions() || loadPageInReadOnly()) {
Utils.disableUIComponent(":form:panel1");
Utils.disableUIComponent(":form:panel3");
}
}
它对我有用:) P.S我正在使用primefaces 2.2
答案 4 :(得分:0)
Omnifaces有一个massAttribute
标记处理程序,有几个选项。关闭你所需要的是
<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
扩展的所有组件。
答案 5 :(得分:-1)
如果要对性能进行检查,请使用JQuery。 使用表单set disabled属性中的所有元素的prop属性为true。
$(document).ready(function(){
$("#formName :input").prop("disabled", true);
});
您也可以在此处使用支持bean的布尔属性。例如
$(document).ready(function(){
if(#{bean.property} === true)
$("#formName :input").prop("disabled", true);
});