我修改了dspace代码的反馈表单,添加了一个类别,用于询问用户的用户类型'。
Select category = form.addItem().addSelect("category");
category.setLabel("Please select your category");
category.addOption("UG","Undergraduate/BS");
category.addOption("MS","MS Student");
category.addOption("PHD","PhD Student");
category.addOption("FAC","Faculty");
category.addOption("RES","Researcher");
category.addOption("TRA","Trainee");
category.addOption("BUS","Businessman/Private");
category.addOption("FF","Fish farmer");
category.addOption("OT","Other");
String itemSelected = parameters.getParameter("category","");
if (StringUtils.equals(itemSelected,"OT"))
{
TextArea other = form.addItem().addTextArea("other");
other.setHelp("Write here if you selected Other");
other.setValue(parameters.getParameter("other",""));
}
我的目标是仅在用户选择其他时显示文字区域。此外,如果用户选择其他字段,则文本区域应为必填字段。我怎样才能做到这一点?我还想尝试使用单选按钮而不是选择。
[编辑]对于那些不熟悉DSpace的人,这里是我从DSpace github修改的原始代码:feedback form
答案 0 :(得分:3)
您可以像使用选择一样使用单选按钮:
Radio category = form.addItem().addRadio("category");
category.setLabel("Please select your category");
category.addOption("UG", "Undergraduate/BS");
...
就像terrywb所说,java代码呈现页面服务器端。您可以进行两步处理,其中第一步仅提交类别。但是默认包含隐藏的TextArea然后使用javascript显示它更加用户友好。
Item item = form.addItem("item-name","hidden");
TextArea other = item.addTextArea("other");
在PageMeta中添加对javascript文件的引用:
public void addPageMeta(PageMeta pageMeta) throws SAXException,
WingException, UIException, SQLException, IOException,
AuthorizeException
{
pageMeta.addMetadata("javascript", "static", null, true).addContent("static/js/feedbackform.js");
// leave the rest
...
}
将javascript放在/dspace/modules/xmlui/src/main/webapp/static/js/feedbackform.js
中,以便可以投放。
同样parameters.getParameter("category","");
无法开箱即用。 parameters
实例变量包含/aspects/ArtifactBrowser/sitemap.xmap
中的cocoon给它的参数:
<map:match pattern="feedback">
<map:act type="SendFeedbackAction">
<map:transform type="FeedbackForm">
<map:parameter name="comments" value="{comments}"/>
<map:parameter name="email" value="{email}"/>
<map:parameter name="page" value="{page}"/>
</map:transform>
<map:serialize type="xml"/>
</map:act>
<map:transform type="FeedbackSent"/>
<map:serialize type="xml"/>
</map:match>
SendFeedbackAction
从请求中获取数据:
Request request = ObjectModelHelper.getRequest(objectModel);
String page = request.getParameter("page");
并通过将{page}
添加到它返回的地图中来提供 // Check all data is there
if ((address == null) || address.equals("")
|| (comments == null) || comments.equals(""))
{
// Either the user did not fill out the form or this is the
// first time they are visiting the page.
Map<String,String> map = new HashMap<String,String>();
map.put("page",page);
...
return map;
的值:
comment
email
,{{1}}以及您希望看到的所有其他字段也是如此。
在那里也应该执行必要的字段。
答案 1 :(得分:0)
如果我是你,我会使用JTextArea而不是TextArea ......
public void valueChanged(ListSelectionEvent e) {
if ( e.getSource() == item) { /*Item is whatever the selected choice you want is*/ ) {
other.setVisible(true);
} else {
other.setVisible(false);
}
}
确保您的类扩展了ActionListener! 那个JTextArea其他是公开的! ;)