Xpages 文件下载控件排序列
Xpages File Download Control sort column
我想让一个文件下载控件在顶部显示带有最新(最新)创建日期的附件。默认显示最新的最后一个。
<xp:fileDownload rows="30" id="FD"
displayLastModified="false" value="#{document1.files}"
style="width:98%" hideWhen="false"
displayType="true" allowDelete="false" displayCreated="true">
</xp:fileDownload>
目前没有更好的答案,我会 post 一个。
实际上,<xp:fileDownload>
组件按照文件附件在文档的富文本字段中的显示顺序列出文件附件,而不是最新的最后一个:
您无法使用任何属性更改此行为,因此一种可能的方法是获取附件列表,根据需要对其进行排序,然后将排序后的列表提供给 <xp:repeat>
组件,您可以在其中绘制与 <xp:fileDownload>
显示的附件 table 略有不同甚至没有区别的附件。这并不难,只需在浏览器调试工具中查看创建的 HTML 标记,然后在 <xp:repeat>
.
中重新创建它
假设您在页面上声明了 dominoData
:
<xp:this.data>
<xp:dominoDocument var="document1"
documentId="9CAA72D47AEA7C8D462582FB005AB525"
action="openDocument" />
</xp:this.data>
然后在 <xp:repeat>
所在的位置创建 <xp:panel>
。为您的面板创建 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
文件属性使用声明的比较器(见下面的更新)对列表进行排序,return 排序列表为attachments
变量。
然后您创建 <xp:repeat>
并将其嵌套在 <xp:panel>
中 <xp:dataContexts>
之后。将 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>
这是 <xp:repeat>
与 <xp:fileDownload>
相比的输出结果:
只需创建看起来像 fileDownload
的 table 的标记即可。
Update
值得努力创建一个请求范围内的托管 Bean,它将用作比较器,而不是在 SSJS 代码块内实现一些好的排序算法。
在某些现有或新包下的 Code/Java 文件夹中创建一个 Java class。如果包名称是例如com.benway.util
并且 class 名称是 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());
}
}
将新的 class 注册为 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>
现在你真的大功告成了:)
我想让一个文件下载控件在顶部显示带有最新(最新)创建日期的附件。默认显示最新的最后一个。
<xp:fileDownload rows="30" id="FD"
displayLastModified="false" value="#{document1.files}"
style="width:98%" hideWhen="false"
displayType="true" allowDelete="false" displayCreated="true">
</xp:fileDownload>
目前没有更好的答案,我会 post 一个。
实际上,<xp:fileDownload>
组件按照文件附件在文档的富文本字段中的显示顺序列出文件附件,而不是最新的最后一个:
您无法使用任何属性更改此行为,因此一种可能的方法是获取附件列表,根据需要对其进行排序,然后将排序后的列表提供给 <xp:repeat>
组件,您可以在其中绘制与 <xp:fileDownload>
显示的附件 table 略有不同甚至没有区别的附件。这并不难,只需在浏览器调试工具中查看创建的 HTML 标记,然后在 <xp:repeat>
.
假设您在页面上声明了 dominoData
:
<xp:this.data>
<xp:dominoDocument var="document1"
documentId="9CAA72D47AEA7C8D462582FB005AB525"
action="openDocument" />
</xp:this.data>
然后在 <xp:repeat>
所在的位置创建 <xp:panel>
。为您的面板创建 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
文件属性使用声明的比较器(见下面的更新)对列表进行排序,return 排序列表为attachments
变量。
然后您创建 <xp:repeat>
并将其嵌套在 <xp:panel>
中 <xp:dataContexts>
之后。将 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>
这是 <xp:repeat>
与 <xp:fileDownload>
相比的输出结果:
只需创建看起来像 fileDownload
的 table 的标记即可。
Update
值得努力创建一个请求范围内的托管 Bean,它将用作比较器,而不是在 SSJS 代码块内实现一些好的排序算法。
在某些现有或新包下的 Code/Java 文件夹中创建一个 Java class。如果包名称是例如com.benway.util
并且 class 名称是 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());
}
}
将新的 class 注册为 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>
现在你真的大功告成了:)