【问题标题】:Xpages File Download Control sort columnXpages 文件下载控件排序列
【发布时间】:2018-08-30 18:39:49
【问题描述】:

我想让一个文件下载控件在顶部显示带有最新(最新)创建日期的附件。默认是显示最新的最后一个。

<xp:fileDownload rows="30" id="FD"
    displayLastModified="false" value="#{document1.files}"
    style="width:98%" hideWhen="false"
    displayType="true" allowDelete="false" displayCreated="true">
</xp:fileDownload>

【问题讨论】:

    标签: file download controls xpages


    【解决方案1】:

    由于目前没有更好的答案,我会在这里发布一个。

    实际上,&lt;xp:fileDownload&gt; 组件列出文件附件的顺序是它们出现在文档的富文本字段中,而不是最新的最后一个:

    您无法使用任何属性更改此行为,因此一种可能的方法是获取附件列表,按照您的需要对其进行排序,然后将排序后的列表提供给&lt;xp:repeat&gt; 组件,您可以在其中绘制与&lt;xp:fileDownload&gt; 显示的内容略有不同甚至没有差异的附件表。这并不难,只需在浏览器调试工具中查看创建的 HTML 标记,然后在 &lt;xp:repeat&gt; 中重新创建即可。

    假设您在页面上声明了dominoData

    <xp:this.data>
        <xp:dominoDocument var="document1"
            documentId="9CAA72D47AEA7C8D462582FB005AB525"
            action="openDocument" />
    </xp:this.data>
    

    然后创建您的&lt;xp:repeat&gt; 所在的&lt;xp:panel&gt;。为您的面板创建dataContext

    <xp:panel>
        <xp:this.dataContexts>
            <xp:dataContext var="attachments">
                <xp:this.value><![CDATA[
                    #{javascript:
                        var sourceList:java.util.List = document1.getAttachmentList('files');
                        if (sourceList.size() == 0) {
                            return sourceList;
                        }
                        java.util.Collections.sort(sourceList, createdComparator);
                        return sourceList;
                    }
                ]]></xp:this.value>
            </xp:dataContext>
        </xp:this.dataContexts>
    </xp:panel>
    

    您会在此处获得com.ibm.xsp.model.domino.wrapped.DominoDocument.AttachmentValueHolder 对象的列表,然后使用created 文件属性使用声明的比较器(请参阅下面的更新)对列表进行排序,并将排序后的列表作为attachments 变量返回。

    然后创建&lt;xp:repeat&gt; 并将其嵌套在&lt;xp:panel&gt;&lt;xp:dataContexts&gt; 之后。将dataContext 的变量名作为value 给它:

    <xp:repeat value="#{attachments}" var="attachment">
        <xp:text value="#{attachment.type}" />
        <xp:label value=" - " />
        <xp:text>
            <xp:this.value><![CDATA[
                #{javascript:
                    var rawSize = attachment.getLength();
                    return (rawSize < 1024 ? 1 : (rawSize / 1024).toFixed(0)) + " KB";
                }
            ]]></xp:this.value>
        </xp:text>
        <xp:label value = " - " />
        <xp:link text="#{attachment.name}" value="#{attachment.href}" />
        <xp:label value = " - " />
        <xp:text>
            <xp:this.value>
                #{javascript:
                    return new java.util.Date(attachment.getCreated());
                }
            </xp:this.value>
            <xp:this.converter>
                <xp:convertDateTime type="both" timeStyle="short" />
            </xp:this.converter>
        </xp:text>
        <xp:br />
    </xp:repeat>
    

    这是&lt;xp:repeat&gt; 输出与&lt;xp:fileDownload&gt; 相比的结果:

    只需创建类似于fileDownload 的表的标记,就完成了。

    更新

    值得努力创建一个请求范围的托管 Bean,它将充当比较器,而不是在 SSJS 代码块中实现一些好的排序算法。

    在某个现有或新包下的 Code/Java 文件夹中创建一个 Java 类。如果包名称是例如com.benway.util,类名是CreatedComparator

    package com.benway.util;
    
    import java.util.Comparator;
    import com.ibm.xsp.model.FileRowData;
    
    public class CreatedComparator implements Comparator<FileRowData> {
    
        public int compare(FileRowData file1, FileRowData file2) {
            if (file1 == null || file2 == null) return 0;
            return (int)(file2.getCreated() - file1.getCreated());
        }
    }
    

    faces-config.xml 中将您的新类注册为托管 bean:

    <?xml version="1.0" encoding="UTF-8"?>
    <faces-config>
        <managed-bean>
            <managed-bean-name>createdComparator</managed-bean-name>
            <managed-bean-class>
                com.benway.util.CreatedComparator
            </managed-bean-class>
            <managed-bean-scope>request</managed-bean-scope>
        </managed-bean>
        ...etc...
    </faces-config>
    

    现在你真的完成了:)

    【讨论】:

    • 这看起来是一个很好的解决方案,但我在视图面板上走得太远了。有太多其他程序化的东西相关。在下一个项目中,我会按照你的方式进行。
    猜你喜欢
    • 2012-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多