0

我修改了 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",""));
    }

我的目标是仅当用户选择 Other 时才显示文本区域。此外,如果用户选择其他,则文本区域应该是必填字段。我怎样才能做到这一点?我也想尝试使用单选按钮而不是选择。

[编辑] 对于那些不熟悉 DSpace 的人,这是我从 DSpace github 修改的原始代码:反馈表

4

2 回答 2

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实例变量包含 cocoon in 给它的参数/aspects/ArtifactBrowser/sitemap.xmap

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

以及您希望查看的所有其他字段也是如此commentemail也应该在那里执行必填字段。

于 2014-09-23T12:27:52.230 回答
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 其他是公开的!;)

于 2014-09-21T05:44:54.590 回答